使用PHP輸出視頻流的一個坑


前幾天用 PHP 做了一個輸出視頻流的接口,本地測試的時候一切OK,但是到了測試服務器之后視頻在前端播放器中就出錯了:

開始以為是服務器視頻目錄不正確,又懷疑是 header 頭信息,又懷疑 MP4 視頻編碼,又檢查目錄權限……各種能想到的問題都試了,還是沒能解決這個問題。但是單獨訪問服務器視頻又可以正常播放,后來在 Firefox 的調試窗口對比兩者到底有什么差異,終於在響應那一欄發現了些許不同:

兩者的差別就在於多出來的 “77u/” 的這四個字符,經各種百度最終播放的問題算是解決了。其實就是在 PHP 輸出視頻之前前加了一個緩沖區過濾輸出:

private function PutMovie($file) {
        ini_set('memory_limit','512M');
        header("Content-type: video/mp4");
        header("Accept-Ranges: bytes");

        ob_start();    // ------ 開啟緩沖區
        $size = filesize($file);

        if(isset($_SERVER['HTTP_RANGE'])){        
            header("HTTP/1.1 206 Partial Content");
            list($name, $range) = explode("=", $_SERVER['HTTP_RANGE']);
            list($begin, $end) =explode("-", $range);
            if($end == 0) $end = $size - 1;
        }
        else {
            $begin = 0; $end = $size - 1;
        }

        header("Content-Length: " . ($end - $begin + 1));
        header("Content-Disposition: filename=".basename($file));
        header("Content-Range: bytes ".$begin."-".$end."/".$size);

        try {
            $fp = fopen($file, 'r');
        } catch (\Exception $e) {
            echo $e->getTraceAsString();exit;
        }
        fseek($fp, $begin);
        $contents = '';

        while(!feof($fp)) {
            $p = min(1024, $end - $begin + 1);
            //$begin += $p;
            $contents .= fread($fp, $p);
            //echo fread($fp, $p);
        }
        //$contents = ltrim($contents, "\XEF\XBB\XBF");
        ob_end_clean();            // ------ 清除緩沖區 
        ob_clean();        
        //$contents = substr($contents, 3);
        fclose($fp);

        exit($contents);
}

造成這個問題的原因大概與 PHP 無法識別 UTF8 BOM 頭有關(但其實我的 PHP 文件都是不帶 BOM 頭的),關於 BOM 的文章隨便百度一下就有很多。具體的原因呢我也懶得去研究了,太折騰人了 ! -_-

另外,還有文章說大部分瀏覽器只支持 H264(也被稱作 AVC)編碼格式的 MP4 文件,而不支持 MPEG-4 編碼的視頻。可以使用 MediaInfo 這個軟件去查看視頻的編碼信息:

如果紅圈那里顯示的是 MPEG-4 Visual,那么此視頻很有可能在網頁里也無法正常播放。用視頻轉換器轉一下格式即可:

參考:

https://www.cnblogs.com/wt645631686/p/6868826.html

https://blog.csdn.net/qq_16885135/article/details/54427532


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM