2

I'm trying to to write a javascript app that use the [SoundManager 2][1] api and aim to run in all desktop and mobile browsers. On the iPad platform, Soundmanager is using the HTML5 audio api since there is on flash support. Now, when I'm trying to play two audio files back to back, both loaded in response to a click event, a [HTML5::stalled][2] event is occasionally raised. How do I set an event handler to catch the stalled event?

Since sound objects in my app are created on the fly and I don't know how to access directly to tags that are created by SoundManager, I tried to use a delegate to handle the stalled event:

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

It doesn't work. the event did not raised in respond to stalled. (I had an alert in my handler).

Also tried to use [Sound::onsuspend()][3] to listen for stalled, but onsuspend pops out on the end of sound::play(). How can we distinguish between stalled and other events that may raise the audio::suspend? Is there any other way to access the tags that SoundManager must create in order to play HTML audio?

4

2 に答える 2

0

以下の解決策で解決しました。これは文書化されておらず、リバース エンジニアリングによって検出されません。_a の下で利用できる html オーディオ オブジェクトにアクセスすることがすべてです。

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

メソッドの本体は、 Safari での html5 ストールしたコールバックに関するこの投稿に基づいています。

于 2014-12-15T19:54:07.950 に答える
0

プラットフォーム (samsung smart TV) を使用する html5 で使用する別の「修正」を提案できます。

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

これは、Flash とは異なり、html5 では「readystate」プロパティが「1」をスキップしてほぼ瞬時に「0」から「3」にジャンプするため機能します。(トラックがバッファリングを開始した場合、それは再生可能です...)。

これがあなたにとってもうまくいくことを願っています。

于 2015-06-14T19:57:45.547 に答える