Событие progress
наступает при загрузке некоторых данных, до трех раз в секунду. Браузер предоставляет список диапазонов доступных носителей через свойство buffered
;подробное руководство по этому вопросу доступно в Буферизация медиа, поиск и интервалы времени в MDN.
Запуск одной загрузки
Если пользователь не пропускает видеофайл будет загружен в один 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;
...
});