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



,所以这是我遇到的一个奇怪的问题。我只在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有关,专门要求在响应中提供"接受范围"标头。我已经在.php脚本的输出中添加了标题" Accept-Ranges:bytes",并且我确保Web服务器允许字节范围请求,但是它仍然无法正常工作。

作为HTTP字节服务的一部分,您需要正确的"接受范围"标头。我建议将此答案阅读到一个类似的问题:

SeekBar在Chrome中不工作

添加响应标头还不够。您还必须使用" 206个部分内容"状态代码做出响应,并仅返回请求的字节范围。听起来您仍在返回整个文件。fpassthru将一直读取文件到最后,因此您似乎需要找到另一种读取文件的方法。

最新更新