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

Posted

技术标签:

【中文标题】在 Google Chrome 中通过 PHP 传输 MP4 视频失败【英文标题】:MP4 video delivery via PHP fails in Google Chrome 【发布时间】:2012-07-11 00:27:56 【问题描述】:

我目前正在尝试通过用于控制视频访问的 php 脚本提供用于 html5 视频(使用 video-js)的 MP4 视频。经过一些研究,我能够在*** article found here 的帮助下完成这项工作。如果我导航到 PHP 脚本,我可以像在 Firefox、Safari 和 IE 中通过其绝对路径(例如 localhost/myvideo.mp4 而不是 localhost/myscript.php)查看视频一样查看视频。我的问题是谷歌浏览器,它只是显示一个黑色的屏幕,中间有一个小型媒体播放器,什么都不做。

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

这是我的脚本:

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 方法直接取自 this link 的附录 A,正如前面提到的 *** 文章中所建议的那样。

【问题讨论】:

您可以发布您发送的所有标题信息吗? 内容类型、接受范围、内容范围、内容长度、HTTP/1.1 206 部分内容。这些标头在第一种情况下使用 rangeDownload,它用于 Chrome,尽管 readfile_chunked 使用较少的标头(在 chrome 中仍然不起作用)。 我唯一可以建议的另一个是 Content-Transfer-Encoding: binary。我能够通过 PHP 将音频传输到使用此组合的所有浏览器。 @ethrbunny 感谢您的帮助,但遗憾的是,该标题没有任何区别。 你试过用一个已知的好视频吗? 【参考方案1】:

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

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

不要使用“Content-Disposition”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)

【讨论】:

感谢您的回复,尽管正如我在问题中所述,“我确实尝试使用快速重写,例如 localhost/avideo.mp4 路由到 PHP 脚本,但不幸的是这并没有改变任何事物。”。我不确定你还建议我做些什么不同的事情? 不同之处可能在于浏览器获取的实际 URL。如果您使用重定向 (30x),那么浏览器最终会获得最终 URL,其扩展名为 .php 而不是 .mp4 扩展 - 这可能非常重要。您是否尝试比较所有请求/响应标头(例如,使用 Fiddler?) 我现在在 Chrome 中查看标题信息,但我不知道该怎么做。我能说的是有明显的区别。我会在几个小时后用屏幕截图跟进这篇文章。 Here's that screenshot of the headers shown in Google Chrome。我承认我对标题不是特别了解,所以我不知道该怎么做。你能解释一下这件事吗? 屏幕截图只包含请求,而不是每个请求的标头。单击请求以查看标头(您应该看到诸如请求 URL、请求方法、状态代码之类的内容,然后是请求标头列表和响应标头。您将看到响应标头中的差异(您生成的标头和创建的标头)由网络服务器),否则,令人讨厌的差异可能是请求 URL,正如我推测的那样(意思是,你的将是 something.php 和他们的 some.mp4)浏览器使用扩展作为他们应该如何处理内容的启发式。 【参考方案2】:

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

可能对其他人有所帮助的旁注:其中一个要求是我们托管所有文件,这样我们就不会依赖第三方服务器来提供 javascript 文件或 Flash 播放器,我不记得是否有视频-js 这很容易,但我知道使用 html5media 我们能够下载flowplayer 并将所有内容都放在我们的服务器上。

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

【讨论】:

感谢这篇文章,但是问题不在于 Video-JS,它特别是 chrome(视频不能在 chrome 上播放,video-js 不在图片中,使用时正常的视频文件,video-js 工作正常)。我对 video-js 的体验很好;我使用手刹进行文件转换,到目前为止我还没有遇到任何问题。但是,我已经注意到 html5media 以防我将来需要找到新的东西。干杯。 没问题@Noobatron。我不想阻止人们使用 video-js,因为如果你能让它工作,那么嘿,太好了!我只是认为有人可能会从听到我所做的事情中受益,以防他们遇到同样的问题(也许我只是不知道我在用 video-js 做什么)。我家里有手刹,我用它来把 DVD 转换成我的安卓手机,它很管用。我仍然会去 Miro 为这 3 种网络格式工作,因为界面非常简单。希望您的视频在 Chrome 上运行!

以上是关于在 Google Chrome 中通过 PHP 传输 MP4 视频失败的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP Selenium 中通过链接查找元素

我看不到使用 php 在我的 Google Drive 中通过 api 创建的文件和文件夹

在 jQueryUI 选项卡中通过 AJAX 加载 Google 可视化

在 Selenium 中更改 Google Chrome 用户代理的方法?

为啥我的单元测试在 Chrome 中通过而在 PhantomJS 中失败?

如何在 Chrome 中通过 nativeMessaging 发送/接收短信?