前幾天用 PHP 作了一個輸出視頻流的接口,本地測試的時候一切OK,可是到了測試服務器以後視頻在前端播放器中就出錯了:html
開始覺得是服務器視頻目錄不正確,又懷疑是 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 這個軟件去查看視頻的編碼信息:ide
若是紅圈那裏顯示的是 MPEG-4 Visual,那麼此視頻頗有可能在網頁裏也沒法正常播放。用視頻轉換器轉一下格式便可:測試
參考:編碼