视频缓冲的方式取决于浏览器的实现,因此可能因浏览器而异。
各种浏览器可以使用不同的因素来确定保留或丢弃缓冲区的一部分。旧段、磁盘空间、内存和性能是典型的因素。
唯一的方法是“查看”浏览器正在加载的内容。
例如,在Chrome中,我播放了几秒钟,然后跳到大约30秒,你可以看到它开始从那个位置加载另一部分。
(缓冲区似乎也绑定到关键帧,因此可以在该缓冲区中解码n帧。这意味着缓冲区可以在实际位置之前稍微开始加载数据)。
![Example](https://istack.dev59.com/oc2Pz.webp)
我提供了一个大约1分钟长的演示视频 - 然而,这不足以进行适当的测试。请随意提供包含更长视频的视频链接(或者如果您希望我使用此更新演示,请分享)。
主要功能将遍历视频元素上的buffered
对象。它将呈现所有存在的部分到位于视频下方的画布中,并以红色显示。
您可以单击(但不能拖动)此查看器以将视频移动到不同位置。
function loop() {
var b = vid.buffered,
i = b.length,
w = canvas.width,
h = canvas.height,
vl = vid.duration,
x1, x2;
ctx.fillStyle = '#000';
ctx.fillRect(0, 0, w, h);
ctx.fillStyle = '#d00';
while (i--) {
x1 = b.start(i) / vl * w;
x2 = b.end(i) / vl * w;
ctx.fillRect(x1, 0, x2 - x1, h);
}
ctx.fillStyle = '#fff';
ctx.textBaseline = 'top';
ctx.textAlign = 'left';
ctx.fillText(vid.currentTime.toFixed(1), 4, 4);
ctx.textAlign = 'right';
ctx.fillText(vl.toFixed(1), w - 4, 4);
x1 = vid.currentTime / vl * w;
ctx.beginPath();
ctx.arc(x1, h * 0.5, 7, 0, 2 * Math.PI);
ctx.fill();
setTimeout(loop, 29);
}