4

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

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

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

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

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

有任何想法吗?我要拔头发了!

4

3 回答 3

7

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

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

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

正如布鲁诺所说,要支持流式传输,您还需要遵守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
}
于 2010-07-11T10:11:57.947 回答
0

看评论!

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

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

于 2010-07-11T10:37:22.470 回答
0

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

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

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

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

于 2010-07-11T10:43:22.280 回答