視頻緩衝的方式取決於瀏覽器實現,因此可能因瀏覽器而異。
各種瀏覽器可以使用不同的因素來決定保留還是放棄部分緩衝區。舊的細分,磁盤空間,內存和性能是典型的因素。
真正知道的唯一方法是「查看」瀏覽器具有或正在加載的內容。
爲此,我製作了一個緩衝區查看器,顯示緩衝區中的哪個部分。觀衆將顯示當前和整個緩衝區的所有部分:
ONLINE BUFFER VIEWER
例如 - 在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);
}
來源
2013-09-04 22:26:56
K3N
當你暫停視頻並運行buffered.end(索引)時,它返回1並停止工作。這是一種常見的行爲嗎?找不到相關問題。 –