Medienkomponenten anpassen

Sie können den Medienextraktor und die Medien-Codec-Komponenten mithilfe von Anbietererweiterungen erweitern. Die MediaSession2 und MediaParser API können nicht angepasst werden. Sie können jedoch Änderungen für die Legacy-APIs MediaPlayer und MediaSession vorgelagert werden.

Zur Unterstützung weiterer Medientypen im Android-Medien-Framework müssen Sie einen benutzerdefinierten Extraktor und Decoder erstellen. Um beispielsweise Windows Media-Videos in AVI-Dateien zu unterstützen, müssen Sie einen AVI-Extraktor und einen Windows Media-Video-Decoder erstellen.

Erweiterungen

Wenn die Standardmedienextraktoren nicht Ihren Anforderungen entsprechen, können Sie benutzerdefinierte Extrahierer-Plug-ins in /system/lib[64]/extractors/ platzieren. Der Extrahiererprozess lädt automatisch Extrahierer-Plug-ins aus dem von Google bereitgestellten APEX-Paket und aus /system/lib[64]/extractors/.

Auf ähnliche Weise können Sie benutzerdefinierte Medien-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 für die Bibliothek ist die Schnittstelle C2ComponentStore. Ein Beispiel findest du in der Standardimplementierung des Software-Codec-Speichers unter frameworks/av/media/codec2/vndk/C2Store.cpp.

Wenn Sie Ihr eigenes APEX verwenden, strukturieren Sie den Codec-Dienst und laden Sie die APEX-Datei mit denselben Prozessen wie den mediaswcodec-Dienst. Definieren Sie dazu eine gemeinsam genutzte Bibliothek auf oberster Ebene, die für die Registrierung aller C2-Komponenten zuständig ist. Erstellen Sie dann ein APEX-Paket (mit transitiven Abhängigkeiten), das sich in der Anbieterpartition befindet. Wenn der Prozess des Anbieter-Codec-Dienstes beginnt, kann er diesen Einstiegspunkt der obersten Ebene laden.

Extrahierer erstellen

Achten Sie beim Hinzufügen eines Extrahierers für ein neues Format darauf, dass er nur von stabilen NDK-APIs und nicht von privaten APIs abhängt. Extraktoren sollten die durch 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, achten Sie darauf, den Extraktor mit der höchsten API-Versionsnummer zu modellieren.

Platzieren Sie benutzerdefinierte Extraktoren in /system/lib/64/extractors oder 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 das Framework den 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 erzwingen, dass das Framework Ihren Extraktor verwendet. Verwenden Sie dazu die Funktion Sniff(), um ein höheres Konfidenzniveau als das von Google bereitgestellte zurückzugeben.

Wenn das Media-Framework Ihren Extraktor (aus /system/lib/64/extractors oder von einem Anbieter-APEX) lädt, erkennt es die Datei und ruft Informationen zum Inhalt ab. Der nächste Schritt besteht darin, einen Decoder für das Format hinzuzufügen, damit das Framework verstehen kann, wie der Dateiinhalt geparst wird.

Benutzerdefinierten Decoder erstellen

Sie benötigen einen benutzerdefinierten Decoder für jedes Format, das noch nicht von einem von Google bereitgestellten Decoder unterstützt wird. Beispiel:

  • Wenn Sie Media Framework-Unterstützung für AVI-Dateien mit MP3 hinzufügen möchten, benötigen Sie einen AVI-Extraktor, aber keinen MP3-Decoder, da bereits ein vorhanden ist.

  • Damit Sie das Media Framework für AVI-Dateien mit Windows Media unterstützen können, benötigen Sie sowohl einen AVI-Extraktor als auch einen Windows Media-Decoder.

Das Hinzufügen eines neuen Decoders ähnelt dem Hinzufügen eigener Hardwaredecoder für AVC oder HEVC.

Der Extraktor veröffentlicht zwar den MIME-Typ der darin enthaltenen Medien-Tracks, 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 String des MIME-Typs ist ausschließlich eine Vereinbarung zwischen dem Extraktor und dem Codec. Der String muss der Datei MediaDefs.h nicht hinzugefügt werden.

Medienscanner einbinden

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. In Android 10 oder höher behält MimeUtils (in libcore) die MIME-zu-Erweiterung-Zuordnung bei. Bisher wurde diese Zuordnung in der Datei MediaFile.java vorgenommen, die weiterhin eine Zuordnung vom MIME-Typ zu den MTP-Formatkonstanten enthält.

Ein Extraktor kann eine Liste der unterstützten Dateinamenerweiterungen wie MP3 oder MP4 exportieren. Dies wird jedoch nur von LegacyMediaScanner verwendet. Das hat keine Auswirkungen auf die standardmäßig verwendete ModernMediaScanner.