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

Ben*_*ler 4 php html5 mp4 http html5-video

我正在编写一个服务于H.264编码的MP4视频的网络应用程序.在Chrome和Safari中,它通过HTML5视频标记完成此操作.

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

header('Content-type: video/mp4');
readfile($filename);
exit;
Run Code Online (Sandbox Code Playgroud)

无论我做什么,视频都不会播放.另外:

  • 如果我更改源代码直接提供文件,使用相同的视频标签,但链接到没有PHP传递的Apache服务的视频副本,流式传输工作正常.
  • 即使流媒体不起作用,我总是可以直接点击灰色的HTML5播放器并通过PHP传递下载文件 - 它可以很好地离线播放.

有任何想法吗?我把头发拉出来!

Art*_*cto 7

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

header('Content-length: '.filesize($filename));
Run Code Online (Sandbox Code Playgroud)

如果这仍然不起作用,请检查之前的输出readfile(echo's或之前的空格<?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
}
Run Code Online (Sandbox Code Playgroud)