3

Android で Ogg Vorbis サウンドを再生する際に奇妙な問題が発生し、修正が困難です。SoundPool クラスを使用してサウンドを再生しています。一時停止後に再生する最初の音を除いて、うまく機能します。

私が直面している問題は次のとおりです。いくつかのボタンがあるメニューがあります。ボタンを押すとカチカチ音がします。しかし、初めて再生しようとすると、音が出ません。次に、同じメニューボタンをもう一度押すと、機能します。その後、次のプレスを数秒間遅らせると、問題が再発します。具体的には、次の動作が見られます。

  • 数秒待つ
  • 音を発するはずのUIボタンをタッチする...音を発しない
  • log cat は、「AudioFlinger: 書き込みが 165 ミリ秒ブロックされ、書き込みが 66 回遅延し、スレッド 0xec40」と報告します (UI ボタン​​を押すとすぐに発生します)
  • 数秒待つ
  • log cat は、「AudioHardwareQSD: AudioHardware pcm の再生がスタンバイに移行中です」と報告します。
  • 音を発するはずのUIボタンをタッチします...音を発しません。
  • logcat が「AudioFlinger: 書き込みが 166 ミリ秒ブロックされ、書き込みが 67 回遅延し、スレッド 0xec40」と報告する (UI ボタン​​を押すとすぐに発生する)
  • UI ボタン​​をもう一度タッチしますが、AudioHardwareQSD スタンバイ メッセージが表示される前に... SOUND WORKS!

HTC Incredible、ルート化された Nook Color、HTC Thunderbolt など、いくつかの異なるデバイスでこの動作を確認したので、デバイス固有のものではないと思います。

これは AudioHardwareQSD がスタンバイ状態になる機能だと思います。スタンバイ状態になると、シュートからの最初のサウンドは無視されますが、その後のサウンドは再びスタンバイ状態になるまで機能します。HTC Incredible では、「書き込みがブロックされました」というメッセージと AudioHardwareQSD メッセージの間に約 3 秒の遅延があります。

これが起こらないようにするために WakeLock を使用することについて説明している StackOverflow here に関する回答があります。その解決策を試しましたが、問題は解決しませんでした。

なぜこうなった?AudioHardwareQSD がスタンバイ状態にならないようにする方法はありますか? これをトラブルシューティングするためのヒントはありますか?

ありがとう!

更新: この問題を修正するかなり大雑把な回避策を実装することができました。私のアプリケーション (ゲーム) には、より健全なレンダリング クラスがあります。ゲーム ロジックによって定期的に実行される新しいメソッド present() を追加しました。このメソッドは、1.5 秒のタイムアウト タイマーを使用します。タイマーが底をつくと、サウンド レンダラーは 50 ミリ秒の無音で構成されるオーディオ ファイルを再生し、タイマーをリセットします。

これで問題が解決しました...最適とはほど遠いですが、機能します。

4

4 に答える 4

1

Android SoundPool は本当に最悪です。私はしなければならない

  int streamid = soundPool.play(sid, soundVolume, soundVolume, 0, loopVal, 1.0f);
  if (streamid == 0) {
    try {
     Thread.sleep(50);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
  }
} while(streamid == 0 && retry++<3);

しかし、これは理想的ではありません。実際にフレームレートが遅くなります。

于 2012-05-18T02:06:26.657 に答える
0

バックグラウンド スレッドで SoundPool を初期化し、SoundPool.OnLoadCompleteListener を設定して、準備ができたときに通知を受け取ることができます。

例も見てください:アイテムがクリックされたときに特定のサウンドを再生する必要があります

于 2016-02-29T13:14:42.153 に答える