【问题标题】:Firefox doesn't recognize if video src gets interruptedFirefox 无法识别视频 src 是否被中断
【发布时间】:2014-04-01 15:56:25
【问题描述】:

我目前正在使用 video.js 以使视频观看更加可靠。当前的情况是:在观看视频时,连接中断(互联网连接中断)。

使用 chrome 没什么大不了的:我创建了一个函数,将函数附加到错误事件中,瞧,如果发生错误,我的函数能够恢复(在这种情况下,它只是试图重新加载视频并寻找到最后一个已知位置)。

在 Firefox 上什么也没发生。永远不会引发错误。 我试图解决这个问题并注意到Firefox似乎认为文件已完全加载以防网络中断。所以 bufferedPercent 跳到 1,loadedalldata 事件也被触发。对我来说,这似乎刚刚被打破,但我无法将其归结为 Firefox 或 video.js 问题。

还有其他人遇到此类问题或知道处理此类问题的更好方法吗?

背景信息:为了测试案例,我在两个运行 nginx 的网络服务器前面运行了一个 HAProxy,它们提供视频文件。为了触发我的问题,我只是杀死了当前正在传递流的 nginx。所以重新连接应该可以正常工作(只要另一个当然还在工作;)

感谢和问候, 黑暗人

【问题讨论】:

  • 您只使用 mp4 吗?还是 webm?
  • 两者。我也尝试重新排序(webm 之前的 mp4,反之亦然),没有变化。如果这很重要,我也可以只尝试其中一种。但两者都支持寻求(经过测试),以防万一这可能是你问的原因;)
  • 您的服务器和代理是否支持 HTTP 字节服务?即,是否有“Accept-Ranges”响应标头?
  • 是的,检查了几次。我在使用 Web 开发人员控制台时看到了请求以及回复,到目前为止它们看起来都很好。 haproxy 也只执行 tcpmode,因为我不想要任何无用的拦截。

标签: javascript firefox html5-video video.js


【解决方案1】:

可能是您将错误绑定在视频标签而不是源标签上吗? 如here所述:

错误事件现在不是被分派给媒体元素本身,而是被传递给与导致错误的源相对应的子元素。

<video controls id="videoTag" width="640" height="360" preload="auto">
<source src="pathto.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"' id="mp4Source">
<source src="pathto.webm" type='video/webm; codecs="vp8.0, vorbis"' id="webmSource">
</video>
<script type="text/javascript">
document.getElementById('mp4Source').addEventListener('error', function(ev) {
alert('mp4Source error');
}, false);
document.getElementById('webmSource').addEventListener('error', function(ev) {
alert('webmSource error');
}, false);
document.getElementById('videoTag').addEventListener('error', function(ev) {
alert('videoTag error');
}, false);
document.getElementById('videoTag').addEventListener('stalled', function(ev) {
alert('videoTag stalled');
}, false);

</script>

编辑:还检查停止事件,因为它在媒体资源下载时断开网络时触发。 Source.

在检测 HTML5 视频的播放/网络错误时,我通常使用 section 末尾代码后面的内容。 谢谢

【讨论】:

  • 好吧,但我读到如果你使用多个“源”元素,这将不起作用,例如 另一点是,如果源被中断,firefox“认为”流已经完成。如果您在中断后重新加载网站,它将完全重新加载视频(意味着由于其余部分仍然丢失,它将在同一点中止)。
  • 好的,我测试了你的代码,什么都没有。如果我中断下载,它就会停止,没有警报,什么都没有。
  • 如果您按照 MDN 网站上的说明在源标签上绑定错误,它应该可以工作。这是你试过的吗?当您发现错误时,只需推送 video.load() 和 video.play()。虽然如果您想要时间码在时间线中发生错误的位置,您需要制定一个例程来定期保存它。我已经更新了代码以反映我的意思。
  • 我测试了我的更新代码,它可以很好地检测 Firefox 28 中的网络关闭(如切断 wifi)或具有无效的 mp4 源路径。
  • 我以 1:1 复制了您的代码,修改了文件,运行了我的测试,但仍然一无所获。当我杀死 nginx 并且视频在数据末尾停止并且指示器像“完成此文件”一样跳到末尾时,进度条立即跳转到“完整”。为此,我还尝试了一个可移植的 firefox28,以确保版本匹配。所以似乎还是有问题。打字时:我在我的 Firefox 和我的目的地之间有一个代理,也许这也是一个问题:(
猜你喜欢
  • 2016-07-20
  • 2012-01-07
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多