Medienkomponenten anpassen

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

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 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/.

Ebenso 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. 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 für den mediaswcodec-Dienst hoch. Definieren Sie dazu eine gemeinsam genutzte Bibliothek auf oberster Ebene, die für die Registrierung aller C2-Komponenten verantwortlich ist, und 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.

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. Extractors 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, 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 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 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.

  • 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 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 Extractor kann eine Liste der unterstützten Dateinamenerweiterungen exportieren, z. B. MP3 oder MP4. Dies wird jedoch nur von LegacyMediaScanner verwendet. Das hat keine Auswirkungen auf die standardmäßig verwendete ModernMediaScanner.