Personnalisation des composants multimédias

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Vous pouvez étendre les composants de l'extracteur multimé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 modifier en amont les anciennes API MediaPlayer et MediaSession ).

Pour prendre en charge des types de médias supplémentaires dans le cadre 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 plug-ins d'extracteurs 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 à 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 dans 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 responsable de l'enregistrement de tous les composants C2, puis créez un package APEX (avec des dépendances transitives) qui réside dans la partition fournisseur. Lorsque le processus de service de codec fournisseur démarre, il peut alors charger ce point d'entrée de niveau supérieur.

Création d'un extracteur

Lors de l'ajout d'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 de commodité C++ dans frameworks/av/include/media/MediaExtractorPluginHelper.h . Étant donné qu'Android 10 ou supérieur ne prend en charge que la version la plus élevée de l'API d'extraction, assurez-vous de modéliser votre extracteur après l'extracteur avec le numéro de version d'API le plus élevé.

Placez les extracteurs personnalisés dans /system/lib/64/extractors ou un fournisseur APEX, 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 à 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 supérieur à 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éation d'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 de la structure multimédia pour les fichiers AVI contenant des MP3, vous avez besoin d'un extracteur AVI, mais vous n'avez pas besoin d'un décodeur MP3 car il en existe déjà un.

  • Pour ajouter la prise en charge de la structure 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.

Pendant que l'extracteur publie le type MIME des pistes multimédias qu'il contient, les codecs qui prennent 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éelle 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 avec le 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é, le scanner doit le connaître. Dans Android 10 ou supérieur, MimeUtils (dans libcore ) maintient le mappage MIME-extension. Auparavant, ce mappage était géré dans le fichier MediaFile.java , qui contient toujours un mappage du type MIME aux constantes de format MTP.

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