为啥 PHP 会干扰我的 HTML5 MP4 视频?

Posted

技术标签:

【中文标题】为啥 PHP 会干扰我的 HTML5 MP4 视频?【英文标题】:Why is PHP interfering with my HTML5 MP4 video?为什么 PHP 会干扰我的 HTML5 MP4 视频? 【发布时间】:2011-03-14 10:51:22 【问题描述】:

我正在编写一个提供 H.264 编码 MP4 视频的网络应用程序。在 Chrome 和 Safari 中,它通过 html5 视频标签来实现。

为了控制对这些视频的访问,它们的内容是通过 php 使用一种非常简单的机制提供的:

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

无论我做什么,视频都不会流式传输。另外:

如果我更改源代码以直接提供文件,使用相同的视频标签,但链接到 Apache 提供的视频副本,没有 PHP 传递,流式处理工作正常。 即使流式传输不起作用,我也可以随时右键单击灰显的 HTML5 播放器并通过 PHP 直通下载文件 - 离线播放效果很好。

有什么想法吗?我要拔头发了!

【问题讨论】:

【参考方案1】:

也许吧。尝试添加内容长度标题:

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

如果这仍然不起作用,请检查readfile 之前的任何输出(echo<?php 之前的空格)。还要检查?> 之后是否没有空格,或者干脆省略?>(如果后面什么都没有,则不是强制性的)。

正如 Bruno 所说,要支持流式传输,您还需要遵守 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

【讨论】:

我猜你的意思是Content-Length而不是Content-size【参考方案2】:

将文件流式传输到 HTML5 嵌入式视频播放器时,您仍然需要添加标题,以告知播放器有关视频的信息。

你不能仅仅期望运行一个读取readfile() 命令,事情就会神奇地工作,对不起,老兄,但编程并不是那么容易。 (希望是)。

这是一个小应用程序,您可以使用它来正确进行流式传输或从中学习。

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

【讨论】:

【参考方案3】:

见 cmets!

不推荐使用 readfile 流式传输视频文件,因为它会在输出之前将整个文件加载到内存中。这会导致内存耗尽的严重问题。

尝试逐块读取和输出文件。

【讨论】:

这不是真的。事实上,这是最有效的方法(使用 PHP 并排除 virtual)。我不知道你从哪里想到的。 你能指出一些参考资料吗?因为有很多反对的参考资料。示例:teddy.fr/blog/how-serve-big-files-through-php 还有一个coding.derkeiler.com/Archive/PHP/php.general/2006-10/… @zaf readfile 实现 calls php_stream_passthru,如果可能,它使用 nmmap,否则一次循环 8192 个字节(参见 here)。 @Artefacto 直奔源头!我错了,感谢您启发我(希望其他人)。

以上是关于为啥 PHP 会干扰我的 HTML5 MP4 视频?的主要内容,如果未能解决你的问题,请参考以下文章

为啥webkit浏览器在播放前需要下载整个html5视频(mp4)?

使用 FFMPEG 的 PHP HTML5 兼容 MP4 视频

通过 PHP fpassthru() 加载 mp4/webm 的 Chrome HTML5 视频:无法设置 currentTime?

仅播放音频的 video/mp4 类型的 HTML5 视频

HTML5 .mp4 视频 - IE 问题 - 将白色变为灰色

视频文件转换为 .mp4 后不显示