自訂媒體元件

您可以使用供應商擴充功能擴充媒體擷取器和媒體轉碼器元件。您無法自訂 MediaSession2 和 MediaParser API (但可以針對舊版 MediaPlayerMediaSession API 進行上游變更)。

如要在 Android 媒體架構中支援其他媒體類型,您必須建立自訂擷取器解碼器。舉例來說,如要在 AVI 檔案中新增對 Windows Media 影片的支援功能,您必須建立 AVI Extractor 和 Windows Media 影片解碼器

關於擴充功能

如果預設媒體擷取器不符合您的需求,您可以在 /system/lib[64]/extractors/ 中放置自訂擷取器外掛程式。擷取器程序會從 Google 提供的 APEX 套件和 /system/lib[64]/extractors/ 自動載入擷取器外掛程式。

同樣地,您也可以將自訂媒體轉碼器服務設為使用 frameworks/av/media/codec2/core/ 中定義的轉碼器 2.0 介面。如需基本實作,請參閱 frameworks/av/media/codec2/hidl/services/。程式庫進入點是 C2ComponentStore 介面。如需範例,請參閱 frameworks/av/media/codec2/vndk/C2Store.cpp 中的預設軟體轉碼器儲存庫實作項目。

使用自己的 APEX 時,請使用與 mediaswcodec 服務相同的程序建構轉碼器服務並載入 APEX 檔案。為此,請定義負責註冊所有 C2 元件的頂層共用資料庫,然後建立位於供應商分區中的 APEX 套件 (含遞移依附元件)。廠商轉碼器服務程序啟動後,即可載入這個頂層進入點。

建立擷取器

為新格式新增擷取器時,請確認擷取器僅依附於穩定版 NDK API,而且不需依賴私人 API。擷取器應實作 frameworks/av/include/media/MediaExtractorPluginApi.h 定義的 API,且可在 frameworks/av/include/media/MediaExtractorPluginHelper.h 中使用 C++ 便利包裝函式。由於 Android 10 以上版本僅支援擷取器 API 的最高版本,因此請務必在 API 版本號碼最高的擷取器後建立擷取器。

請將自訂擷取器放入 /system/lib/64/extractors 或供應商 APEX,這個供應商與包含 Google 擷取器的 Google APEX 一併開啟。如要確認架構是否載入擷取器,請執行下列指令。

adb shell dumpsys media.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)

如果您的自訂擷取器支援 Google 提供的擷取工具支援的格式,您就可以使用 Sniff() 函式傳回高於 Google 提供的信賴水準,強制要求架構使用擷取器。

媒體架構載入擷取器 (從 /system/lib/64/extractors 或供應商 APEX) 時,會辨識檔案並取得其內容相關資訊。下一步是為格式新增解碼器,讓架構瞭解如何剖析檔案內容。

建立自訂解碼器

Google 提供的解碼器尚未支援任何格式,您都需要自訂解碼器。舉例來說:

  • 如要為含有 MP3 的 AVI 檔案新增媒體架構支援,您需要 AVI 生成器,但由於此函式已存在,因此不需要 MP3 解碼器。

  • 如要為包含 Windows Media 的 AVI 檔案新增媒體架構支援,您需要 AVI 擷取器和 Windows Media 解碼器。

新增解碼器與新增 AVC 或 HEVC 的硬體解碼器類似。

雖然擷取器會發布所包含媒體音軌的 MIME 類型,但必須具有支援這些 MIME 類型的轉碼器,才能對檔案提供完整支援。實際使用的 MIME 類型字串是在擷取器與轉碼器之間嚴格協議 (不需要將字串加入 MediaDefs.h 檔案)。

與媒體掃描器整合

媒體掃描程式會尋找新的檔案類型,並新增至媒體資料庫。掃描器必須知道,媒體掃描器才能處理自訂檔案類型。在 Android 10 以上版本中,MimeUtils (在 libcore 中) 會維護 MIME 與擴充功能的對應。此對應先前是在 MediaFile.java 檔案中處理,該檔案繼續包含 MIME 類型與 MTP 格式常數的對應關係。

擷取器可匯出支援的檔案名稱副檔名清單 (例如 MP3 或 MP4)。不過,只有 LegacyMediaScanner 會使用該值;而不會影響預設使用的 ModernMediaScanner