2010-07-11 104 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/