Android オーディオ アーキテクチャとテクノロジーの選択

1.アンドロイドオーディオアーキテクチャ

Android システムは、4 つのレベルのオーディオ API を提供します。

1.Java レイヤー MediaRecorder&MediaPlayer シリーズ;
2.Java レイヤー AudioTrack&AudioRecorder シリーズ;
3.Jni レイヤー opensles;
4.JNI レイヤー AAudio (Android O で導入)

この古典的な Android システム アーキテクチャ図から始めましょう。
ここに画像の説明を挿入します
この図から、Android システム全体は下から上に次の 4 つの層に分割されます。
1. Linux カーネル
2. ハードウェア アダプテーション層
3. フレームワーク層 (Java 層に分割可能)
4. APP 層上記
で紹介した 4 つのレベルのオーディオ API 実装はすべて Framework 層にありますが、他の層のオーディオ関連の機能は何でしょうか? 特定の API を呼び出すときに、最終的にハードウェアを動作させるにはどうすればよいでしょうか? まず、システムの各層のオーディオ関連モジュールと機能を見てみましょう。
ここに画像の説明を挿入します
1.1 Java レイヤー
Java レイヤーは、オーディオ ハードウェアと対話するための android.media API を提供します。内部的には、このコードは適切な JNI クラスを呼び出して、オーディオ ハードウェアと対話するネイティブ コードにアクセスします。

- ソースコードディレクトリ: Frameworks/base/media/java/android/media/

  • AudioManager: ボリューム管理、AudioFocus 管理、オーディオ デバイス管理、およびモード管理を含むオーディオ マネージャー。
  • 録音: AudioRecord、MediaRecorder;
  • 再生: AudioTrack、MedaiPlayer、SoundPool、ToneGenerator;
  • コーデック: MediaCodec、オーディオおよびビデオ データ コーデック インターフェイス。

1.2 JNI 層
android.media に関連付けられた JNI コードは、下位レベルのネイティブ コードを呼び出してオーディオ ハードウェアにアクセスできます。JNI は、frameworks/base/core/jni/ および Frameworks/base/media/jni にあります。
AAudio インターフェイスと OpenSLES インターフェイスがここで呼び出されます。

1.3 ネイティブ フレームワーク ネイティブ フレームワーク層
Java 層でも JNI 層でも、それらは外部に提供されるインターフェイスにすぎず、実際の実装はネイティブ フレームワーク層にあります。ネイティブ フレームワークは、android.media パッケージと同等のネイティブを提供します。このパッケージは、Binder IPC プロキシを呼び出して、メディア サーバーのオーディオ固有のサービスにアクセスします。ネイティブ フレームワーク コードは、frameworks/av/media/libmedia または Frameworks/av/media/libaudioclient にあります (場所はバージョンによって異なります)。

1.4 Binder IPC
Binder IPC エージェントは、プロセス境界を越えた通信を容易にするために使用されます。エージェントは Frameworks/av/media/libmedia または Frameworks/av/media/libaudioclient にあり、文字「I」で始まります。

1.5 オーディオ サーバー
オーディオ システムは、Android でのオーディオ データのストリーミングと制御機能を担当し、オーディオ デバイスの管理も担当します。この部分は Android のオーディオ システムの入出力レベルとして機能し、一般に PCM サウンド出力の再生と外部からの PCM サウンドの取得、およびサウンド デバイスと設定の管理を担当します (注: ここではデコード機能は実装されていません)。 Android システムでは、オーディオとビデオのデコードは opencore または stagefright によって完了し、デコード後にオーディオ システム インターフェイスが呼び出され、オーディオ ストリームを作成して再生されます。オーディオ サービスは、Android N (7.0) より前にメディアサーバーに存在していました。Android N は、オーディオサーバーの形式で存在し始めました。これらのオーディオ サービスは、HAL 実装と対話する実際のコードです。メディア サーバーは、frameworks/av/services/audioflinger および Frameworks/av/services/audiopolicy にあります。

オーディオ サービスには、AudioFlinger と AudioPolicyService が含まれます。

  • AudioFlinger: オーディオ ストリーミング デバイスの管理と、オーディオ ストリーム データの処理と送信、音量計算、リサンプリング、ミキシング、音響効果などを主に担当します。
  • AudioPolicyService: 主にオーディオ ポリシー関連、音量調整効果、デバイスの選択、オーディオ チャンネルの選択などを担当します。

