天涯论坛

 找回密码
 立即注册
搜索
查看: 19|回复: 1

php从远程URL获取(mp4 mp3)音视频的流媒介数据

[复制链接]

3032

主题

312

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99099078
发表于 2024-11-1 15:11:49 | 显示全部楼层 |阅读模式
/** * 从远程URL中获取媒介(如 mp4 mp3)的内容 * @param mixed $file_url * @param mixed $media_type * @param mixed $curl_time_out * @throws Exception * @return mixed */ public static function getRemoteMediaContent($file_url = , $media_type = "Content-Type: video/mp4", $curl_time_out =600000) { if (empty($file_url)) { throw new Exception(请传入远程url位置, Response:ARAM_ERROR); } $parse_bool = parse_url($file_url); if($parse_bool ===false) { throw new Exception(请传入有效的远程url位置, Response:ARAM_ERROR); } ini_set(max_execution_time, 0); $useragent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36"; //开一个ch 用来获取资源HTTP头信息(重点获取视频长度) $ch = curl_init(); // TRUE 会输出所有的信息,写入到STDERR,或在CURLOPT_STDERR中指定的文件。 curl_setopt($ch, CURLOPT_VERBOSE, 1); //准许 cURL 函数执行的最长秒数curl_setopt($ch, CURLOPT_TIMEOUT, $curl_time_out);//需要获取的 URL 位置能够在curl_init() 初始化会话的时候 curl_setopt($ch, CURLOPT_URL, $file_url); //TRUE 时将会按照服务器返回 HTTP 头中的 "Location: " 重定向。 //(重视:这是递归的,"Location: " 发送几次就重定向几次,除非设置了 CURLOPT_MAXREDIRS,限制最大重定向次数。)。 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 启用时会将头文件的信息做为数据流输出(重视这儿第1步只需要获取资源HTTP头信息 重点是为了得到内容的长度) curl_setopt($ch, CURLOPT_HEADER, true); // TRUE 强制获取一个新的连接,而不是缓存中的连接 curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); // FALSE 禁止 cURL 验证对等证书(peerscertificate)。要验证的交换证书能够在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //向服务器发送,包括拜访者系统引擎版本、浏览器信息的字段信息。 //通常服务器识别出是爬虫请求,会拒绝拜访因此此时设置User-Agent,能够将爬虫伪装成用户经过浏览器拜访 curl_setopt($ch, CURLOPT_USERAGENT, $useragent); // TRUE 时将不输出 BODY 部分。同期 Mehtod 变成为了 HEAD。修改为 FALSE 时不会变成 GET curl_setopt($ch, CURLOPT_NOBODY, true); //TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出 //这儿咱们不需要关心 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //执行 cURL 会话 这儿咱们只关心头信息 因此不需要获取返回的内容 curl_exec($ch); //获取一个cURL连接资源句柄的信息 这儿重点用来读取长度 //-- CURLINFO_CONTENT_LENGTH_DOWNLOAD 从Content-Length: field中读取的下载内容长度$filesize = $length = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);//发送请求的媒介头类型 header($media_type); //------ 获取资源长度告一段落 以下用于获取媒介视频的二进制内容------ //总共接收的数据体积header("Content-length: " . $filesize); //接收的数据类型是 字节类型 即二进制 header(Accept-Ranges: bytes); $partialContent = false; $offset = 0; //读取数据的初始位置 if (isset($_SERVER[HTTP_RANGE])) { $partialContent = true; //得到初始位置和数据长度 preg_match(/bytes=(\d+)-(\d+)?/, $_SERVER[HTTP_RANGE], $matches); $offset = intval($matches[1]); $length = $filesize - $offset - 1; /*** 断点续传: 便是从文件上次中断的地区起始重新下载或上传,当下载或上传文件的时候,倘若实现断点续传功能,那样每次显现反常用户主动的暂停,都会去重头下载, 这般很浪费时间。因此断点续传的功能就应运而生了。要实现断点续传的功能,需要客户端记录下当前的下载或上传进度, 并在需要续传的时候通告服务端这次需要下载或上传的内容片段。 HTTP的请求上定义了断点续传关联的HTTP头Range字段和Content-Range字段。 例如说客户端在Header中设置Range=bytes22223333- 暗示文件从22223333字节起始传,前面的字节不消传了。 服务器收到请求,返回206 Partial Content。 Content-Length=44445555,Content-Range=bytes22223333-44445554/44445555 */ //Chrome在针对MP3文件的拜访,返回的都是206 Partial Content header(HTTP/1.1 206 Partial Content); //每次接收数据的的范围 header(Content-Range: bytes . $offset . - . ($offset + $length) . / . $filesize); } //重新开一个ch 用来获取内容 $ch = curl_init(); //倘若支持分段发送数据 if ($partialContent && isset($_SERVER[HTTP_RANGE])) { //获取上次的范围 preg_match(/bytes=(\d+)-(\d+)?/, $_SERVER[HTTP_RANGE], $matches); $offset = intval($matches[1]); //起始位置$length = $filesize - $offset -1; //获取长度 //发送带有Range的请求头 $headers = [Range: bytes= . $offset . -. ($offset + $length) . ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } curl_setopt($ch, CURLOPT_VERBOSE,1); curl_setopt($ch, CURLOPT_TIMEOUT, $curl_time_out); curl_setopt($ch, CURLOPT_URL, $file_url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true); // 启用时会将头文件的信息做为数据流输出(这儿只需要获取内容 因此设置为false) curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_FRESH_CONNECT,true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_USERAGENT, $useragent); // TRUE 时将不输出 BODY 部分。同期 Mehtod 变成为了 HEAD。修改为 FALSE 时不会变成 GET [ 这儿咱们不需要输出头信息] curl_setopt($ch, CURLOPT_NOBODY, false); // TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出 //这儿我们需要直接输出二进制数据 curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); //执行 cURL 会话 curl_exec($ch); }




上一篇:怎么样用网盘快速分享文件?
下一篇:外链和内链难道不重要?我来带你重新认识外链和内链
回复

使用道具 举报

3047

主题

3万

回帖

9606万

积分

论坛元老

Rank: 8Rank: 8

积分
96065852
发表于 2024-11-8 14:09:25 | 显示全部楼层
软文发布论坛开幕式圆满成功。 http://www.fok120.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 00:06 , Processed in 0.146940 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.