0

openSLの 1 つで ES を使用していAndroid appsます。アプリがフォアグラウンドにある場合、コールバックはかなり規則的です。マイク コールバックは約 10 ミリ秒ごとに呼び出され、スピーカー コールバックも同様です。ただし、アプリをバックグラウンドに置いてブラウザー (または別のアプリ) を開くと、ブラウザーを開く (またはブラウジングする) ときにコールバックの「嵐」がトリガーされることがわかります。それを回避する方法はありますか?そして、なぜそれが起こるのですか?openSL は、コールバックを実行できなかった期間を補償していますか? (追いつこうとしているように)。

私のソースコードが入ってCいて、私はオンですJelly Bean 4.3.

AudioTrackとのスレッドの優先順位を上げようとしましたが、AudioRecorderそれが役立つようですが、それが正しい方法かどうかはわかりません。

追加の質問

つまり、スレッドの優先度を上げても、コールバックのバーストが発生する可能性があり、それらを破棄する必要があると言っているのですか?

それはどのように良い解決策ですか?マイク パケットをドロップする (またはスピーカー パケットのソースを排出する) ことになりますよね? マイク パケットをドロップしない場合、マイク パケットの受信者はマイク パケットのバーストを過度のジッターと解釈しますよね?

さらに重要なこと: AudioTrack と AudioRecorder のスレッド優先度を手動で上げ、sched ポリシーをラウンド ロビンに変更しました。ルート アクセスと BusyBox のインストールの両方が必要でした (これには、スレッドの優先度/スケジュール ポリシーを変更するためのコマンド ライン ユーティリティが付属しています)。これは C からプログラムでどのように行われますか? アプリ(プロセス)の優先度だけでなく、個々のスレッドの優先度が上がることを確認したいと思います。

4

1 に答える 1

1

はい、これは仕様です。スレッドの優先順位を高くしようとすることは、回避する正当な方法です。最適な結果を得るには、必ずネイティブのバッファ サイズとサンプリングを使用してください (「Android での低レイテンシ オーディオ再生」を参照)。コールバックが発生しないことを保証する方法がないため、コールバックのバーストを破棄する準備をしておく必要があります。また、アプリがバックグラウンドにある間は、アプリの全体的な CPU 消費と RAM フットスタンプを減らすように努める必要があります。

于 2013-12-18T17:51:46.210 に答える