我正在编写一个支持H.264编码的MP4视频的网络应用。在Chrome和Safari中,它通过HTML5视频标记执行此操作。
为了控制对这些视频的访问,他们的内容通过PHP使用一种非常简单的机制提供:
header('Content-type: video/mp4');
readfile($filename);
exit;
无论我做什么,视频都不会播放。此外:
有什么想法吗?我把头发拉出来了!
答案 0 :(得分:7)
也许。尝试添加内容长度标题:
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
}
答案 1 :(得分:0)
查看评论!
建议不要使用readfile来传输视频文件,因为它会在输出之前将整个文件加载到内存中。这会导致内存耗尽的严重问题。
尝试按块读取和输出文件块。
答案 2 :(得分:0)
将文件流式传输到HTML5嵌入式视频播放器时,您仍然需要添加标题,告知播放器有关该视频的信息。
你不能只期望运行一个阅读readfile()
命令,事情会神奇地起作用,抱歉,但编程并不容易。 (希望是这样)。
这是一个小应用程序,您可以使用它来正确地传输或只是学习。