Рассчитайте общее время видео с загруженными метаданными addEventListener и сохраните его в глобальной переменной для использования в setinterval - PullRequest
0 голосов
/ 21 января 2020

Идея состоит в том, чтобы создать слайдер для видео без библиотек, только JQUERY.

Я хочу рассчитать общее время всех видео для установки в setInterval

My HTML

    <div class="slider1">
            <video width="100%" autoplay="" loop="" muted="" playsinline="" preload="">
            <source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
             </video>
    </div>

    <div class="slider2">
            <video width="100%" autoplay="" loop="" muted="" playsinline="" preload="">
            <source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
             </video>
    </div>

    <div class="slider3">
            <video width="100%" autoplay="" loop="" muted="" playsinline="" preload="">
            <source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
             </video>
    </div>

    <div class="slider4">
            <video width="100%" autoplay="" loop="" muted="" playsinline="" preload="">
            <source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
             </video>
    </div>
                                                                          </div>

МОЙ JS КОД:

myslider = {

    totalTimeOfVideos : 0,

    Sliderinit:function(){

        myslider.playRotate();

        **---- HOW I CAN CAPTURE THE TOTAL TIME OF VIDEOS ? ---
        ---  I NEED WAIT FOR THE FINISH OF THE addEventListener loadedmetadata ---- ?** 

        setInterval(function(){ myslider.playRotate(); },  HERE_MY_TOTAL_TIME_OF_VIDEOS);


    },

    playRotate : function(){

        for(i=0; i< $("div[class*='slider']").length ; i++) {

            video = $("div[class*='slider']")[i].children[0];
            video.counter = i;
            video.addEventListener('loadedmetadata', function(index) {

                console.log("The Video in position: "+this.counter+ " have a duration of:"+index.target.duration);

                **---- HOW I CAN CAPTURE THE TOTAL TIME OF VIDEOS  AND USE THIS IN A SETINTERVAL? ------**

                example :
                myslider.totalTimeOfVideos+=index.target.duration;

            });
        }

        **-- if i want print the  value of myslider.totalTimeOfVideos here --- -the value is  0 ----  i need wait for the result of addEventListener loadedmetadata ---- HOW ?**
        console.log(myslider.totalTimeOfVideos)

    }
}

    $(document).ready(function() {
        myslider.Sliderinit();

    });

** ---- КАК Я МОГУ ЗАПИСАТЬ ОБЩЕЕ ВРЕМЯ ВИДЕО? ---

--- Мне нужно дождаться FINI SH загруженных метаданных addEventListener ----?

---- КАК Я МОГУ ЗАПИСАТЬ ОБЩЕЕ ВРЕМЯ ВИДЕО И ПОЛЬЗОВАТЬСЯ ЭТОМ В SETINTERVAL? ------

- если я хочу напечатать здесь значение myslider.totalTimeOfVideos --- - значение равно 0 ----

    • - мне нужно дождаться результата загрузки метаданных addEventListener ---- КАК? **

1 Ответ

0 голосов
/ 22 января 2020

[ОБНОВЛЕНО] Используя обещания, мы можем предварительно загрузить метаданные видео и сохранить их в массиве. Здесь я использовал локальное хранилище для хранения временного массива и позже использовал его окончательную сумму. В противном случае мы получим 0 из-за асинхронности предварительной загрузки метаданных, которая еще не завершена!

Таким образом, вы можете отделить все это от вашего кода ползунка и просто использовать totalTime=(JSON.parse(localStorage.getItem('durations'))).reduce((a, b) => a + b, 0);
.

function Preload(){

var slides = document.querySelectorAll('video');    
    return new Promise(function (resolve) {
            var ready = 0;
            var videosDura = [];
            slides.forEach(function (v) {
                v.addEventListener('loadedmetadata', function () {
                    videosDura.push(Math.round(v.duration));
                    ready++;
                    localStorage.setItem("durations", JSON.stringify(videosDura));
                    if (ready === slides.length) {
                        $('.preloader').fadeOut('slow');
                        resolve();

                    }
                });
            });
        }).then(function () {
        console.log((JSON.parse(localStorage.getItem('durations'))).reduce((a, b) => a + b, 0));

        // Call any function dependant on this Variable

    });
}  


$(document).ready(function () {
Preload();
});

enter image description here enter image description here

Существует другой подход к проверке видео с использованием свойства videoObject.readyState .

В этой скрипке вы можете проверить ожидаемый результат.

Для производительности и оптимизации, учитывая пропускную способность, скорость загрузки страниц, совместимость и мобильные устройства ... Я предлагаю вам прочитать сначала эту статью во время работы над вашим реальным проектом.

Наилучший подход к использованию метаданных видео - использовать API для вызовов ajax или предварительно сохранить его на стороне сервера. Некоторые проекты мета-генератора на Github:

...