如何检测HTML5视频是否暂停缓冲?

Sup*_*agi 37 javascript html5 html5-video

我正在尝试测试视频是否不稳定.我注意到,pause当视频暂停缓冲时,不会触发事件.检测视频是否暂停缓冲的最佳方法是什么?

slh*_*hck 43

我通过每x毫秒检查玩家进度来做到这一点,例如50.如果玩家没有达到预期的那么高,那么我们就是在缓冲.这是非常可靠的,因为我发现在视频缓冲的所有情况下都会触发其他事件,例如waitingstalled不会触发.

请注意,间隔必须大于预期的帧间差异,但我确信你不会想要那么精确.考虑到人类最不可能察觉到该区域的差异,估计在±300ms内的缓冲时间仍然可以.

务必检查用户是否未主动暂停播放.

var checkInterval  = 50.0 // check every 50 ms (do not use lower values)
var lastPlayPos    = 0
var currentPlayPos = 0
var bufferingDetected = false
var player = document.getElementById('videoPlayer')

setInterval(checkBuffering, checkInterval)
function checkBuffering() {
    currentPlayPos = player.currentTime

    // checking offset should be at most the check interval
    // but allow for some margin
    var offset = (checkInterval - 20) / 1000

    // if no buffering is currently detected,
    // and the position does not seem to increase
    // and the player isn't manually paused...
    if (
            !bufferingDetected 
            && currentPlayPos < (lastPlayPos + offset)
            && !player.paused
        ) {
        console.log("buffering")
        bufferingDetected = true
    }

    // if we were buffering but the player has advanced,
    // then there is no buffering
    if (
        bufferingDetected 
        && currentPlayPos > (lastPlayPos + offset)
        && !player.paused
        ) {
        console.log("not buffering anymore")
        bufferingDetected = false
    }
    lastPlayPos = currentPlayPos
}
Run Code Online (Sandbox Code Playgroud)


bri*_*rls 18

你正在寻找的事件是waiting.

规格:

由于readyState属性更改为低于HAVE_FUTURE_DATA的值,因此可能会播放停止播放的元素会触发等待的DOM事件.

paused状态不会改变,因为视频仍然是"潜在的打"(即"努力"中扮演).因此,waiting事件触发.当加载了足够的数据时,playing会触发.

您还可以通过查看两个属性networkStatereadyState来随时检查状态

if (video.networkState === video.NETWORK_LOADING) {
    // The user agent is actively trying to download data.
}

if (video.readyState < video.HAVE_FUTURE_DATA) {
    // There is not enough data to keep playing from this point
}
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,"等待"事件将不会在所有情况下被解雇.我模拟了一个缓慢的连接,视频将每隔几秒缓冲一次,而不会看到"等待"事件被触发(并且都没有"停滞").检查这一点的最佳方法是每隔几毫秒监控播放进度. (3认同)
  • 看起来Chrome对"readyState"及相关事件的支持是粗略的.请参阅此错误https://code.google.com/p/chromium/issues/detail?id=144683和https://code.google.com/p/chromium/issues/detail?id=73609也许值得归档另一个用于"等待" (3认同)
  • @slhck 是正确的。我遇到了完全相同的问题,我通过每秒检查播放进度来解决它(我发现较低的值是矫枉过正)。我已经在 Windows 7 上最新版本的 FF、Chrome 和 IE 上对此进行了测试。在 Chrome 和 IE 上,`readyState` 属性是无用的,因为它报告了 `HAVE_FUTURE_DATA` 而回放实际上由于缺乏数据而被冻结。到目前为止,在我测试的三个浏览器中,FF 似乎是唯一触发 `waiting` 事件的浏览器。 (2认同)
  • 截至2019年,“等待”事件确实可靠发生。我注意到很多此类问题都发生在2014年,因此此后情况似乎一直在发展。 (2认同)