メディア

Android Media HAL アイコン

Android には、ネイティブ レベルのメディア再生エンジンである Stagefright が内蔵されています。これには、一般的なメディア形式に対応するソフトウェアベースのコーデックが組み込まれています。

Stagefright の音声と動画の再生機能には、OpenMAX コーデック、セッション管理、時間同期レンダリング、トランスポート制御、DRM との統合が含まれています。

Stagefright は、カスタム ハードウェア コーデックとの統合もサポートしています。メディアのエンコードとデコードにハードウェア パスを設定するには、ハードウェア ベースのコーデックを OpenMax IL(統合レイヤ)コンポーネントとして実装する必要があります。

注: Stagefright の更新は、Android の月次セキュリティ アップデートのプロセスと Android OS リリースの一部として行われます。

アーキテクチャ

メディア アプリは、次のアーキテクチャに従って Android のネイティブ マルチメディア フレームワークと通信します。

Android のメディア アーキテクチャ

図 1:メディア アーキテクチャ

アプリケーション フレームワーク
アプリケーション フレームワーク レベルには、android.media API を利用してマルチメディア ハードウェアと通信するアプリケーション コードがあります。
Binder IPC
Binder IPC プロキシは、プロセスの境界を越えた通信を容易にします。 これらは frameworks/av/media/libmedia ディレクトリにあり、「I」の文字で始まります。
ネイティブ マルチメディア フレームワーク
Android はネイティブ レベルで、音声と動画の記録や再生に Stagefright エンジンを使用するマルチメディア フレームワークを提供します。Stagefright にはデフォルトでサポートされているソフトウェア コーデックがあります。また、OpenMax の統合レイヤ標準を使用して独自のハードウェア コーデックを実装できます。実装について詳しくは、frameworks/av/media にある MediaPlayer コンポーネントと Stagefright コンポーネントをご覧ください。
OpenMAX 統合レイヤ(IL)
OpenMAX IL は、コンポーネントと呼ばれるカスタム ハードウェア ベースのマルチメディア コーデックを Stagefright が認識して使用するための標準化された方法を提供します。OpenMAX プラグインは、libstagefrighthw.so という名前の共有ライブラリの形式で作成する必要があります。このプラグインは、Stagefright とカスタム コーデック コンポーネントをリンクしますが、このコンポーネントは OpenMAX IL コンポーネント標準に従って実装する必要があります。

カスタム コーデックを実装する

Stagefright には一般的なメディア形式用のソフトウェア コーデックが組み込まれていますが、独自のカスタム ハードウェア コーデックを OpenMAX コンポーネントとして追加することもできます。このためには、OMX コンポーネントと、カスタム コーデックを Stagefright フレームワークと一緒にフックする OMX プラグインを作成する必要があります。コンポーネントの例については hardware/ti/omap4xxx/domx/ を、Galaxy Nexus のサンプル プラグインについては hardware/ti/omap4xx/libstagefrighthw をご覧ください。

カスタム コーデックを追加するには:

  1. コンポーネントを OpenMAX IL コンポーネント標準に従って作成します。コンポーネント インターフェースは、frameworks/native/include/media/OpenMAX/OMX_Component.h ファイル内にあります。OpenMAX IL の仕様について詳しくは、OpenMAX のウェブサイトをご覧ください。
  2. 作成したコンポーネントと Stagefright サービスをリンクする OpenMAX プラグインを作成します。プラグインを作成するインターフェースについては、ヘッダー ファイル frameworks/native/include/media/hardware/OMXPluginBase.hHardwareAPI.h をご覧ください。
  3. 自作プロダクトの Makefile で、プラグインを libstagefrighthw.so という名前の共有ライブラリとしてビルドします。次に例を示します。
    LOCAL_MODULE := libstagefrighthw
    

    デバイスの Makefile で、このモジュールが PRODUCT_PACKAGES の 一つとして宣言されていることを確認します。

    PRODUCT_PACKAGES += \
      libstagefrighthw \
      ...
    

コーデックをフレームワークに公開する

Stagefright サービスは、system/etc/media_codecs.xmlsystem/etc/media_profiles.xml を解析し、デバイスでサポートされているコーデックとプロファイルを android.media.MediaCodecList および android.media.CamcorderProfile クラスを通じてアプリ デベロッパーに知らせます。両方のファイルを device/<company>/<device>/ ディレクトリに作成し、デバイスの Makefile でシステム イメージの system/etc ディレクトリにコピーする必要があります。次に例を示します。

PRODUCT_COPY_FILES += \
  device/samsung/tuna/media_profiles.xml:system/etc/media_profiles.xml \
  device/samsung/tuna/media_codecs.xml:system/etc/media_codecs.xml \

完全な例については、device/samsung/tuna/media_codecs.xmldevice/samsung/tuna/media_profiles.xml をご覧ください。

注: Android 4.1 以降、メディア コーデック用の <Quirk> 要素はサポートされなくなりました。