Personnaliser les composants multimédias

Vous pouvez étendre les composants de l'extracteur de média et du codec multimédia à l'aide d'extensions de fournisseur. Les API MediaSession2 et MediaParser ne peuvent pas être personnalisées (mais vous pouvez apporter des modifications en amont aux anciennes API MediaPlayer et MediaSession ).

Pour prendre en charge des types de médias supplémentaires dans le framework multimédia Android, vous devez créer un extracteur et un décodeur personnalisés. Par exemple, pour ajouter la prise en charge de la vidéo Windows Media dans les fichiers AVI, vous devez créer un extracteur AVI et un décodeur vidéo Windows Media.

À propos des extensions

Si les extracteurs de médias par défaut ne répondent pas à vos besoins, vous pouvez placer des plugins d'extracteur personnalisés dans /system/lib[64]/extractors/ . Le processus d'extraction charge automatiquement les plugins d'extraction à partir du package APEX fourni par Google et à partir de /system/lib[64]/extractors/ .

De même, vous pouvez configurer des services de codec multimédia personnalisés qui utilisent l'interface Codec 2.0 définie dans frameworks/av/media/codec2/core/ . Pour une implémentation de base, reportez-vous à frameworks/av/media/codec2/hidl/services/ . Le point d'entrée de la bibliothèque est l'interface C2ComponentStore . Pour un exemple, reportez-vous à l'implémentation du magasin de codecs logiciels par défaut sur frameworks/av/media/codec2/vndk/C2Store.cpp .

Lorsque vous utilisez votre propre APEX, structurez le service de codec et chargez le fichier APEX en utilisant les mêmes processus que le service mediaswcodec . Pour ce faire, définissez une bibliothèque partagée de niveau supérieur chargée d'enregistrer tous les composants C2, puis créez un package APEX (avec des dépendances transitives) qui réside dans la partition du fournisseur. Lorsque le processus du service de codec du fournisseur démarre, il peut alors charger ce point d'entrée de niveau supérieur.

Créer un extracteur

Lorsque vous ajoutez un extracteur pour un nouveau format, assurez-vous que l'extracteur dépend uniquement d'API NDK stables et ne dépend d'aucune API privée. Les extracteurs doivent implémenter l'API définie par frameworks/av/include/media/MediaExtractorPluginApi.h et peuvent utiliser les wrappers pratiques C++ dans frameworks/av/include/media/MediaExtractorPluginHelper.h . Étant donné qu'Android 10 ou version ultérieure ne prend en charge que la version la plus élevée de l'API de l'extracteur, veillez à modéliser votre extracteur d'après l'extracteur avec le numéro de version de l'API le plus élevé.

Placez les extracteurs personnalisés dans /system/lib/64/extractors ou dans un APEX du fournisseur, qui est ouvert avec le Google APEX contenant les extracteurs Google. Pour vérifier le framework chargé par votre extracteur, exécutez la commande suivante.

adb shell dumpsys media.extractor

Vous devriez obtenir une liste des extracteurs disponibles similaire à la suivante.

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)

Si votre extracteur personnalisé prend en charge un format déjà pris en charge par un extracteur fourni par Google, vous pouvez forcer le framework à utiliser votre extracteur en utilisant la fonction Sniff() pour renvoyer un niveau de confiance plus élevé que celui fourni par Google.

Lorsque le framework multimédia charge votre extracteur (à partir de /system/lib/64/extractors ou d'un fournisseur APEX), il reconnaît le fichier et obtient des informations sur son contenu. L'étape suivante consiste à ajouter un décodeur pour le format afin que le framework puisse comprendre comment analyser le contenu du fichier.

Créer un décodeur personnalisé

Vous avez besoin d'un décodeur personnalisé pour tout format qui n'est pas déjà pris en charge par un décodeur fourni par Google. Par exemple:

  • Pour ajouter la prise en charge du framework multimédia pour les fichiers AVI contenant des MP3, vous avez besoin d'un extracteur AVI mais pas d'un décodeur MP3 car il en existe déjà un.

  • Pour ajouter la prise en charge du framework multimédia pour les fichiers AVI contenant Windows Media, vous avez besoin à la fois d'un extracteur AVI et d'un décodeur Windows Media.

L'ajout d'un nouveau décodeur est similaire à l'ajout de vos propres décodeurs matériels pour AVC ou HEVC.

Bien que l'extracteur publie le type MIME des pistes multimédias qu'il contient, les codecs prenant en charge ces types MIME doivent être présents pour que le fichier soit entièrement pris en charge. La chaîne de type MIME réellement utilisée est strictement un accord entre l'extracteur et le codec (la chaîne n'a pas besoin d'être ajoutée au fichier MediaDefs.h ).

Intégration au scanner multimédia

Le scanner multimédia recherche de nouveaux types de fichiers et les ajoute à la base de données multimédia. Pour que le scanner multimédia gère votre type de fichier personnalisé, il doit le connaître. Sous Android 10 ou version ultérieure, MimeUtils (dans libcore ) gère le mappage MIME vers extension. Auparavant, ce mappage était géré dans le fichier MediaFile.java , qui continue de contenir un mappage du type MIME vers les constantes du format MTP.

Un extracteur peut exporter une liste d'extensions de nom de fichier qu'il prend en charge (telles que MP3 ou MP4). Cependant, seul LegacyMediaScanner l'utilise ; cela n'a aucun effet sur ModernMediaScanner , utilisé par défaut.