PHP 输出视频流 在线视频读取 隐藏真实播放地址 兼容ios 设备 UC浏览器等
生活随笔
收集整理的這篇文章主要介紹了
PHP 输出视频流 在线视频读取 隐藏真实播放地址 兼容ios 设备 UC浏览器等
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
廢話不多說?直接上代碼?這個是支持在線讀取遠程視頻文件的,分段讀取?已測試支持ios?及ios?uc瀏覽器,代碼中的算法還可以優化,需要的朋友?請自行修改,視頻地址可能會失效,到時候換成你需要的就行了。
該帶碼經過測試,在2h2g?的服務器上支持多人在線觀看,同時不消化內存(具體多少人自行測試吧。免得說我忽悠你)。
這里小小的說明一下?代碼中是通過?curl?攜帶請求頭?Range:bytes={$start}-{$end}? 去分段讀取視頻流的,而并非一次性讀取,這樣服務器內存會炸掉。同時在輸出視頻流的前提下?header?要對,否則瀏覽器無法正確讀取,這里無法正確讀取主要是ios?uc?瀏覽器標準嚴格,一旦有一個錯了就會播放不出來。
每次加載大小為5M?支持隨意快進,當然加載速度快慢取決于你的服務器,我用的是國外的服務器做的測試
?
如果您需要的是?讀取本地視頻文件的方法可以查看我的另外一篇博文
https://blog.csdn.net/qq_40729514/article/details/104194963
本代碼為原創,轉載請注明版權,請珍惜作者勞動成果,擁抱開源!
如果我的內容對您有所幫助,請點贊支持,謝謝!
<?php #作者:APan #時間:2020-09-15 #文章地址:https://blog.csdn.net/qq_40729514 #轉載請注明版權,尊重作者成果ini_set('memory_limit', '1024M'); //修改腳本的最大運行內存 set_time_limit(600); //設置超時限制為 10分鐘//輸出視頻流 function outPutStream($videoUrl) {if(!$videoUrl){header('HTTP/1.1 500 Internal Server Error');echo "Error: Video cannot be played !";exit();}//獲取視頻大小$header_array = get_headers($videoUrl, true);$sizeTemp = $header_array['Content-Length'];if (is_array($sizeTemp)) {$size = $sizeTemp[count($sizeTemp) - 1];} else {$size = $sizeTemp;}//初始參數$start = 0;$end = $size - 1;$length = $size;$buffer = 1024 * 1024 * 5; // 輸出的流大小 5m//計算 Range$ranges_arr = array();if (isset($_SERVER['HTTP_RANGE'])) {if (!preg_match('/^bytes=\d*-\d*(,\d*-\d*)*$/i', $_SERVER['HTTP_RANGE'])) {header('HTTP/1.1 416 Requested Range Not Satisfiable');}$ranges = explode(',', substr($_SERVER['HTTP_RANGE'], 6));foreach ($ranges as $range) {$parts = explode('-', $range);$ranges_arr[] = array($parts[0], $parts[1]);}$ranges = $ranges_arr[0];$start = (int)$ranges[0];if ($ranges[1] != '') {$end = (int)$ranges[1];}$length = min($end - $start + 1, $buffer);$end = $start + $length - 1;}else{// php 文件第一次瀏覽器請求不會攜帶 RANGE 為了提升加載速度 默認請求 1 個字節的數據$start=0;$end=1;$length=2;}//添加 Range 分段請求$header = array("Range:bytes={$start}-{$end}");#發起請求$ch2 = curl_init();curl_setopt($ch2, CURLOPT_URL, $videoUrl);curl_setopt($ch2, CURLOPT_TIMEOUT, 60);curl_setopt($ch2, CURLOPT_HTTPHEADER, $header);//設置讀取的緩存區大小curl_setopt($ch2, CURLOPT_BUFFERSIZE, $buffer);// 關閉安全認證curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch2, CURLOPT_SSL_VERIFYHOST, false);//追蹤返回302狀態碼,繼續抓取curl_setopt($ch2, CURLOPT_HEADER, false);curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);curl_setopt($ch2, CURLOPT_CONNECTTIMEOUT, 60);curl_setopt($ch2, CURLOPT_NOBODY, false);curl_setopt($ch2, CURLOPT_REFERER, $videoUrl);//模擬來路curl_setopt($ch2, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.44");$content = curl_exec($ch2);curl_close($ch2);#設置響應頭header('HTTP/1.1 206 PARTIAL CONTENT');header("Accept-Ranges: bytes");header("Connection: keep-alive");header("Content-Type: video/mp4");header("Access-Control-Allow-Origin: *");//為了兼容 ios UC這類瀏覽器 這里加個判斷 UC的 Content-Range 是 起始值-總大小減一if($end!=1){$end=$size-1;}header("Content-Range: bytes {$start}-{$end}/{$size}");//設置流的實際大小header("Content-Length: ".strlen($content));//清空緩存區ob_clean();//輸出視頻流echo $content;//銷毀內存unset($content); }#輸出視頻流 視頻地址可能失效,您可以換成你的來測試 outPutStream("https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4"); die(); ?>?
總結
以上是生活随笔為你收集整理的PHP 输出视频流 在线视频读取 隐藏真实播放地址 兼容ios 设备 UC浏览器等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Antenna Magus,值得推荐的2
- 下一篇: mt cityId列表判断