如何从声音管理器绑定HTML5::stalled事件



我正在尝试编写一个使用 [SoundManager 2][1] API 的 JavaScript 应用程序,旨在运行所有桌面和移动浏览器。在iPad平台上,Soundmanager正在使用HTML5音频api,因为有flash支持。现在,当我尝试背靠背播放两个音频文件时,这两个文件都是为了响应单击事件而加载的,偶尔会引发 [HTML5::stalled][2] 事件。如何设置事件处理程序以捕获停止的事件?

由于我的应用程序中的声音对象是动态创建的,并且我不知道如何直接访问由 SoundManager 创建的标签,因此我尝试使用委托来处理停止的事件:

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

它不起作用。 该事件没有因停滞而提出。(我的处理程序中有一个警报)。

还尝试使用 [Sound::onsuspend()][3] 来侦听停滞,但 onsuspend 弹出在声音的末尾::p lay()。 我们如何区分停滞和其他可能引发音频::暂停的事件? 有没有其他方法可以访问SoundManager必须创建的标签才能播放HTML音频?

我用以下解决方案解决了它。这没有被记录下来,也没有通过逆向工程发现。这一切都是关于访问 html 音频对象,该对象可在 _a 下使用。

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

该方法的主体基于这篇关于 html5 在 safari 中停滞回调的文章

我可以建议一个不同的"修复",我使用html5的平台(三星智能电视):

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

这是有效的,因为在html5中,与flash不同,"readystate"属性几乎立即从"0"跳到"3",跳过"1"。(因为如果曲目开始缓冲,它就可以播放......

希望这对你也有用。

最新更新