用PHP读取mp4文件

我想用PHP读取mp4文件,现在我正在做的是这样的:

<?php header("Content-Length: filesize"); readfile('file.mp4'); ?> 

但这样我就不能跳过,甚至回到video未被加载100%。 当然,当我直接从文件(video.mp4)读取一切顺利。

谢谢。

你需要在PHP中自己实现跳过function。 这是一个代码片段,将做到这一点。

 <?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服务器的标志。

Apache与X-Sendfile模块或lightty( 这里的nginx信息 )

 $path = 'file.mp4'; header("X-Sendfile: $path"); die(); 

这有点高级,只有在需要的时候才应该使用它,但是当你开始使用一些相当简单但性能平庸的东西时,知道自己有一个升级选项是很轻松的。