オーディオ レイテンシを可能な限り低減するには、Oboe の使用をおすすめします。
Oboe
Oboe はネイティブ オーディオを使用しており、Android 8.1 以降では AAudio 上に、それ以前のバージョンの Android では OpenSL ES 上に構築されます。デバイスのレイテンシを可能な限り低減するには、setPerformanceMode(oboe::PerformanceMode::LowLatency)
と setSharingMode(oboe::SharingMode::Exclusive)
を設定します。
Oboe の詳細については、スタートガイド、README.md
、完全ガイドをご覧ください。Oboe を使用したサンプルアプリについては、サウンドボード アプリをご参照ください。
注: AudioTrack を使用して、レイテンシの影響を受けやすいアプリケーション向けの出力オーディオ ストリームを Java で作成する場合は、PERFORMANCE_MODE_LOW_LATENCY
モードを使用してください。
実装チェックリスト
Android ネイティブ オーディオは、次の手順で使用します。
- Android NDK をダウンロードしてインストールします。
- Oboe のスタートガイドに沿って操作します。
-
Oboe ビルダーで
setPerformanceMode(oboe::PerformanceMode::LowLatency)
とsetSharingMode(oboe::SharingMode::Exclusive)
を呼び出します。 - android.media.AudioManager.getProperty(java.lang.String) が返す推奨のネイティブ バッファサイズとサンプルレートを使用します。
注: 入力にも同じバッファサイズとサンプルレートを使用する必要があります。
- CPU 使用率の急上昇や無制限のブロッキングが発生しないように、コールバック ハンドラを短く保ちます。優先度の逆転は回避してください。
- 入力コールバック ハンドラと出力コールバック ハンドラ間、およびコールバック ハンドラとアプリケーションの他の部分との通信が行われるようにするため、ノンブロッキング アルゴリズムの使用を検討します。
その他のリソース
source.android.com
サイト source.android.com は、主に Android デバイスをビルドする OEM と、OEM にコンポーネントを提供する SoC ベンダー向けに用意されています。
ただし、このサイトにはレイテンシに関する有用な情報が豊富に含まれているため、確認することをおすすめします。オーディオ レイテンシに掲載された記事をご覧ください。
android-ndk
Android ネイティブ オーディオの使い方について不明な点がある場合は、ヘルプグループ android-ndk でご質問ください。
Oboe のバグを報告する
Oboe の使用時に問題が起きた場合は、バグを報告してください。
動画
- Oboe スタートガイド
- Low Latency Audio - Because Your Ears Are Worth It
- Android Dev Summit 2018
- Winning on Android - How to optimize an Android audio app
- Android Developer Challenge 2018
- Android の高性能オーディオ(Google I/O 2013)
- この動画は全体がレイテンシに関するものです。
- Android で優れたマルチメディア エクスペリエンスを実現する(Google I/O 2014)
- 最初の 14 分間で、一般的な音声と特に入力レイテンシについて説明しています。
- オーディオ レイテンシ: バッファサイズ(Google Dev の 100 日間)
- オーディオ レイテンシ、バッファサイズ、タスク スケジューリングの関係を説明しています。