Sie können die Komponenten „Media Extractor“ und „Media Codec“ mit Anbietererweiterungen erweitern. Die MediaSession2- und MediaParser-APIs können nicht angepasst werden. Änderungen für die Legacy-APIs MediaPlayer
und MediaSession
können jedoch upstream übertragen werden.
Wenn Sie zusätzliche Medientypen im Android-Media-Framework unterstützen möchten, müssen Sie einen benutzerdefinierten Extractor und Decoder erstellen. Wenn Sie beispielsweise Unterstützung für Windows Media-Video in AVI-Dateien hinzufügen möchten, müssen Sie einen AVI-Extractor und einen Windows Media-Video-Decoder erstellen.
Erweiterungen
Wenn die Standard-Media-Extraktoren nicht Ihren Anforderungen entsprechen, können Sie benutzerdefinierte Extraktor-Plug-ins in /system/lib[64]/extractors/
platzieren. Der Extraktorprozess lädt automatisch Extraktor-Plug-ins aus dem von Google bereitgestellten APEX-Paket und aus /system/lib[64]/extractors/
.
Ebenso können Sie benutzerdefinierte Media-Codec-Dienste einrichten, die die in frameworks/av/media/codec2/core/
definierte Codec 2.0-Schnittstelle verwenden. Eine einfache Implementierung finden Sie unter frameworks/av/media/codec2/hidl/services/
. Der Einstiegspunkt der Bibliothek ist die Schnittstelle C2ComponentStore
. Ein Beispiel finden Sie in der Standardimplementierung des Software-Codec-Speichers unter frameworks/av/media/codec2/vndk/C2Store.cpp
.
Wenn Sie Ihren eigenen APEX verwenden, strukturieren Sie den Codec-Dienst und laden Sie die APEX-Datei mit denselben Prozessen wie der mediaswcodec
-Dienst. Dazu definieren Sie eine gemeinsam genutzte Bibliothek auf oberster Ebene, die für die Registrierung aller C2-Komponenten verantwortlich ist, und erstellen dann ein APEX-Paket (mit transitiven Abhängigkeiten), das sich in der Anbieterpartition befindet. Wenn der Prozess des Anbieter-Codec-Dienstes gestartet wird, kann er diesen Einstiegspunkt der obersten Ebene laden.
Extraktor erstellen
Wenn Sie einen Extractor für ein neues Format hinzufügen, muss er nur von stabilen NDK-APIs und nicht von privaten APIs abhängen. Extraktoren sollten die von frameworks/av/include/media/MediaExtractorPluginApi.h
definierte API implementieren und können die C++-Convenience-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, sollten Sie Ihren Extractor nach dem Extractor mit der höchsten API-Versionsnummer modellieren.
Platzieren Sie benutzerdefinierte Extraktoren in /system/lib/64/extractors
oder einem Anbieter-APEX, der zusammen mit dem Google-APEX mit den Google-Extraktoren geöffnet wird. Führen Sie den folgenden Befehl aus, um zu prüfen, ob das Framework Ihren Extraktor geladen hat.
adb shell dumpsys media.extractor
Sie sollten eine Liste der verfügbaren Extraktoren erhalten, 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 Extraktor ein Format unterstützt, das bereits von einem von Google bereitgestellten Extraktor unterstützt wird, können Sie das Framework zwingen, Ihren Extraktor zu verwenden. Dazu müssen Sie mit der Funktion Sniff()
ein höheres Konfidenzniveau zurückgeben als der von Google bereitgestellte Extraktor.
Wenn das Media-Framework Ihren Extractor (aus /system/lib/64/extractors
oder aus einem Anbieter-APEX) lädt, erkennt es die Datei und ruft Informationen zu ihrem Inhalt ab. Als Nächstes müssen Sie einen Decoder für das Format hinzufügen, damit das Framework weiß, wie der Dateiinhalt geparst werden muss.
Benutzerdefinierten Decoder erstellen
Sie benötigen einen benutzerdefinierten Decoder für jedes Format, das nicht bereits von einem von Google bereitgestellten Decoder unterstützt wird. Beispiel:
Wenn Sie Unterstützung für das Media Framework für AVI-Dateien mit MP3 hinzufügen möchten, benötigen Sie einen AVI-Extractor, aber keinen MP3-Decoder, da bereits einer vorhanden ist.
Wenn Sie Unterstützung für das Media Framework für AVI-Dateien mit Windows Media hinzufügen 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 Hardwaredecoder für AVC oder HEVC.
Der Extractor gibt zwar den MIME-Typ der darin enthaltenen Mediatracks an, 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 nicht der Datei MediaDefs.h
hinzugefügt werden.
Integration in den Medienscanner
Der Media Scanner sucht nach neuen Dateitypen und fügt sie der Mediendatenbank hinzu.
Damit der Media Scanner Ihren benutzerdefinierten Dateityp verarbeiten kann, muss er ihn kennen. In Android 10 oder höher wird die MIME-zu-Erweiterungszuordnung von MimeUtils
(in libcore
) beibehalten. Bisher wurde diese Zuordnung in der Datei MediaFile.java
verarbeitet, die weiterhin eine Zuordnung von MIME-Typ zu MTP-Formatkonstanten enthält.
Ein Extractor kann eine Liste der unterstützten Dateinamenerweiterungen (z. B. MP3 oder MP4) exportieren. Das wird jedoch nur von LegacyMediaScanner
verwendet und hat keine Auswirkungen auf ModernMediaScanner
, das standardmäßig verwendet wird.