1.6 HAL レイヤ
HAL は、オーディオ サービスによって呼び出される標準インターフェイスを定義し、オーディオ ハードウェア機能の正常な動作を保証するために携帯電話が実装する必要があります。オーディオ HAL インターフェイスは、hardware/libhardware/include/hardware にあります。詳細については、audio.h を参照してください。

1.7 カーネル ドライバー層
オーディオ ドライバーは、ハードウェアおよび HAL 実装と対話します。Advanced Linux Audio Architecture (ALSA)、Open Sound System (OSS)、またはカスタム ドライバー (HAL はドライバーに依存しない) を使用できます。

注: ALSA を使用している場合は、互換性のあるライセンスがあるため、ドライバーのユーザー部分に external/tinyalsa を使用することをお勧めします (標準のユーザー モード ライブラリは GPL に基づいてライセンスされています)。

2. テクノロジーの選択とそのメリット・デメリット

Android システムは、SDK および NDK レイヤーでさまざまなオーディオ レンダリング メソッドを開発者に提供します。各レンダリング メソッドは、実際にはさまざまなシナリオ向けに設計されています。開発作業で最適に使用できるように、各メソッドのベスト プラクティスを理解する必要があります。

SDK層でのオーディオレンダリング

  • MediaPlayer: ローカルの音楽ファイルやオンライン ストリーミング メディア ファイルをバックグラウンドで長時間再生するのに適しています。オーディオとビデオの両方を再生できるエンドツーエンドのプレーヤーに相当します。そのパッケージング レベルは比較的高く、その用途は比較的単純です。
  • SoundPool: エンドツーエンドのオーディオ プレーヤーでもあり、利点は次のとおりです: レイテンシが低く、インタラクティブなフィードバック サウンドのあるシーンに適しており、ゲーム サウンド、ボタン サウンド、着信音クリップなどの比較的短いオーディオ クリップの再生に適しています。など。複数のオーディオを同時に再生できます。
  • AudioTrack: PCM データに直接対応するオーディオ レンダリング API であるため、非常に強力な制御機能を提供する下位レベルの API でもあり、低遅延の再生やストリーミング オーディオ レンダリングなどのシナリオに適しています。 PCM データへのレンダリングのため、通常はデコーダと組み合わせて使用​​する必要があります。

NDK レイヤーでのオーディオ レンダリング
Android システムは、NDK レイヤー (ネイティブ レイヤーによって提供される API、つまり C または C++ レイヤーによって呼び出すことができる API) で一般的に使用される 2 セットのオーディオ レンダリング メソッド、つまり OpenSL を提供します。 ES と AAudio はどちらも Android 用で、低遅延シナリオ (リアルタイム イヤー モニター、RTC、リアルタイム フィードバック インタラクション) 向けに設計されています。一緒に見てみましょう。

  • OpenSL ES: これは、Khronos Group によって開発された OpenSL ES API 仕様の実装です。Android での低レイテンシおよび高性能オーディオ シナリオ専用です。API インターフェイスの設計は、いくぶんわかりにくく複雑になります。現在、Google はこれを提供していません新しいアプリケーションには OpenSL ES を使用することを開発者に推奨します。ただし、Android 8.0 システムおよび一部の断片化された Android デバイスでは互換性が優れているため、このオーディオ レンダリング方法を習得することも非常に重要です。
  • AAudio: 低遅延、高性能オーディオ アプリケーション向けに特別に設計されています。API 設計は合理化されています。新しいアプリケーションでオーディオを構築するために Google が推奨するアプリケーション インターフェイスです。このオーディオ レンダリング方法をマスターし、このオーディオ レンダリング機能を既存のアプリケーションに追加することは非常に有益です。ただし、Android 8.0以降にのみ適しており、一部のブランドの特別なROMバージョンでは適応性が特に良くありません。

次の点に注意が必要です。

  1. NDK レイヤーの 2 セットのオーディオ レンダリング メソッドは、さまざまな Android バージョンに適しており、さまざまなシナリオに適用できます。
  2. PCM をレンダリングする最も一般的な方法は AudioTrack です。
  3. AudioTrack は Android SDK レイヤーによって提供される最下位レベルのオーディオ再生 API であるため、PCM 生データのみの入力が許可されます。MediaPlayer と比較すると、圧縮オーディオ ファイル (MP3、AAC など) の場合、開発者はデコード操作とバッファ制御を実装する必要があります。

おすすめ

転載: blog.csdn.net/weixin_45719581/article/details/131231558