1

RTP レシーバーを実装しています。UDP パケットを受信し、コーデックをデコードし、PCM サンプルをAudioTrack再生用に書き込みます。問題AudioTrack.writeはブロックしているようで、その間に UDP パケットを見逃すことになります。

この問題に対処する方法に関する既知の解決策はありますか?

オーディオ データと に独自のバッファを使用してみましsetNotificationMarkerPositionたが、audioTrack は、バッファがある程度いっぱいになると再生され、マーカー位置に到達することはなく、audioTrack.write再びブロックされるようになります。

audioTrack.pause()また、各書き込みの前に、もう一度試してみ.play()ましたが、音質に著しく影響を与えるようです.

4

2 に答える 2

3

問題が解決したかどうかわかりませんが、問題があります。私ができる最善の方法は、スレッド内の UDP パケットを ArrayBlockingQueue(ABQ) に取得し、ABQ から 1 つずつ取得する別のスレッドでそれらを再生することです。しかし、今回は再生に問題があり(すべてのデバイスではなく、一部のデバイスはダブルスレッドでクールです)、ABQのサイズが大きくなり、遅延が増加します。だから私はサイズをチェックし、遅延を減らすためにいくつかのパケットを体系的にドロップします (単純に AudioTrack に書き込まないでください)。

もう1つ、スレッドの優先度を上げています:

private class Player extends Thread {
  public void run() {
     Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO );
       ....
  }
}

これにより、速度が向上します。

ソリューションはまだブロックしていますが、UDP パケットは、ABQ サイズがその容量として増加するまでプレーヤーによってブロックされません。

于 2013-02-25T18:56:27.790 に答える