Personalizzare i componenti multimediali

Puoi estendere i componenti dell'estrattore multimediale e del 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 contenuti multimediali 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 estrattore AVI e un decoder video Windows Media .

Informazioni sulle estensioni

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

Allo stesso modo, puoi configurare servizi di 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/. L'entry point della libreria è l'interfaccia C2ComponentStore. Per un esempio, consulta l'implementazione predefinita dell'archivio dei codec software in frameworks/av/media/codec2/vndk/C2Store.cpp.

Quando utilizzi il tuo APEX, struttura il servizio di codec e carica il file APEX utilizzando le stesse procedure 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. Quando viene avviato il processo del servizio di codec del fornitore, può caricare questo entry point di primo livello.

Creare un estrattore

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

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

adb shell dumpsys media.extractor

Dovresti visualizzare 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 il tuo estrattore utilizzando la funzione Sniff() per restituire un livello di affidabilità superiore a quello fornito da Google.

Quando il framework multimediale carica l'estrattore (da /system/lib/64/extractors o da un APEX del fornitore), riconosce il file e ottiene informazioni sui suoi contenuti. Il passaggio successivo consiste nell'aggiungere un decoder per il formato in modo che il framework possa comprendere come analizzare i contenuti del file.

Creare un decoder personalizzato

Hai bisogno di un decoder personalizzato per qualsiasi formato non ancora supportato da un decoder fornito da Google. Ad esempio:

  • Per aggiungere il supporto del framework multimediale per i file AVI contenenti MP3, è necessario un estrattore AVI, ma non un decoder MP3 perché ne esiste già uno.

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

L'aggiunta di un nuovo decoder è simile all'aggiunta dei 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 per il supporto completo del file. La stringa del tipo MIME effettiva utilizzata è rigorosamente un accordo tra l'estrattore e il codec (la stringa non deve essere aggiunta al file MediaDefs.h).

Eseguire l'integrazione con lo scanner multimediale

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 conoscerlo. In Android 10 o versioni successive, MimeUtils (in libcore) gestisce il mapping da MIME a estensione. In precedenza, questo mapping veniva gestito 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 dei nomi file supportate (ad esempio MP3 o MP4). Tuttavia, solo LegacyMediaScanner lo utilizza; non ha alcun effetto su ModernMediaScanner, che viene utilizzato per impostazione predefinita.