2010-07-11 47 views
3

我正在編寫一個提供H.264編碼的MP4視頻的網絡應用程序。在Chrome和Safari中,它通過HTML5視頻標籤完成此操作。爲什麼PHP會干擾我的HTML5 MP4視頻?

爲了控制訪問這些視頻,其內容是通過PHP使用真正簡單的機制提供:

header('Content-type: video/mp4'); 
readfile($filename); 
exit; 

不管我做什麼,該視頻將不會流。此外:

  • 如果我更改源代碼以直接提供文件,使用相同的視頻標記,但鏈接到沒有PHP傳遞的視頻的Apache服務副本,流式傳輸工作正常。
  • 即使流式傳輸無法正常工作,我總是可以右鍵單擊灰色的HTML5播放器並通過PHP傳遞下載文件,並且播放效果非常好。

任何想法?我正在拉我的頭髮!

回答

7

也許吧。嘗試還加入了內容長度標題:

header('Content-length: '.filesize($filename)); 

如果這仍然不起作用,(<?phpecho的或空格)之前readfile檢查任何輸出。還請檢查?>之後是否沒有空格,或者乾脆省略?>(如果以後沒有任何內容,則不是必需的)。

由於布魯諾提到,爲了支持流式傳輸,您還需要遵守Range標頭。這裏是一個簡單的例子,只尊重左邊界:

if (empty($_SERVER["HTTP_RANGE"])) { 
    //do your current stuff... 
} 
else { //violes rfc2616, which requires ignoring the header if it's invalid 
    preg_match("/^bytes=(\d+)-/i",$_SERVER["HTTP_RANGE"], $matches); 
     $offset = (int) $matches[1]; 
    if ($offset < $filesize && $offset >= 0) { 
     if (@fseek($fp, $offset, SEEK_SET) != 0) 
      die("err"); 
     header("HTTP/1.1 206 Partial Content"); 
     header("Content-Range: bytes $offset-".($filesize - 1)."/$filesize"); 
    } 
    else { 
     header("HTTP/1.1 416 Requested Range Not Satisfiable"); 
     die(); 
    } 
     //fread in loop here 
} 
+0

我猜你的意思是'內容Length',而不是'內容size' – Bruno 2010-07-11 11:00:27

+0

@Bruno你說得對。謝謝! – Artefacto 2010-07-11 11:11:29

0

查看評論!

使用readfile不推薦用於流視頻文件,因爲它在輸出之前將整個文件加載到內存中。這會導致內存耗盡的嚴重問題。

嘗試讀取並按塊輸出文件塊。

+1

這是不正確的。事實上,這是最有效的方式(使用PHP並且不包括'virtual')。我不知道你有什麼想法。 – Artefacto 2010-07-11 11:14:52

+0

你能指出一些參考嗎?因爲有很多參考文獻反對。示例:http://teddy.fr/blog/how-serve-big-files-through-php – zaf 2010-07-11 13:15:37

+0

另一個http://coding.derkeiler.com/Archive/PHP/php.general/2006-10/msg00708。html – zaf 2010-07-11 13:20:08

0

將文件流式傳輸到HTML5嵌入式視頻播放器時,您仍然需要添加標題,以通知播放器關於視頻的信息。

你不能只是期望運行一個讀取readfile()命令,事情會神奇地工作,抱歉芽,但編程並不容易。 (希望是)。

繼承人一個小的應用程序,您可以用來流正常或只是從中學習。

http://stream.xmoov.com/download/xmoov-php/