2011-12-01 152 views
0

我想通过PHP输出一个MP4视频文件。 当它通过Flash播放器(例如流式播放器)使用时,它工作得很好。 但是,当我试图使用它作为html5视频标签的来源或直接调用php文件时,它不起作用。通过PHP的MP4文件不播放HTML5视频

我使用的代码如下:

 $filesize = filesize($file); 
     header("Content-Type: video/mp4"); 

     if (empty($_SERVER['HTTP_RANGE'])) 
     { 
      header("Content-Length: $filesize"); 
      readfile($file); 
     } 
     else //violes rfc2616, which requires ignoring the header if it's invalid 
     { 
      rangeDownload($file); 
     } 

rangeDownload功能是从http://mobiforge.com/developing/story/content-delivery-mobile-devices附录A.

即使当我使用Content-Range报头(Content-Range:bytes 0-31596111/31596112),它stucks上下载30.13 MB的视频。

+1

那么,你的php.ini'max_execution_time'比视频长吗?您是否在静态和readfiled文件之间探测了其他标题差异(Firebug)? – mario

+0

我建议检查php.ini中的最大内存设置 - 好像你用来发送视频给客户端的两个函数都是将整个文件读入内存然后发送给用户,你可能需要使用小块读取并发送它(例如2MB)。 –

+0

建议不要将mp4用于html5视频。看看这里的图表,哪些浏览器目前支持HTML5视频的视频文件类型。 http://en.wikipedia.org/wiki/HTML5_video – dqhendricks

回答

1

最后,我已经找到一种方法,使工作

header("Content-Type: $mediatype"); 

if (empty($_SERVER['HTTP_RANGE'])) 
{ 
    header("Content-Length: $filesize"); 

    $fh = fopen($file, "rb") or die("Could not open file: " .$file); 

    # output file 
    while(!feof($fh)) 
    { 
     # output file without bandwidth limiting 
     echo fread($fh, $filesize); 
    } 
    fclose($fh); 
} 
else //violes rfc2616, which requires ignoring the header if it's invalid 
{ 
    rangeDownload($file); 
} 

它在PHP文件的直接联系和HTML5视频标签内工作。
但为了在的Flowplayer工作(也许在其他Flash/HTML5广告播放器),你需要添加一个MP4扩展(如view.php?ID = XXX &文件= type.mp4)

0

这可能与您的浏览器和它使用什么插件来查看视频文件ie)quicktime。它与Flash协同工作的原因是Flash处理缓冲和时间同步等。通常不建议让浏览器处理播放媒体文件,因为它完全取决于浏览器配置和安装的插件。

某些浏览器会自动下载媒体文件,它可以完全由浏览器和最终用户配置。

+0

感谢您的建议马修,但MP4直接访问时,Safari浏览器/ Chrome完美播放视频。问题是,当我出于安全考虑将它包装在PHP文件中时。 – GRaecuS