Personalizzare i componenti multimediali

Puoi estendere i componenti estrattore di contenuti multimediali e codec multimediale utilizzando le estensioni del fornitore. Le API MediaSession2 e MediaParser non possono essere personalizzate (ma puoi eseguire l'upstream delle modifiche per le API MediaPlayer e MediaSession legacy).

Per supportare tipi di media aggiuntivi nel framework multimediale Android, devi creare un estrattore e un decoder personalizzati. Ad esempio, per aggiungere il supporto per i video Windows Media nei file AVI, devi creare un Extractor AVI e un Decoder video Windows Media.

Informazioni sulle estensioni

Se gli estrattori di contenuti multimediali predefiniti non soddisfano i tuoi requisiti, puoi inserire in /system/lib[64]/extractors/ plug-in per estrattori personalizzati. Il processo di estrazione carica automaticamente i plug-in degli estrattori dal pacchetto APEX fornito da Google e da /system/lib[64]/extractors/.

Allo stesso modo, puoi configurare servizi codec multimediali personalizzati che utilizzano l'interfaccia Codec 2.0 definita in frameworks/av/media/codec2/core/. Per un'implementazione di base, consulta frameworks/av/media/codec2/hidl/services/. Il punto di ingresso della libreria è l'interfaccia C2ComponentStore. Ad esempio, fai riferimento all'implementazione predefinita dello store di codec software all'indirizzo frameworks/av/media/codec2/vndk/C2Store.cpp.

Se utilizzi il tuo APEX, struttura il servizio codec e carica il file APEX utilizzando gli stessi processi del servizio mediaswcodec. Per farlo, definisci una libreria condivisa di primo livello responsabile della registrazione di tutti i componenti C2, quindi crea un pacchetto APEX (con dipendenze transitive) che risiede nella partizione del fornitore. All'avvio del processo del servizio codec del fornitore, questo può caricare questo punto di ingresso di primo livello.

Crea un estrattore

Quando aggiungi un estrattore per un nuovo formato, assicurati che dipenda solo da API NDK stabili e non dipenda da API private. Gli estrattori devono implementare l'API definita da frameworks/av/include/media/MediaExtractorPluginApi.h e possono utilizzare i convenience wrapper C++ in frameworks/av/include/media/MediaExtractorPluginHelper.h. Poiché Android 10 o versioni successive supporta solo la versione più recente dell'API Exctor, assicurati di modellare l'estrattore in base a quello con il numero di versione API più elevato.

Inserisci gli estrattori personalizzati in /system/lib/64/extractors o nell'APEX del fornitore, che viene aperto insieme all'APEX Google contenente gli estrattori di Google. Per verificare che il framework abbia caricato l'estrattore, esegui questo comando.

adb shell dumpsys media.extractor

Dovresti ottenere un elenco di estrattori disponibili simile al seguente.

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)

Se l'estrattore personalizzato supporta un formato già supportato da un estrattore fornito da Google, puoi forzare il framework a utilizzare l'estrattore utilizzando la funzione Sniff() per restituire un livello di confidenza più elevato rispetto a quello fornito da Google.

Quando il framework multimediale carica l'estrattore (da /system/lib/64/extractors o dall'APEX di un fornitore), riconosce il file e riceve informazioni sul suo contenuto. Il passaggio successivo consiste nell'aggiungere un decoder per il formato in modo che il framework possa capire come analizzare il contenuto del file.

crea un decoder personalizzato

È necessario un decodificatore personalizzato per qualsiasi formato non già supportato da un decodificatore fornito da Google. Ecco alcuni esempi:

  • Per aggiungere il supporto del framework multimediale per i file AVI contenenti MP3, hai bisogno di un estrattore AVI, ma non di un decodificatore MP3 perché ne esiste già uno.

  • Per aggiungere il supporto del framework multimediale per i file AVI contenenti Windows Media, hai bisogno sia di un estrattore AVI sia di un decoder Windows Media.

L'aggiunta di un nuovo decoder è simile ad aggiungere i tuoi decoder hardware per AVC o HEVC.

Mentre l'estrattore pubblica il tipo MIME delle tracce multimediali che contiene, i codec che supportano questi tipi MIME devono essere presenti affinché il file sia completamente supportato. La stringa di tipo MIME effettiva utilizzata è strettamente un accordo tra l'estrattore e il codec (non è necessario aggiungere la stringa al file MediaDefs.h).

Integrazione con scanner di contenuti multimediali

Lo scanner multimediale cerca nuovi tipi di file e li aggiunge al database multimediale. Affinché lo scanner multimediale gestisca il tuo tipo di file personalizzato, deve esserne a conoscenza. In Android 10 o versioni successive, MimeUtils (in libcore) mantiene la mappatura da MIME all'estensione. In precedenza, questa mappatura era gestita nel file MediaFile.java, che continua a contenere un mapping dal tipo MIME alle costanti del formato MTP.

Un estrattore può esportare un elenco di estensioni di nomi file supportate (ad esempio MP3 o MP4). Tuttavia, solo LegacyMediaScanner lo utilizza; non ha alcun effetto su ModernMediaScanner, che è stato utilizzato per impostazione predefinita.