2011-07-07 10 views
3

私は単純なアプリケーションを繰り返し使用しています。デスクトップのブラウザ、ipads、iphoneなどでうまくいきます。Android 2.3.3を実行しているモバイルデバイスでは、初めてサウンドを再生するときにplay()メソッドを呼び出した直後に聞きますが、その後の呼び出しでは顕著で可変の遅延。JavaScriptでオーディオ要素のplay()メソッドを呼び出すと、Androidブラウザが各play()の後にHTML5オーディオ要素をアンロードして、遅延を引き起こします。

私はいくつかのスルーチューニングを行い、play()メソッドが呼び出されるたびにデバイスがサーバーからオーディオファイルを取得していることがわかりました。オーディオ要素のload()メソッドを呼び出して、各演奏後にリロードして、次の演奏のためにキューイングすることができますが、そのバンドエイドにはいくつかの問題があります。私は本当に、再生を終了するとすぐにブラウザをアンロードするのではなく、永久にロードされたオーディオ要素を保つようにしたいと思います。それが可能なら誰でも知っていますか?

EDIT:もう少し調べてみましたが、サウンドを再生した後、ブラウザがそのサウンドを再フェッチせずに再生しなくても、オーディオ要素の読み取り値はHAVE_ENOUGH_DATAのままですサーバーから。これはバグだと思う。私はreadystateを使って、再生した後にアンロードするブラウザを検出し、必要に応じて明示的にロードすることを望んだが、うまくいかない。

答えて

5

私が実験した回数が多いほど、Android 2.3.3のHTML5オーディオタグの実装では、より粗いエッジが見つかりました。私がテスト用に使っているDroid Xの携帯電話には、そこにたくさんの壊れたものがあります。

私がこれまで考えてきたことは、元の質問で言及されたバンドエイドです:play()の呼び出しが完了するとすぐに、load()メソッドを呼び出して次のプレイを準備します):

if (navigator.userAgent.toLowerCase().indexOf("android") > -1) 
    audElt.addEventListener('ended', function() { 
    var t = setTimeout(function() { audElt.load(); }, 1000); 
    }, false); 

私は単純に負荷を呼び出す()メソッドは、Chromeで問題を作成し、非Androidのシステム上のサーバーへの不要なトリップを生成するので、Androidのユーザーエージェントに回避策を制限しなければなりませんでした。

「終了」ハンドラからload()を呼び出すだけで再生が中断されたため、実際には「終了」していないため、1秒の遅延を追加する必要がありました。

もちろん、サーバーからのサウンドは繰り返し取り出されていますので、複数回連続してサウンドを再生しようとすると、すばやく動きが遅くなります。

0

私が見つけた最高のソリューション。もう1つの選択肢は、ビデオタグを使用することですが、それにもいくつかの問題があります。実装するのに十分なほどうまくいくものはありません。

幸運にも私は電話の隙間を使用していますので、私は彼らのオーディオメソッドを撮影します。

0

updatetimepause()に再生を1秒間バインドしてから、オーディオの最後に到達してから巻き戻してから、もう一度再生することができます。 Androidはオーディオをフラッシュしません。

関連する問題