自定義媒體組件

您可以使用供應商擴展來擴展媒體提取器和媒體編解碼器組件。該MediaSession2和MediaParser API,不能自定義(但可以為上游遺留變化MediaPlayerMediaSession的API)。

為了支持在Android媒體框架其他媒體類型,你需要創建一個自定義的提取解碼器。例如,添加AVI文件的Windows Media視頻的支持,你需要創建一個AVI提取和Windows Media視頻解碼器

關於擴展

如果默認媒體提取不符合您的要求,您可以將自定義的提取插件在/system/lib[64]/extractors/ 。提取過程中從谷歌提供的APEX包自動加載提取器插件和從/system/lib[64]/extractors/

同樣,您可以設置自定義介質使用中定義的編解碼器2.0接口編解碼器服務frameworks/av/media/codec2/core/ 。對於基本實現,請參閱frameworks/av/media/codec2/hidl/services/ 。該庫的入口點是C2ComponentStore接口。舉一個例子,指的是在默認的軟件編解碼器存儲實現frameworks/av/media/codec2/vndk/C2Store.cpp

當使用自己的APEX,結構編解碼器服務,並使用相同的過程裝載APEX文件mediaswcodec服務。為此,定義一個負責註冊所有 C2 組件的頂級共享庫,然後創建一個駐留在供應商分區中的 APEX 包(具有可傳遞的依賴項)。當供應商編解碼器服務進程啟動時,它可以加載這個頂級入口點。

創建提取器

為新格式添加提取器時,請確保提取器僅依賴於穩定的 NDK API,不依賴於任何私有 API。提取器應該實現所規定的API frameworks/av/include/media/MediaExtractorPluginApi.h ,並且可以在使用C ++更便利的包裝frameworks/av/include/media/MediaExtractorPluginHelper.h 。由於 Android 10 或更高版本僅支持提取器 API 的最高版本,因此請務必按照具有最高 API 版本號的提取器建模您的提取器。

地方定制提取在/system/lib/64/extractors或供應商APEX,其與包含谷歌提取的谷歌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)

如果您的自定義提取器支持已經由谷歌提供的提取所支持的格式,你可以強制框架通過使用您提取Sniff()函數返回一個更高的置信水平比谷歌提供的一個。

當媒體框架加載你的提取(從/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 ,其默認情況下使用。