Medienkomponenten anpassen

Sie können den Medienextraktor und die Medien-Codec-Komponenten mithilfe des Erweiterungen. Die MediaSession2 und MediaParser API können nicht angepasst werden (aber kann Änderungen für die Legacy-APIs MediaPlayer und MediaSession vorgelagert werden.

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. Der Extrahiererprozess Die Extrahierer-Plug-ins werden automatisch aus dem von Google bereitgestellten APEX-Paket geladen und von /system/lib[64]/extractors/.

Ebenso können Sie benutzerdefinierte Medien-Codec-Dienste einrichten, die den Codec 2.0 verwenden. Schnittstelle definiert in frameworks/av/media/codec2/core/. Eine grundlegende Implementierung finden Sie unter frameworks/av/media/codec2/hidl/services/. Die ist die C2ComponentStore-Schnittstelle. Eine Beispielimplementierung des Standard-Software-Codec-Stores finden Sie 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 Dabei werden dieselben Prozesse wie für den Dienst mediaswcodec verwendet. Definieren Sie dazu gemeinsam genutzten Bibliothek für die Registrierung aller C2-Komponenten verantwortlich ist, Ein APEX-Paket (mit transitiven Abhängigkeiten) erstellen, das sich im Anbieter befindet -Partition an. Wenn der Prozess des Anbieter-Codec-Dienstes startet, kann er Einstiegspunkt der obersten Ebene verwenden.

Extraktor erstellen

Wenn Sie einen Extraktor für ein neues Format hinzufügen, achten Sie darauf, dass der Extraktor nur von stabilen NDK APIs und sind nicht von privaten APIs abhängig. Extraktoren sollten die im folgenden Abschnitt definierte API implementieren: frameworks/av/include/media/MediaExtractorPluginApi.h und können die C++- Convenience-Wrapper in frameworks/av/include/media/MediaExtractorPluginHelper.h. 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 einem Anbieter-APEX. das zusammen mit dem Google APEX mit den Google-Extraktoren geöffnet wird. 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 jedes Format, das noch nicht von einem Von Google bereitgestellter Decoder Beispiel:

  • Damit du Media Framework-Unterstützung für AVI-Dateien mit MP3-Dateien hinzufügen kannst, benötigst du eine AVI-Datei -Extraktor, benötigen aber keinen MP3-Decoder.

  • Um AVI-Dateien mit Windows Media zu unterstützen, müssen Sie einen AVI-Extraktor und einen Windows Media-Decoder benötigen.

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

Während der Extraktor den MIME-Typ der Medien-Tracks enthält, müssen die Codecs, die diese MIME-Typen unterstützen, für den -Datei vollständig unterstützt werden. Der tatsächlich verwendete MIME-Typ-String ist ein Übereinstimmung zwischen dem Extraktor und dem Codec (der String muss nicht wurde der Datei MediaDefs.h hinzugefügt.

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. Unter Android 10 oder höher, MimeUtils (in libcore) behält die Zuordnung von MIME zu Erweiterung bei. Bisher wurde diese Zuordnung die in der Datei MediaFile.java verarbeitet wird. Diese enthält weiterhin eine Zuordnung von Konstanten vom MIME-Typ zum MTP-Format.

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.