使用停滞的事件是正确的,但不幸的是,它并不总是按预期工作。
您可以使用媒体源扩展,它可以让您完全控制缓冲区并允许您手动检测停顿。但是,使用它的解决方案有点超出 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
对象监视加载的缓冲区段(例如,有关使用情况,请参见此处的答案)。
这些可用于查看您是否有任何进展,然后使用currentTime
与范围比较来查看时间是否在范围的末尾和/或范围是否正在发生变化。
无论如何,希望这能提供一些意见。