Personalizza componenti multimediali,Personalizza componenti multimediali

È possibile estendere i componenti di estrazione multimediale 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 legacy MediaPlayer e MediaSession ).

Per supportare tipi multimediali aggiuntivi 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, è necessario creare un estrattore AVI e un decodificatore video Windows Media.

A proposito di estensioni

Se gli estrattori 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 plugin di estrazione dal pacchetto APEX fornito da Google e da /system/lib[64]/extractors/ .

Allo stesso modo, è possibile impostare servizi di codec multimediali personalizzati che utilizzano l'interfaccia Codec 2.0 definita in frameworks/av/media/codec2/core/ . Per un'implementazione di base, fare riferimento a frameworks/av/media/codec2/hidl/services/ . Il punto di ingresso della libreria è l'interfaccia C2ComponentStore . Per un esempio, fare riferimento all'implementazione dell'archivio codec software predefinito in 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 fare ciò, definire una libreria condivisa di livello superiore responsabile della registrazione di tutti i componenti C2, quindi creare un pacchetto APEX (con dipendenze transitive) che risiede nella partizione del fornitore. Quando viene avviato il processo del servizio codec del fornitore, può quindi caricare questo punto di ingresso di livello superiore.

Crea un estrattore

Quando aggiungi un estrattore per un nuovo formato, assicurati che l'estrattore 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 pratici C++ in frameworks/av/include/media/MediaExtractorPluginHelper.h . Poiché Android 10 o versioni successive supportano solo la versione più recente dell'API di estrazione, assicurati di modellare il tuo estrattore secondo l'estrattore con il numero di versione API più alto.

Posiziona 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 il framework caricato nell'estrattore, esegui il comando seguente.

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 più elevato rispetto a quello fornito da Google.

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

Crea un decodificatore personalizzato

È necessario un decoder personalizzato per qualsiasi formato che non sia già supportato da un decoder fornito da Google. Per esempio:

  • Per aggiungere il supporto del framework multimediale per file AVI contenenti MP3, è necessario un estrattore AVI ma non è necessario 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 che un decoder Windows Media.

L'aggiunta di un nuovo decoder è simile all'aggiunta dei propri decoder 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 affinché il file sia completamente supportato. L'effettiva stringa di tipo MIME utilizzata è strettamente un accordo tra l'estrattore e il codec (non è necessario aggiungere la stringa al file MediaDefs.h ).

Integrazione con 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 tipo di file personalizzato, è necessario che lo scanner ne sia a conoscenza. In Android 10 o versioni successive, MimeUtils (in libcore ) mantiene la mappatura da MIME a estensione. In precedenza, questa mappatura veniva gestita nel file MediaFile.java , che continua a contenere una mappatura dal tipo MIME alle costanti del formato MTP.

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