Скажите, загружено ли видео или нет в Javascript

Итак, я использовал прослушиватель на

document.getElementById("video").buffered.length

чтобы увидеть, больше ли это 0, когда видео загружено или нет. Это работает для очень маленького видео и только в Google Chrome. В Firefox вообще не работает. Любые идеи о том, как заставить это работать?

По сути, я хочу дождаться загрузки 3 отдельных видео, чтобы выполнить определенное действие, как мне это сделать?


person Riveascore    schedule 30.12.2011    source источник


Ответы (4)


Попробуй это:

var video = document.getElementById("video-id-name");

if ( video.readyState === 4 ) {
    // it's loaded
}

Читайте здесь: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState

person Šime Vidas    schedule 30.12.2011
comment
Какие браузеры поддерживают это свойство? - person Jared Farrish; 31.12.2011
comment
@JaredFarrish Согласно этой Wiki, поддержка завершена (столбец WebKit пусто, но я был бы удивлен, если бы их реализация отставала от Mozilla/Opera). - person Šime Vidas; 31.12.2011
comment
@ŠimeVidas, как это можно использовать, если есть более 1 видео. ? спасибо - person ; 12.08.2016
comment
Этот ответ не имеет смысла. На самом деле это не прослушивание изменений. Это будет работать только при первой загрузке страницы, и если она будет готова сразу, она будет работать. - person Omar; 24.03.2017
comment
@ Омар Ты прав. Я могу удалить свой ответ, когда будет опубликовано верное решение. - person Šime Vidas; 25.03.2017
comment
@Omar Омар Вы обобщаете варианты использования. Я говорю это, потому что в моей функции предварительной загрузки мультимедиа это решение идеально подходит, так как я периодически опрашиваю загрузку различных аудио, видео, файлов изображений. - person Dapu; 06.09.2019

ОБНОВЛЕНИЕ:

Как уже упоминалось, мое оригинальное решение ниже работает, но может привести к проблемам с производительностью и некоторой непредсказуемостью в его поведении.

Поэтому я рекомендую прослушать событие loadeddata. Подробнее читайте здесь: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loadeddata_event

const videoElement = document.getElementById("my_video");

videoElement.addEventListener('loadeddata', (e) => {
   //Video should now be loaded but we can add a second check

   if(videoElement.readyState >= 3){
       //your code goes here
   }

});

==================================

ХУЖЕ РЕШЕНИЕ:

Я считаю, что использование setInterval работает для активного прослушивания, когда readyState видео изменяется, проверяя каждые полсекунды, пока оно не загрузится.

checkforVideo();

function checkforVideo() {
    //Every 500ms, check if the video element has loaded
    var b = setInterval(()=>{
        if(VideoElement.readyState >= 3){
            //This block of code is triggered when the video is loaded

            //your code goes here

            //stop checking every half second
            clearInterval(b);

        }                   
    },500);
}

Если вы не используете ES6, просто замените () => на function()

person Badrush    schedule 11.12.2017
comment
Отличный ответ! К вашему сведению, все, что мы делаем, это проверяем простое свойство элемента видео. Он использует очень мало вычислительной мощности, поэтому нет необходимости ждать полсекунды между проверками. Вы можете изменить его на 10 миллисекунд и поймать видео почти в тот момент, когда оно загружается. - person Gavin; 05.04.2019
comment
Это круто. - person John the Painter; 09.11.2019
comment
Этот ответ фантастический, но он блокирует основной поток, и я пытаюсь отобразить там счетчик... анимация счетчика зависает каждую секунду. - person Duck; 22.05.2020
comment
@DuckDucking ты прав. Использование setInterval может помочь, но это далеко не идеально. Я обновил свой ответ новым и улучшенным решением, которое не должно вызывать проблем с производительностью. - person Badrush; 26.05.2020

Чтобы сделать это слушателем, при нормальных обстоятельствах вам нужно прослушивать событие приостановки. Он срабатывает, когда загрузка приостанавливается или останавливается по какой-либо причине, включая ее завершение.

Вы также захотите послушать воспроизведение для случаев, когда контент уже загружен (например, из кеша)

video.addEventListener("playing", function() {
    console.log("[Playing] loading of video");
    if ( video.readyState == 4 ) {
        console.log("[Finished] loading of video");
    }
});
video.addEventListener("suspend", function(e) {
    console.log("[Suspended] loading of video");
    if ( video.readyState == 4 ) {
        console.log("[Finished] loading of video");
    }
});

Источник: https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events

person efaj    schedule 04.07.2017

Используйте событие onloadeddata для видеоэлемента. Он проверяет, загружено ли видео или нет. См. эту ссылку для получения дополнительной информации.

Событие loaddata запускается, когда кадр в текущей позиции воспроизведения мультимедиа закончил загрузку; часто первый кадр.

var video = document.getElementById("video");
video.onloadeddata = function() {
    // video is loaded
}
person aye2m    schedule 24.05.2018
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. - person Ethan; 24.05.2018
comment
Что ж, я не долго искал эту подсказку, и в моем случае она оказалась лучшим решением. ‹video onloadded=mystuff()... › позволил мне настроить паузу, ожидание, а затем возобновить работу, чтобы устранить прерывистое видео из-за низкой буферизации в прямом эфире - person Leo Smith; 30.06.2020