您可以利用供應商擴充媒體擷取器和媒體轉碼器元件
。MediaSession2 和 MediaParser API 無法自訂 (但您可以
我們能針對舊版 MediaPlayer
和 MediaSession
API 進行上游變更)。
如要在 Android 媒體架構中支援其他媒體類型,您必須: 建立自訂擷取器和解碼器。例如: 如要在 AVI 檔案中新增 Windows Media 影片的支援功能,您需要建立 AVI Extractor 和 Windows Media 影片解碼器。
關於擴充功能
如果預設媒體擷取器不符合需求
/system/lib[64]/extractors/
中的自訂擷取器外掛程式擷取器程序
從 Google 提供的 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。擷取工具應該
實作
frameworks/av/include/media/MediaExtractorPluginApi.h
,且可以使用 C++
便利的包裝函式
frameworks/av/include/media/MediaExtractorPluginHelper.h
。因為 Android
10 以上版本僅支援
擷取器 API,請務必為擷取器建立擷取器
最高的 API 版本號碼
將自訂擷取器放入 /system/lib/64/extractors
或供應商 APEX,
這個 API 會與包含 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)
如果您的自訂擷取器支援某個格式支援的格式
您可以依照
Sniff()
函式傳回信賴水準高於
由 Google 提供。
媒體架構載入擷取器時 (從 /system/lib/64/extractors
載入器)
或供應商 APEX),它就會辨識檔案,並取得其相關資訊
內容。下一步是為 格式新增解碼器
瞭解如何剖析檔案內容
建立自訂解碼器
對於尚未支援的任何格式,您需要自訂解碼器 Google 提供的解碼器。例如:
如要為含有 MP3 的 AVI 檔案新增媒體架構支援,您必須擁有 AVI 但不需要 MP3 解碼器,因此不需要 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
,預設使用。