16

与えられた周波数の方形波を生成し、AudioTrack を STREAM モード (STREAM_MUSIC) で使用して再生する簡単なアプリケーションを作成しました。すべてが正常に機能しているようで、サウンドも正常に再生されますが、ストリームが終了すると、ログに次のメッセージが表示されます。

W/AudioTrack( 7579): acquireBuffer() トラック 0x14c228 が無効になりました。再起動しています ...

stop() 関数を呼び出した後でも、これらを取得します。AudioTrack に必要な最小サイズ (私の場合は 6x1024) に基づいて、AudioTrack バッファー サイズを適切に設定したと思います。1024 ショートの小さなバッファーをフィードします。

これらを取得しても問題ありませんか?そのままにしておく必要がありますか?

4

4 に答える 4

15

わかりました、問題は解決したと思います。エラーは、バッファが時間どおりにデータで完全に満たされていない場合に生成されます(バッファアンダーラン)。タイムアウトが何であるかはわかりませんが、これが発生した場合は、次のことを確認してください。

  1. バッファにデータが入るまで、playメソッドを呼び出さないでください。

  2. タイムアウトに打ち勝つために十分な速度でデータを生成できます。

  3. バッファにデータを供給し終えた後、stop()メソッドを呼び出す前に、タイムアウトする前に「最後の」バッファがデータで完全に満たされていることを確認してください。

私は最後の問題に対処するために、常に少し待ってから(タイムアウトになるまで)、ゼロでいっぱいの1つのバッファーを送信し、最後にstop()関数を呼び出しました。

大きなチャンクの準備ができている場合でも、常に小さなチャンクでバッファを送信する必要があることに注意してください。それが正しい方法であるかどうか100%確信が持てないのはまだ少し気になりますが、エラーはなくなったので、私はそれで生きることができると思います:)

于 2011-12-10T04:21:50.667 に答える
5

バッファが技術的に十分に長く、バイトでいっぱいになっている場合でも、適切にフォーマットされていない場合 (バイト配列に変換されたオーディオ ショート)、そのエラーがスローされることがわかりました。

于 2012-04-02T20:59:19.630 に答える
4

Audiotrack をインスタンス化したときにその警告が表示され、呼び出され、呼び出しとのaudioTrack.play()間にわずかな遅延がありました。警告が消える直前に電話した場合。play()audioTrack.write()play()write()

于 2012-11-27T14:38:40.923 に答える
0

私はこれで解決しました

        if (mAudioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING)
            mAudioTrack.play();
        mAudioTrack.write(b, 0, sz * 2);
        mAudioTrack.stop();
        mAudioTrack.flush();
于 2015-10-17T14:03:22.837 に答える