视频的缓冲方式取决于浏览器的实现,因此可能因浏览器而异。
各种浏览器可以使用不同的因素来确定保留或丢弃缓冲区的一部分。旧段、磁盘空间、内存和性能是典型的因素。
知道的唯一方法是“查看”浏览器已加载或正在加载的内容。
例如 - 在 Chrome 中我播放了几秒钟然后我跳到大约 30 秒,你可以看到它开始从那个位置开始加载另一个部分。
(缓冲区似乎也受关键帧的限制,因此可以对该缓冲区中的 n 帧进行解码。这意味着缓冲区可以在实际位置之前开始加载数据)。
我提供了一个大约 1 分钟长的演示视频 - 但是,这不足以进行适当的测试。免费提供包含更长视频的视频链接(或者,如果您希望我使用此更新演示,请分享)。
main 函数将遍历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);
}