html - 如何识别 html5 媒体元素停滞并等待更多媒体继续播放

标签 html html5-video media-source

我正在使用 MediaSourceSourceBuffer 来播放 html5 视频。我正在按顺序获取 DASH 片段以继续不间断的视频播放。但有时,由于网络状况,SourceBuffer 会用完数据继续播放。当该数据到达时,播放恢复。但在此期间,视频看起来停滞不前。我想在媒体元素上添加一些视觉指示,表明它已暂停,因为它需要缓冲数据。

我尝试在视频上绑定(bind)“等待”和“停止”事件,但没有一个事件被触发。

var vid = $('video')[0];
vid.addEventListener('stalled', function(e) { console.log('Media stalled...');})

有没有其他方法可以知道媒体是否已停止以及何时恢复?

谢谢。

最佳答案

使用停顿事件是正确的,但不幸的是,它并不总是按预期工作。

你可以使用 Media Source Extension 这使您可以完全控制缓冲区并允许您手动检测停顿。但是,使用它的解决方案有点超出了 IMO 的范围。

您也可以使用 timeupdate 事件。

  • setTimeout() 以超时值运行
  • timeupdate 事件中,清除这个计时器并设置一个新的
  • 如果计时器没有重置,则意味着没有时间进度,如果没有暂停或结束,则假设停止

示例(未经测试):

...
var timerID = null, isStalling = false;

vid.addEventListener("timeupdate", function() {
    clearTimeout(timerID);
    isStalling = false;
    // remove stalling indicator if any ...
    timerID = setTimeout(reportStalling, 2000);  // 2 sec timeout
});

// integrate with stalled event in some way -
vid.addEventListener("stalled", function() {isStalling = true})

function reportStalling() {
  if ((!vid.paused && !vid.ended) || isStalling) { ... possible stalling ... }
}
...

您可能需要做一些额外的检查以排除其他可能性等等,但这只是给您一个大概的想法,并且是在使用 stalling 事件之外。

另一种方法可能是使用 buffered 对象来监视加载的缓冲区段(有关用法的示例,请参见 this answer here )。

这些可用于查看您是否有任何进展,然后使用 currentTime 与范围进行比较以查看时间是否在范围的末尾和/或范围是否在变化全部。

无论如何,希望这能提供一些意见。

关于html - 如何识别 html5 媒体元素停滞并等待更多媒体继续播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29796420/

相关文章:

javascript - 在 div 元素的 Y 溢出时调用(触发)一个 JS 函数

html - 两个如何使用 CSS 从不同宽度的内容创建一个两列的动态布局?

html - 在 HTML5 全屏视频上叠加

javascript - MSE SouceBuffer 对象不支持“audio/wav”mime 类型,但指向 .wav 的音频 src 属性播放得很好

html - WordPress 在文章中 float

javascript - 当点击元素时它出现在其他地方 javascript/jquery

cordova - 2013 年 Phonegap 2.3 和带有 HTML5 视频标签的 Android

javascript - HTML5 视频 : canPlayType() is not working in safari

FFmpeg sidx atom 未显示

javascript - 无法让 MediaSource 在 chrome 中使用 mp4 格式