我想阅读与PHP和我现在做的MP4文件是这样的:
<?php
header("Content-Length: filesize");
readfile('file.mp4');
?>
但这种方式,我不能跳过,甚至回去,直到视频没有加载100%。 当然,当我直接从文件读取(video.mp4)一切顺利。
谢谢。
我想阅读与PHP和我现在做的MP4文件是这样的:
<?php
header("Content-Length: filesize");
readfile('file.mp4');
?>
但这种方式,我不能跳过,甚至回去,直到视频没有加载100%。 当然,当我直接从文件读取(video.mp4)一切顺利。
谢谢。
你需要自己实现跳跃功能在PHP。 这是一个代码片段,将这样做。
<?php
$path = 'file.mp4';
$size=filesize($path);
$fm=@fopen($path,'rb');
if(!$fm) {
// You can also redirect here
header ("HTTP/1.0 404 Not Found");
die();
}
$begin=0;
$end=$size;
if(isset($_SERVER['HTTP_RANGE'])) {
if(preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches)) {
$begin=intval($matches[0]);
if(!empty($matches[1])) {
$end=intval($matches[1]);
}
}
}
if($begin>0||$end<$size)
header('HTTP/1.0 206 Partial Content');
else
header('HTTP/1.0 200 OK');
header("Content-Type: video/mp4");
header('Accept-Ranges: bytes');
header('Content-Length:'.($end-$begin));
header("Content-Disposition: inline;");
header("Content-Range: bytes $begin-$end/$size");
header("Content-Transfer-Encoding: binary\n");
header('Connection: close');
$cur=$begin;
fseek($fm,$begin,0);
while(!feof($fm)&&$cur<$end&&(connection_status()==0))
{ print fread($fm,min(1024*16,$end-$cur));
$cur+=1024*16;
usleep(1000);
}
die();
更高的性能
请注意,这是不是最有效的方式做到这一点,因为整个文件需要经过PHP,那么你只需要尝试它是如何为您服务。
假设你想这样做的原因是为了限制访问,你需要更高的效率后,您可以使用标志为Web服务器。
阿帕奇与X-SENDFILE模块或lightty( nginx的信息在这里 )
$path = 'file.mp4';
header("X-Sendfile: $path");
die();
这是一个比较先进的,如果你需要它,你应该只使用它,但它是轻松的知道,当你的东西,是相当容易的,但具有业绩平平开始时你有一个升级选项。
我通过接受的解决方案实验发现了一个便宜得多PHP的唯一途径。 虽然我没有测试过这对X-SENDFILE,我怀疑的性能更出色的整体为您的网站,因为它意味着更短的Apache文件。
你只需要下面的代码从PHP推出的MP4可查找视频(未与.webm或其他类型的测试):
$file='path/file.mp4';
header('Content-Type: video/mp4'); #Optional if you'll only load it from other pages
header('Accept-Ranges: bytes');
header('Content-Length:'.filesize($file));
readfile($file);
更清洁,更快速; 接受答案的代码导致了视频拍摄很长的时间来加载由于某种原因,加载此代码中的视频是瞬间完成的(这两项测试分别有7.25 MB的视频文件在本地服务器上)。
测试了Chrome浏览器,Firefox和边缘的默认视频播放器。
编辑:没有测试header('Content-Type: video/mp4');
如果该文件的从另一个页面加载时,它仍然有效! 如果直接访问URL,就没有视频播放器; 代码将刚刚被打印出来。