Puoi estendere i componenti estrattore di contenuti multimediali e codec multimediali utilizzando le estensioni del fornitore. Le API MediaSession2 e MediaParser non possono essere personalizzate (ma puoi
eseguire l'upstream delle modifiche per le API legacy MediaPlayer
e MediaSession
).
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 Windows Media Video.
Informazioni sulle estensioni
Se gli estrattori di contenuti multimediali predefiniti non soddisfano i tuoi requisiti, puoi inserire
plugin di estrazione 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/
.
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/
. Il punto di ingresso della libreria è l'interfaccia C2ComponentStore
. Per un esempio, consulta
l'implementazione predefinita dell'archivio dei codec software all'indirizzo
frameworks/av/media/codec2/vndk/C2Store.cpp
.
Quando 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 si trova nella partizione del fornitore. Quando viene avviato il processo del servizio di codec del fornitore, 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 da API private. Gli estrattori devono
implementare l'API definita da
frameworks/av/include/media/MediaExtractorPluginApi.h
e possono utilizzare i wrapper
di convenienza C++ in
frameworks/av/include/media/MediaExtractorPluginHelper.h
. Poiché Android
10 o versioni successive supporta solo la versione più recente dell'API
Extractor, assicurati di modellare l'estrattore in base a quello con il
numero di versione 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 questo comando.
adb shell dumpsys media.extractor
Dovresti visualizzare un elenco degli 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 confidenza 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 sul suo
contenuto. Il passaggio successivo consiste nell'aggiungere un decoder per il formato in modo che il framework possa
comprendere come analizzare il contenuto del file.
Crea un decoder personalizzato
È necessario un decodificatore personalizzato per qualsiasi formato non 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 un decoder MP3 perché ne esiste già uno.
Per aggiungere il supporto del framework multimediale per i file AVI contenenti Windows Media, devi disporre sia di un estrattore AVI sia di un decodificatore Windows Media.
L'aggiunta di un nuovo decodificatore è simile all'aggiunta dei tuoi decodificatori hardware per AVC o HEVC.
Sebbene l'estrattore pubblichi il tipo MIME delle tracce multimediali che contiene, i codec che supportano questi tipi MIME devono essere presenti per supportare completamente il file. La stringa del tipo MIME effettivamente utilizzata è strettamente un
accordo tra l'estrattore e il codec (la stringa non deve essere
aggiunta al file MediaDefs.h
).
Integrazione con lo scanner multimediale
Lo scanner multimediale cerca nuovi tipi di file e li aggiunge al database multimediale.
Per fare in modo che lo scanner multimediale gestisca il tuo tipo di file personalizzato, lo scanner deve
conoscerlo. In Android 10 o versioni successive, MimeUtils
(in
libcore
) gestisce la mappatura MIME-estensione. In precedenza, questo mapping veniva
gestito nel file MediaFile.java
, che continua a contenere un mapping dai
tipi MIME alle costanti di formato MTP.
Un estrattore può esportare un elenco di estensioni dei nomi dei file supportate (ad esempio MP3
o MP4). Tuttavia, solo LegacyMediaScanner
lo utilizza e non ha effetto su
ModernMediaScanner
, che viene utilizzato per impostazione predefinita.