Personalizzare i componenti multimediali

Puoi estendere i componenti estrattore di contenuti multimediali e codec multimediale utilizzando il fornitore estensioni. Le API MediaSession2 e MediaParser non possono essere personalizzate, ma puoi eseguire modifiche a monte per le API MediaPlayer e MediaSession precedenti.

Per supportare altri tipi di contenuti multimediali nel framework multimediale Android, devi creare un estrattore e un decodificatore personalizzati. Ad esempio: per aggiungere il supporto per i video Windows Media nei file AVI, devi creare un'immagine Extractor e un Decoder video Windows Media.

Informazioni sulle estensioni

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

Analogamente, puoi configurare servizi di codec multimediali personalizzati che utilizzano l'interfaccia Codec 2.0 definita in frameworks/av/media/codec2/core/. Per una configurazione base per l'implementazione, fai riferimento a frameworks/av/media/codec2/hidl/services/. Il punto di ingresso della libreria è l'interfaccia C2ComponentStore. Per un esempio, consulta la pagina relativa all'implementazione predefinita dello store di codec software frameworks/av/media/codec2/vndk/C2Store.cpp.

Quando utilizzi il tuo APEX, struttura il servizio codec e carica il file APEX utilizzando le stesse procedure del servizio mediaswcodec. A questo scopo, definisci libreria condivisa di primo livello responsabile della registrazione di tutti i componenti C2, crea un pacchetto APEX (con dipendenze transitive) che risiede nel fornitore della partizione di testo. Quando viene avviato il processo del servizio codec del fornitore, può caricare questo di primo livello.

Crea un estrattore

Quando aggiungi un'estrazione per un nuovo formato, assicurati che l'estrattore dipenda solo da API NDK stabili e non da API private. Gli estrattori devono a implementare l'API definita frameworks/av/include/media/MediaExtractorPluginApi.h e può usare il linguaggio C++ wrapper di convenienza 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 all'estrattore con il numero di versione dell'API più alto.

Posiziona gli estrattori personalizzati in /system/lib/64/extractors o nell'APEX di un fornitore, che viene aperto insieme all'APEX Google contenente gli estrattori Google. Per verificare che il framework abbia caricato l'estrattore, esegui il seguente 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 il tuo 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 confidenza superiore rispetto 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 riceve informazioni contenuti. Il passaggio successivo consiste nell'aggiungere un decoder per il formato in modo che il framework possa a capire come analizzare i contenuti del file.

crea un decoder personalizzato

È necessario un decodificatore personalizzato per qualsiasi formato non già supportato da un decodificatore fornito da Google. Ad esempio:

  • Per aggiungere il supporto del framework multimediale per i file AVI contenenti MP3, è necessario un estrattore AVI, ma non è necessario 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'estrazione AVI sia di un decodificatore Windows Media.

L'aggiunta di un nuovo decodificatore è simile all'aggiunta dei tuoi decodificatori hardware per AVC o HEVC.

Mentre l'estrattore pubblica il tipo MIME delle tracce multimediali che i codec che supportano questi tipi MIME devono essere presenti per completamente supportato. L'effettiva stringa di tipo MIME utilizzata è strettamente l'accordo tra l'estrattore e il codec (la stringa non deve essere aggiunto al file MediaDefs.h).

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 la mappatura MIME-all'estensione. In precedenza, questa mappatura veniva gestita nel file MediaFile.java, che continua a contenere una mappatura dal tipo MIME alle costanti di formato MTP.

Un'estrazione può esportare un elenco di estensioni dei nomi di file supportate (ad esempio MP3 o MP4). Tuttavia, viene utilizzato solo da LegacyMediaScanner e non ha alcun effetto su ModernMediaScanner, che viene utilizzato per impostazione predefinita.