Personnaliser les composants multimédias

Vous pouvez étendre les composants d'extracteur et de codec multimédias à l'aide d'extensions de fournisseur. Les API MediaSession2 et MediaParser ne peuvent pas être personnalisées (mais vous pouvez mettre en amont des modifications pour les 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 que les vidéos Windows Media soient prises en charge 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 multimédias par défaut ne répondent pas à vos exigences, vous pouvez placer des plug-ins d'extraction personnalisés dans /system/lib[64]/extractors/. Le processus d'extraction charge automatiquement les plug-ins d'extraction à partir du package APEX fourni par Google et 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, consultez frameworks/av/media/codec2/hidl/services/. Le point d'entrée de la bibliothèque est l'interface C2ComponentStore. Pour obtenir un exemple, consultez l'implémentation du dépôt de codecs logiciels par défaut à l'adresse 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 premier niveau 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 de service du codec du fournisseur démarre, il peut 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 qu'il ne dépend que des API NDK stables et qu'il 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 de commodité C++ dans frameworks/av/include/media/MediaExtractorPluginHelper.h. Étant donné qu'Android 10 ou version ultérieure n'est compatible qu'avec la version la plus récente de l'API d'extraction, veillez à modéliser votre extracteur après celui qui possède le numéro de version d'API le plus élevé.

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

adb shell dumpsys media.extractor

Vous devriez obtenir une liste des extracteurs disponibles semblable à ce qui suit.

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é est compatible avec un format déjà compatible avec un extracteur fourni par Google, vous pouvez forcer le framework à utiliser votre extracteur en utilisant la fonction Sniff() pour renvoyer un niveau de confiance supérieur à celui fourni par Google.

Lorsque le framework multimédia charge votre extracteur (à partir de /system/lib/64/extractors ou d'un APEX du fournisseur), 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à compatible avec un décodeur fourni par Google. Exemple :

  • Pour ajouter la compatibilité avec Media Framework pour les fichiers AVI contenant le format 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 décodeur est semblable à 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 compatibles avec ces types MIME doivent être présents pour que le fichier soit entièrement compatible. La chaîne de type MIME utilisée est strictement un accord entre l'extracteur et le codec (il n'est pas nécessaire d'ajouter la chaîne au fichier MediaDefs.h).

Intégrer à Media Scanner

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

Un extracteur peut exporter une liste des extensions de nom de fichier compatibles (par exemple, MP3 ou MP4). Toutefois, seul LegacyMediaScanner l'utilise. Cela n'a aucun effet sur ModernMediaScanner, qui est utilisé par défaut.