オーディオ レイテンシを可能な限り低減するために、OpenSL ES 1.0.1 をベースとした Android ネイティブ オーディオの使用をおすすめします。
実装チェックリスト
Android ネイティブ オーディオは、次の手順で使用します。
-
Android NDK をダウンロードしてインストールします。このドキュメントの残りの部分では、
NDKroot
が NDK をインストールしたディレクトリであることを想定しています。 - サポート ドキュメントを確認します。
- API レベルが 9 以上であることを確認します。
- android.hardware.audio.low_latency の機能を確認します。
-
android.media.AudioManager.getProperty(java.lang.String) が返す推奨のネイティブ バッファサイズとサンプルレートを使用します。
注: 入力にも同じバッファサイズとサンプルレートを使用する必要があります。
- 通常、OpenSL ES のバッファ数は 1 とすれば十分です。
- CPU 使用率の急上昇や無制限のブロッキングが発生しないように、コールバック ハンドラを短く保ちます。優先度の逆転は回避してください。
- 入力コールバック ハンドラと出力コールバック ハンドラ間、およびコールバック ハンドラとアプリケーションの他の部分との通信が行われるようにするため、ノンブロッキング アルゴリズムの使用を検討します。
サポート ドキュメント
OpenSL ES 1.0.1
OpenSL 1.0.1 の仕様を確認する際には、PDF ビューアを使用してください。ドキュメントは膨大で関連性の低い内容も含まれますが、API の詳細について確認しておく必要があります。
注: このドキュメントには OpenSL ES 1.0.1 に関する説明の全文が記載されていますが、Android ネイティブ オーディオは実際には Android 固有の一部の拡張機能を搭載した OpenSL ES 1.0.1 のサブセットをベースとしています。
OpenSL ES の以降のバージョン(1.1 など)に関する説明が記載されたドキュメントについては、Android との関連性はありません。
OpenSL ES for Android
「OpenSL ES for Android」のドキュメントは NDK のインストールの際に提供されており、現在はオンラインでは入手できません。ブラウザで次のリンクを開きます。
NDKroot/docs/Additional_library_docs/opensles/index.html
ドキュメント全体にざっと目を通していただく程度で十分ですが、「プログラミング メモ」内の「パフォーマンス」については特に注意を払うようにしてください。
「OpenSL ES 1.0.1 でサポートされる機能」では、Android がサポートしているサブセットについて説明しています。
「Android 拡張機能」では、ベースとなる OpenSL ES 1.0.1 に含まれない Android 固有の拡張機能について説明しています。
OpenSL ES 1.0.1 との関係性
このベン図は、Android のネイティブ オーディオと OpenSL ES 1.0.1 との関係性を示しています。

図 1. ベン図
その他のリソース
source.android.com
サイト source.android.com は、主に Android デバイスをビルドする OEM と、OEM にコンポーネントを提供する SoC ベンダー向けに用意されています。
ただし、このサイトにはレイテンシに関する有用な情報が豊富に含まれているため、確認することをおすすめします。オーディオ レイテンシに掲載された記事をご覧ください。
android-ndk
Android ネイティブ オーディオの使い方について不明な点がある場合は、ディスカッション グループ android-ndk でご質問ください。
動画
- Android の高性能オーディオ(Google I/O 2013)
- この動画は全体がレイテンシに関するものです。
- Android で優れたマルチメディア エクスペリエンスを実現する(Google I/O 2014)
- 最初の 14 分間で、一般的な音声と特に入力レイテンシについて説明しています。
- オーディオ レイテンシ: バッファサイズ(Google Dev の 100 日間)
- オーディオ レイテンシ、バッファサイズ、タスク スケジューリングの関係を説明しています。