当一些数据被下载时,progress 事件被触发,up to three times per second. 浏览器通过buffered 属性提供可用媒体范围的列表;在 MDN 上的 Media buffering, seeking, and time ranges 上提供了详细指南。
单次加载启动
如果用户没有跳过视频,文件将被加载到一个TimeRange 中,buffered 属性将有一个范围:
------------------------------------------------------
|=============| |
------------------------------------------------------
0 5 21
| \_ this.buffered.end(0)
|
\_ this.buffered.start(0)
要知道这个范围有多大,请这样阅读:
video.addEventListener('progress', function() {
var loadedPercentage = this.buffered.end(0) / this.duration;
...
// suggestion: don't use this, use what's below
});
多次加载开始
如果用户在加载时更改播放头位置,则可能会触发新请求。这会导致buffered 属性碎片化:
------------------------------------------------------
|===========| |===========| |
------------------------------------------------------
1 5 15 19 21
| | | \_ this.buffered.end(1)
| | \_ this.buffered.start(1)
| \_ this.buffered.end(0)
\_ this.buffered.start(0)
注意缓冲区的数量如何变化。
由于它不再是连续的加载,“加载百分比”不再有意义。您想知道当前的TimeRange 是什么以及加载了多少。在此示例中,您将了解加载条应该在哪里开始(因为它不是 0)以及它应该在哪里结束。
video.addEventListener('progress', function() {
var range = 0;
var bf = this.buffered;
var time = this.currentTime;
while(!(bf.start(range) <= time && time <= bf.end(range))) {
range += 1;
}
var loadStartPercentage = bf.start(range) / this.duration;
var loadEndPercentage = bf.end(range) / this.duration;
var loadPercentage = loadEndPercentage - loadStartPercentage;
...
});