通过 PHP fpassthru() 加载 mp4/webm 的 Chrome HTML5 视频:无法设置 currentTime?

Posted

技术标签:

【中文标题】通过 PHP fpassthru() 加载 mp4/webm 的 Chrome HTML5 视频:无法设置 currentTime?【英文标题】:Chrome HTML5 video with mp4/webm loaded via PHP fpassthru(): can't set currentTime? 【发布时间】:2014-02-12 15:57:37 【问题描述】:

所以这是我遇到的一个奇怪的问题。我只在 Mac 上测试过 Chrome 和 Safari,在这些浏览器之间,问题只在 Chrome 上表现出来。

我有一个非常基本的 html5 视频元素,它从我的服务器加载视频,用户在屏幕上有几个按钮可以跳转到视频中的特定时间。

当视频文件被引用为直接链接时,例如:

<video id="thevideo"  >
  <source type="video/webm" src="videos/vid102.webm" />
  <source type="video/mp4" src="videos/vid102.mp4" />
  <p>Your browser does not support this video.</p>
</video>

...它工作得很好。

但是,我刚刚进行了设置,因此可以通过 php fpassthru 加载视频,例如:

<video id="thevideo"  >
  <source type="video/webm" src="getvideo.php?t=webm&v=166" />
  <source type="video/mp4" src="getvideo.php?t=mp4&v=166" />
  <p>Your browser does not support this video.</p>
</video>

getvideo.php 看起来像这样:

<?php
$videoID = $_REQUEST["v"];
$videoType = $_REQUEST["t"];
$vidPath = "videos/video$vidFile.$videoType";

$fp = fopen($vidPath, 'rb');
header("Content-Type: video/$videoType");
header("Content-Length: " . filesize($vidPath));
fpassthru($fp);

?>

奇怪的行为是:在两种浏览器上,视频加载和播放都很好。然而,在 Chrome 上,使用 fpassthru PHP 脚本的版本无法设置播放器的“currentTime”属性,从而跳转到视频中的某个位置。如果我打电话给document.getElementById('thevideo').currentTime = 50,它不会跳到 50 秒标记,而是停留在原处。

知道为什么会这样吗?

更新: 我已经看到一些迹象表明这与 Chrome 有关,具体要求在响应中提供“Accept-Ranges”标头。我已将标头“Accept-Ranges: bytes”添加到 .php 脚本的输出中,并确保 Web 服务器允许字节范围请求,但仍然无法正常工作。

【问题讨论】:

【参考方案1】:

您要求将“Accept-Ranges”标头作为HTTP Byte Serving 的一部分是正确的。我建议阅读类似问题的答案:

Seekbar not working in Chrome

添加响应头是不够的。您还必须使用“206 Partial Content”状态代码进行响应,并仅返回请求的字节范围。听起来您仍在返回整个文件。 fpassthru 会一直读回文件到最后,所以看起来你需要找到另一种方式来读取文件。

【讨论】:

啊哈!这很有意义。如果我告诉客户端我可以返回请求的字节范围,如果我实际上没有返回请求的字节范围,不是吗? :) 顺便说一句,感谢您的提示,我找到了以下内容,看起来可以解决问题:***.com/questions/157318/… 很高兴它成功了。我怀疑用 PHP 提供这样的文件会有点慢。为什么不使用没有 PHP 的 CDN 或专用文件服务机器并在 javascript 中动态计算 URL? 主要是不想暴露实际文件,希望不同的用户使用同一个URL接收不同版本的文件。 有些 CDN 会为您提供过期密钥,您可以使用“Location”标头动态重定向到 CDN 临时 URL。

以上是关于通过 PHP fpassthru() 加载 mp4/webm 的 Chrome HTML5 视频:无法设置 currentTime?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 代码从服务器下载文件

93G通过项目学PHP+Ajax+jQuery网站开发技术 PHP+Ajax+jQuery项目实战课程

在 iOS 上直接访问 MP4 时播放,但通过 PHP 读取时不播放

为啥 PHP 会干扰我的 HTML5 MP4 视频?

使用php输出mp4视频

使用php输出mp4视频