Можно ли синхронизировать два видео на веб-странице без плагинов? - PullRequest
7 голосов
/ 16 апреля 2010

Есть ли способ использовать два тега видео HTML5 на странице и синхронизировать видео? Это означает, что если первое видео идет через 15,2 секунды, то второе видео идет за 15,2 секунды?

Я оглянулся и нашел SMIL, но похоже, что это работает только в IE. Я также пытался реализовать что-то свое с помощью jQuery и jMediaElement, но, похоже, во многих случаях видео может не синхронизироваться.

Было ли это сделано раньше?

Ответы [ 4 ]

4 голосов
/ 23 января 2013

Демонстрация, представленная на html5demos, работает, но она может легко выйти из синхронизации.

Вот статья, в которой предлагается решение, использующее requestAnimationFrame (информация о нем: Leaner, Meaner, FasterАнимации с requestAnimationFrame , Анимация с помощью javascript: от setInterval до requestAnimationFrame ) и это намного лучше: HTML5 Video: синхронизация воспроизведения двух видео .

Обратите внимание, чтопредоставленная там демонстрация (размещенная на jsfiddle) имеет неверную ссылку на источник js.Я обновил его на этой новой странице:

http://jsfiddle.net/aqUNf/1/

Помните о поддержке браузера, эта функция поддерживается Firefox, Chrome, а также из Safari 6 и IE 10 (см. таблица для получения более подробной информации).В противном случае он возвращается к setInterval, ведьма не обеспечивает такое же преимущество в производительности и экономии батареи.

(Кстати, он использует Popcorn.js , что является действительно хорошим проектомMozilla)

А вот код (прямо взят из демоверсии):

var videos = {
    a: Popcorn("#a"),    
    b: Popcorn("#b"), 

},
scrub = $("#scrub"),
loadCount = 0, 
events = "play pause timeupdate seeking".split(/\s+/g);

// iterate both media sources
Popcorn.forEach( videos, function( media, type ) {

    // when each is ready... 
    media.listen( "canplayall", function() {

        // trigger a custom "sync" event
        this.trigger("sync");

        // set the max value of the "scrubber"
        scrub.attr("max", this.duration() );

    // Listen for the custom sync event...    
    }).listen( "sync", function() {

        // Once both items are loaded, sync events
        if ( ++loadCount == 2 ) {

            // Iterate all events and trigger them on the video B
            // whenever they occur on the video A
            events.forEach(function( event ) {

                videos.a.listen( event, function() {

                    // Avoid overkill events, trigger timeupdate manually
                    if ( event === "timeupdate" ) {

                        if ( !this.media.paused ) {
                            return;
                        } 
                        videos.b.trigger( "timeupdate" );

                        // update scrubber
                        scrub.val( this.currentTime() );

                        return;
                    }

                    if ( event === "seeking" ) {
                        videos.b.currentTime( this.currentTime() );
                    }

                    if ( event === "play" || event === "pause" ) {
                        videos.b[ event ]();
                    }
                });
            });
        }
    });
});

scrub.bind("change", function() {
    var val = this.value;
    videos.a.currentTime( val );
    videos.b.currentTime( val );
});

// With requestAnimationFrame, we can ensure that as 
// frequently as the browser would allow, 
// the video is resync'ed.
function sync() {
    videos.b.currentTime( 
        videos.a.currentTime()        
    );
    requestAnimFrame( sync );
}

sync();
1 голос
/ 18 апреля 2010

Единственный способ воспроизвести видео вообще без плагинов - это HTML5 или SVG . Не существует надежного способа синхронизации двух видео в формате HTML5, но если точная синхронизация не является критичной, вы, вероятно, можете подойти довольно близко, просто вызвав play () одновременно или вызвав play () и pause () для двух видео. чтобы получить их в приблизительной синхронизации, как намекает Симеон.

Что касается SVG , у SVG уже есть небольшое (и измененное) подмножество SMIL, поэтому он может уже поддерживаться в спецификации, но, насколько мне известно, ни один браузер не справится с этим правильно.

0 голосов
/ 20 апреля 2010

Нашел это. Это было на http://html5demos.com.

Оформить заказ демо .. отлично работает (ну почти) на Chrome для меня.

Источник доступен на странице.

0 голосов
/ 20 апреля 2010

Похоже, что даже у Opera есть эта проблема (10 марта 2010):

В настоящее время нет хорошего API для синхронизации вещей с временной шкалой видео , например, подписей или информационных блоков. Спецификация ранее имела для этого «диапазоны контрольных точек» (которые даже раньше были «контрольными точками»); ожидается, что нечто подобное будет добавлено в будущем

http://dev.opera.com/articles/view/everything-you-need-to-know-about-html5-video-and-audio/

Кстати, статья действительно интересная, и, возможно, вы найдете в ней несколько полезных советов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...