javascript - 通过 PHP fpassthru() 加载 mp4/webm 的 Chrome HTML5 视频 : can't set currentTime?

标签 javascript php google-chrome video html5-video

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

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

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

<video id="thevideo" width="720" height="480">
  <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" width="720" height="480">
  <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” header 有关。我已将 header “Accept-Ranges: bytes”添加到 .php 脚本的输出中,并且我已确保 Web 服务器允许字节范围请求,但仍然无法正常工作。

最佳答案

关于要求“Accept-Ranges” header 作为 HTTP Byte Serving 的一部分,您是正确的.我建议阅读类似问题的答案:

Seekbar not working in Chrome

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

关于javascript - 通过 PHP fpassthru() 加载 mp4/webm 的 Chrome HTML5 视频 : can't set currentTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21285539/

相关文章:

javascript - 全日历 : trouble rendering events with ajax when pressing 'prev' or 'next'

php - 使用 Xpath 解析网站中的 html

php - 根据用户下拉选项选择表单

css - 为什么VW不等于窗口的视觉宽度?

javascript - 如何滚动 "tbody"内的特定区域

Javascript:将过滤后的数组推送到现有数组

javascript - 有效评估 JavaScript 对象是否包含字符串

php - Laravel 自定义验证消息参数

jquery - Chrome 中平滑滚动的冲突

Chrome 中的 CSS rgba 透明度错误?