Как привязать событие HTML5::stalled от soundmanager?

Я пытаюсь написать приложение javascript, которое использует API [SoundManager 2][1] и стремится работать во всех настольных и мобильных браузерах. На платформе iPad Soundmanager использует аудио API HTML5, так как есть поддержка флэш-памяти. Теперь, когда я пытаюсь воспроизвести два аудиофайла подряд, оба загружаются в ответ на событие click, иногда возникает событие [HTML5::stalled][2]. Как настроить обработчик событий для перехвата остановленного события?

Поскольку звуковые объекты в моем приложении создаются на лету, и я не знаю, как получить прямой доступ к тегам, созданным SoundManager, я попытался использовать делегата для обработки зависшего события:

    document.delegate('audio', 'stalled', function (event) {...});

Это не работает. событие не возникло в ответ на остановку. (У меня было предупреждение в моем обработчике).

Также пытался использовать [Sound::onsuspend()][3] для прослушивания зависания, но onsuspend выскакивает в конце sound::play(). Как мы можем отличить остановку от других событий, которые могут вызывать audio::suspend? Есть ли другой способ получить доступ к тегам, которые SoundManager должен создать для воспроизведения аудио в формате HTML?


person Ron Zukerman    schedule 19.08.2012    source источник


Ответы (2)


Я решил это с помощью следующего решения. Это не задокументировано и обнаружено путем реверс-инжиниринга. Все дело в доступе к объекту html audio, который доступен в разделе _a.

currentSound = soundManager.createSound({..});
currentSound._a.addEventListener('stalled', function() {
     if (!self.currentSound) return;
    var audio = this;
    audio.load();
    audio.play();
});

Тело метода основано на этом сообщении о остановленном обратном вызове html5 в сафари.

person Simon Fakir    schedule 15.12.2014

Я могу предложить другое «исправление», которое я использую с html5, используя платформу (Samsung Smart TV):

var mySound = soundManager.createSound({..});  
mySound.load();  
setTimeout(function() {
    if (mySound.readyState == 1) {
        // this object is probably stalled
        }
}, 1500);

Это работает, поскольку в html5, в отличие от flash, свойство «readystate» почти мгновенно переходит от «0» к «3», пропуская «1». (потому что, если трек начал буферизоваться, его можно воспроизвести...).

Надеюсь, это сработает и для вас.

person Yehuda Shaoshvili    schedule 14.06.2015