自訂媒體元件

您可以使用供應商擴充功能來擴展媒體提取器和媒體編解碼器元件。 MediaSession2 和 MediaParser API 無法自訂(但您可以將舊版MediaPlayerMediaSession API 的變更上傳到上游)。

為了支援 Android 媒體框架中的其他媒體類型,您需要建立自訂的提取器解碼器。例如,要在 AVI 檔案中新增對 Windows Media 影片的支持,您需要建立 AVI Extractor和 Windows Media video Decoder

關於擴充

如果預設媒體擷取器無法滿足您的要求,您可以將自訂擷取器外掛程式放置在/system/lib[64]/extractors/中。提取器程序自動從 Google 提供的 APEX 套件和/system/lib[64]/extractors/載入提取器插件。

同樣,您可以設定使用frameworks/av/media/codec2/core/中定義的 Codec 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 中,該供應商 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沒有影響。