视频的缓冲方式取决于浏览器的实现,因此可能因浏览器而异。
各种浏览器可以使用不同的因素来确定保留或丢弃缓冲区的一部分。旧段、磁盘空间、内存和性能是典型的因素。
知道的唯一方法是“查看”浏览器已经或正在加载什么。
例如 - 在 Chrome 中,我播放了几秒钟,然后我跳到了大约 30 秒,你可以看到它开始从那个位置开始加载另一个部分。
(缓冲区似乎也绑定到关键帧,因此可以解码该缓冲区中的 n 帧。这意味着缓冲区可以在实际位置之前一点点开始加载数据)。
我提供了一个大约 1 分钟长的演示视频 - 但是,这还不足以进行适当的测试。免费免费提供包含更长视频的视频链接(或者如果您希望我使用此更新演示,请分享)。
主函数将遍历buffered
视频元素上的对象。它会将所有存在于画布上的部分渲染为红色视频显示的正下方。
您可以在此查看器上单击(不拖动)以将视频移动到不同的位置。
/// buffer viewer loop (updates about every 2nd frame)
function loop() {
var b = vid.buffered, /// get buffer object
i = b.length, /// counter for loop
w = canvas.width, /// cache canvas width and height
h = canvas.height,
vl = vid.duration, /// total video duration in seconds
x1, x2; /// buffer segment mark positions
/// clear canvas with black
ctx.fillStyle = '#000';
ctx.fillRect(0, 0, w, h);
/// red color for loaded buffer(s)
ctx.fillStyle = '#d00';
/// iterate through buffers
while (i--) {
x1 = b.start(i) / vl * w;
x2 = b.end(i) / vl * w;
ctx.fillRect(x1, 0, x2 - x1, h);
}
/// draw info
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);
/// draw cursor for position
x1 = vid.currentTime / vl * w;
ctx.beginPath();
ctx.arc(x1, h * 0.5, 7, 0, 2 * Math.PI);
ctx.fill();
setTimeout(loop, 29);
}