ベンダー拡張機能を使用して Media extractor コンポーネントと Media codec コンポーネントを拡張できます。MediaSession2 API と MediaParser API はカスタマイズできません(ただし、以前の MediaPlayer
API と MediaSession
API については変更をアップストリームできます)。
Android メディア フレームワークで追加のメディアタイプをサポートするには、カスタムの extractor と decoder を作成する必要があります。たとえば、AVI ファイルで Windows Media Video のサポートを追加するには、AVI Extractor と Windows Media Video Decoder を作成する必要があります。
拡張機能について
デフォルトの Media extractor が要件を満たさない場合は、カスタムの extractor プラグインを /system/lib[64]/extractors/
に配置できます。extractor のプロセスは、Google 提供の APEX パッケージと /system/lib[64]/extractors/
から extractor プラグインを自動的に読み込みます。
同様に、frameworks/av/media/codec2/core/
で定義された Codec 2.0 インターフェースを使用するカスタムの Media codec サービスも設定できます。基本的な実装については、frameworks/av/media/codec2/hidl/services/
を参照してください。ライブラリのエントリ ポイントは C2ComponentStore
インターフェースです。具体的な例については、frameworks/av/media/codec2/vndk/C2Store.cpp
でデフォルトのソフトウェア コーデック ストアの実装をご覧ください。
独自の APEX を使用する場合は、コーデック サービスを構成し、mediaswcodec
サービスと同じプロセスを使用して APEX ファイルを読み込みます。それには、すべての C2 コンポーネントの登録を処理するトップレベルの共有ライブラリを定義し、ベンダー パーティションにある APEX パッケージを(推移的な依存関係で)作成します。ベンダー コーデック サービスのプロセスが開始すると、このトップレベルのエントリ ポイントを読み込むことができます。
extractor の作成
新しい形式の extractor を追加する場合は、安定した NDK API のみに依存し、非公開 API には依存しないようにしてください。extractor は frameworks/av/include/media/MediaExtractorPluginApi.h
によって定義された API を実装する必要があり、frameworks/av/include/media/MediaExtractorPluginHelper.h
で C++ の便利なラッパーを使用できます。Android 10 以降では最新バージョンの extractor API のみがサポートされているため、必ず API バージョン番号が最も大きい extractor をモデルとして extractor を作成してください。
カスタムの extractor を /system/lib/64/extractors
またはベンダーの APEX に配置します。これらは、Google の extractor を含む Google APEX と同時に開きます。フレームワークが extractor を読み込んだことを確認するには、次のコマンドを実行します。
adb shell dumpsys media.extractor
次のように、利用可能な extractor のリストが返されます。
Available extractors:
AAC Extractor: plugin\_version(2), uuid(4fd80eae03d24d729eb948fa6bb54613), version(1), path(/system/lib64/extractors/libaacextractor.so)
AMR Extractor: plugin\_version(2), uuid(c86639c92f3140aca715fa01b4493aaf), version(1), path(/system/lib64/extractors/libamrextractor.so)
FLAC Extractor: plugin\_version(2), uuid(1364b048cc454fda9934327d0ebf9829), version(1), path(/system/lib64/extractors/libflacextractor.so)
MIDI Extractor: plugin\_version(2), uuid(ef6cca0af8a243e6ba5fdfcd7c9a7ef2), version(1), path(/system/lib64/extractors/libmidiextractor.so)
MP3 Extractor: plugin\_version(2), uuid(812a3f6cc8cf46deb5293774b14103d4), version(1), path(/system/lib64/extractors/libmp3extractor.so)
MP4 Extractor: plugin\_version(2), uuid(27575c6744174c548d3d8e626985a164), version(2), path(/system/lib64/extractors/libmp4extractor.so)
MPEG2-PS/TS Extractor: plugin\_version(1), uuid(3d1dcfebe40a436da574c2438a555e5f), version(1), path(/system/lib64/extractors/libmpeg2extractor.so)
Matroska Extractor: plugin\_version(2), uuid(abbedd9238c44904a4c1b3f45f899980), version(1), path(/system/lib64/extractors/libmkvextractor.so)
Ogg Extractor: plugin\_version(2), uuid(8cc5cd06f772495e8a62cba9649374e9), version(1), path(/system/lib64/extractors/liboggextractor.so)
WAV Extractor: plugin\_version(3), uuid(7d61385858374a3884c5332d1cddee27), version(1), path(/system/lib64/extractors/libwavextractor.so)
カスタムの extractor が、Google 提供の extractor がサポートしている形式をすでにサポートしている場合、Sniff()
関数を使用して Google 提供の extractor よりも高い信頼度を返すようにすることで、フレームワークで強制的にカスタムの extractor を使用できます。
メディア フレームワークが extractor を(/system/lib/64/extractors
またはベンダー APEX から)読み込むと、そのファイルを認識してコンテンツに関する情報を取得します。次に、その形式のデコーダを追加して、フレームワークがファイル コンテンツを解析する方法を理解できるようにします。
カスタム デコーダの作成
Google が提供するデコーダでサポートされていない形式には、カスタム デコーダが必要です。次に例を示します。
MP3 を含む AVI ファイルのメディア フレームワーク サポートを追加するには、AVI Extractor が必要です。ただし、MP3 デコーダはすでに存在するため必要ありません。
Windows Media を含む AVI ファイルのメディア フレームワーク サポートを追加するには、AVI Extractor と Windows Media デコーダの両方が必要です。
新しいデコーダを追加する方法は、AVC や HEVC に独自のハードウェア デコーダを追加する場合と同様です。
extractor がメディア トラックの MIME タイプを公開している場合、ファイルが完全にサポートされるよう、これらの MIME タイプをサポートするコーデックが存在する必要があります。使用される実際の MIME タイプの文字列は、extractor とコーデックで完全に一致する必要があります。(文字列を MediaDefs.h
ファイルに追加する必要はありません)。
メディア スキャナとの統合
メディア スキャナは新しいファイル形式を探して、メディア データベースに追加します。
カスタムのファイル形式をメディア スキャナが処理するには、スキャナにそれを認識させる必要があります。Android 10 以降では、MimeUtils
(libcore
内)で MIME から拡張機能へのマッピングが維持されます。以前は、このマッピングは MediaFile.java
ファイルで処理されていました。このファイルには MIME タイプから MTP 形式の定数へのマッピングが引き続き含まれます。
extractor は、サポートしているファイル拡張子(MP3 や MP4 など)のリストをエクスポートできます。ただし、これは LegacyMediaScanner
のみが使用します。デフォルトで使用される ModernMediaScanner
には影響しません。