通过PHP的MP4视频传输在Google Chrome中失败


MP4 video delivery via PHP fails in Google Chrome

我目前正试图通过一个用于控制视频访问的PHP脚本来交付用于HTML5视频的MP4视频(使用视频js)。经过一些研究,在这里找到的stackoverflow文章的帮助下,我能够做到这一点。如果我导航到PHP脚本,我可以在Firefox、Safari和IE中通过它的绝对路径(例如localhost/myvideo.mp4而不是localhost/myscript.PHP)来查看视频。我的问题是谷歌Chrome,它只是显示一个黑屏,中间有一个小媒体播放器,什么也不做。

我确实尝试过使用快速重写,比如localhost/avideo.mp4,它会路由到PHP脚本,但不幸的是,这并没有改变任何东西。

这是我的脚本:

if (is_file($uri)) {
    header('Content-Type: video/mp4');
    if (isset($_SERVER['HTTP_RANGE'])) {
        $this->rangeDownload($uri);
        exit;
    } else {
        header("Content-Length: ".filesize($uri));
        $this->readfile_chunked($uri);
        exit;
    }
} else {
    //error
}

rangeDownload方法直接取自该链接的附录A,如前面提到的stackoverflow文章中所建议的。

也许问题出在URL(更具体地说,扩展名)上。通常,您会使用Content-Disposition标头,但我知道在将内容传递到手机时,这是不可取的。

尝试使用localhost/myscript.php/myvideo.mp4

重要的是不要使用"内容处置"HTTP标头,因为有些手机在使用时拒绝接受内容。通过在URL上包含文件名,你会欺骗手机认为这是一个真实的文件并接受它

现在,当你将下载URL发送给客户时,你通常还不知道客户有什么设备,所以你不知道设备支持什么文件格式。因此,您不能在该URL上包含文件名,并且再次需要一个中间下载页面。再一次,我们将使用一个URL,如:

http://wap.mydomain.tld/get.php/123456abcdef

这一次,当客户连接下载内容时,get.php脚本将不会创建临时文件,而是指向另一个用于流式传输文件内容的脚本。假设下载的结果内容是"image.jpg",中间下载页面可以将客户指向类似的URL

http://wap.mydomain.tld/download.php/123456abcdef/image.jpg

发件人(http://mobiforge.com/developing/story/content-delivery-mobile-devices)

我知道你在使用视频js,但我建议使用html5media(也可以查看github页面了解更多信息)。我不得不在网站上提供视频以供工作,我尝试了一些东西,包括视频js,但html5media是我唯一可以在所有浏览器中使用的。

一个可能有助于其他人的附带说明:其中一个要求是,我们托管所有文件,这样我们就不会依赖第三方服务器来提供JavaScript文件或flash播放器,我不记得使用视频js是否很容易,但我知道使用html5media,我们可以下载流播放器,并在服务器上拥有一切。

为了生成3种推荐的视频格式(mp4、WebM和Theora),我使用了Miro视频转换器