Sie können die Komponenten „Media Extractor“ und „Media Codec“ mit Anbietererweiterungen erweitern. Die APIs „MediaSession2“ und „MediaParser“ können nicht angepasst werden. Sie können jedoch Änderungen für die älteren APIs „MediaPlayer
“ und „MediaSession
“ vorschlagen.
Wenn Sie zusätzliche Medientypen im Android-Medien-Framework unterstützen möchten, müssen Sie einen benutzerdefinierten Extractor und Decoder erstellen. Wenn Sie beispielsweise die Unterstützung für Windows Media-Videos in AVI-Dateien hinzufügen möchten, müssen Sie einen AVI-Extractor und einen Windows Media-Video-Decoder erstellen.
Erweiterungen
Wenn die Standard-Medien-Extractor nicht Ihren Anforderungen entsprechen, können Sie benutzerdefinierte Extractor-Plug-ins in /system/lib[64]/extractors/
ablegen. Beim Extraktionsprozess werden automatisch Extraktions-Plug-ins aus dem von Google bereitgestellten APEX-Paket und aus /system/lib[64]/extractors/
geladen.
Ebenso können Sie benutzerdefinierte Media-Codec-Dienste einrichten, die die in frameworks/av/media/codec2/core/
definierte Codec 2.0-Schnittstelle verwenden. Eine grundlegende Implementierung finden Sie unter frameworks/av/media/codec2/hidl/services/
. Der Einstiegspunkt der Bibliothek ist die C2ComponentStore
-Schnittstelle. Eine Beispielimplementierung des Standard-Software-Codec-Stores finden Sie unter frameworks/av/media/codec2/vndk/C2Store.cpp
.
Wenn du deine eigene APEX verwendest, strukturiere den Codec-Dienst und lade die APEX-Datei mit denselben Prozessen wie den mediaswcodec
-Dienst. Dazu definieren Sie eine freigegebene Bibliothek auf oberster Ebene, die für die Registrierung aller C2-Komponenten verantwortlich ist, und erstellen dann ein APEX-Paket (mit übertragbaren Abhängigkeiten), das sich in der Anbieterpartition befindet. Wenn der Anbieter-Codec-Dienstprozess gestartet wird, kann er diesen Einstiegspunkt der obersten Ebene laden.
Extraktor erstellen
Achten Sie beim Hinzufügen eines Extraktors für ein neues Format darauf, dass er nur von stabilen NDK-APIs abhängt und nicht von privaten APIs. Extractor sollten die von frameworks/av/include/media/MediaExtractorPluginApi.h
definierte API implementieren und können die C++-Wrapper in frameworks/av/include/media/MediaExtractorPluginHelper.h
verwenden. Da Android 10 oder höher nur die höchste Version der Extractor API unterstützt, müssen Sie Ihren Extractor nach dem Extractor mit der höchsten API-Version modellieren.
Platzieren Sie benutzerdefinierte Extraktoren in /system/lib/64/extractors
oder in einem Anbieter-APEX, das zusammen mit dem Google-APEX geöffnet wird, das die Google-Extraktoren enthält. Führen Sie den folgenden Befehl aus, um zu prüfen, ob der Extractor vom Framework geladen wurde.
adb shell dumpsys media.extractor
Daraufhin sollte eine Liste der verfügbaren Extraktoren angezeigt werden, die in etwa so aussieht:
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)
Wenn Ihr benutzerdefinierter Extractor ein Format unterstützt, das bereits von einem von Google bereitgestellten Extractor unterstützt wird, können Sie das Framework dazu zwingen, Ihren Extractor zu verwenden. Verwenden Sie dazu die Funktion Sniff()
, um ein höheres Konfidenzniveau als das von Google bereitgestellte zurückzugeben.
Wenn das Media-Framework deinen Extractor (aus /system/lib/64/extractors
oder aus einem Anbieter-APEX) lädt, erkennt es die Datei und ruft Informationen zu ihrem Inhalt ab. Im nächsten Schritt fügen Sie einen Decoder für das Format hinzu, damit das Framework weiß, wie der Dateiinhalt geparst werden soll.
Benutzerdefinierten Decoder erstellen
Sie benötigen einen benutzerdefinierten Decoder für alle Formate, die noch nicht von einem von Google bereitgestellten Decoder unterstützt werden. Beispiel:
Wenn Sie das Media-Framework für AVI-Dateien mit MP3-Inhalten unterstützen möchten, benötigen Sie einen AVI-Extractor, aber keinen MP3-Decoder, da dieser bereits vorhanden ist.
Wenn Sie das Media-Framework für AVI-Dateien mit Windows Media unterstützen möchten, benötigen Sie sowohl einen AVI-Extractor als auch einen Windows Media-Decoder.
Das Hinzufügen eines neuen Decoders ähnelt dem Hinzufügen eigener Hardware-Decoder für AVC oder HEVC.
Der Extractor veröffentlicht zwar den MIME-Typ der enthaltenen Medientracks, aber die Codecs, die diese MIME-Typen unterstützen, müssen vorhanden sein, damit die Datei vollständig unterstützt wird. Der tatsächlich verwendete MIME-Typ-String ist eine Vereinbarung zwischen dem Extractor und dem Codec. Der String muss der MediaDefs.h
-Datei nicht hinzugefügt werden.
Mit Medienscanner verknüpfen
Der Medienscanner sucht nach neuen Dateitypen und fügt sie der Mediendatenbank hinzu.
Damit der Medienscanner Ihren benutzerdefinierten Dateityp verarbeiten kann, muss er darüber informiert werden. Unter Android 10 oder höher wird in MimeUtils
(in libcore
) die Zuordnung von MIME-Typen zu Erweiterungen beibehalten. Bisher wurde diese Zuordnung in der Datei MediaFile.java
verarbeitet, die weiterhin eine Zuordnung von MIME-Typen zu MTP-Formatkonstanten enthält.
Ein Extractor kann eine Liste der unterstützten Dateinamenerweiterungen exportieren, z. B. MP3 oder MP4. Diese Einstellung wird jedoch nur in LegacyMediaScanner
verwendet. Sie hat keine Auswirkungen auf ModernMediaScanner
, das standardmäßig verwendet wird.