Passen Sie Medienkomponenten an

Sie können die Medienextraktor- und Mediencodec-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 vorverlagern).

Um zusätzliche Medientypen im Android Media Framework zu unterstützen, müssen Sie einen benutzerdefinierten Extraktor und Decoder erstellen. Um beispielsweise Unterstützung für Windows Media-Video in AVI-Dateien hinzuzufügen, müssen Sie einen AVI- Extraktor und einen Windows Media-Video- Decoder erstellen.

Über Erweiterungen

Wenn die Standard-Medienextraktoren Ihre Anforderungen nicht erfüllen, können Sie benutzerdefinierte Extraktor-Plugins in /system/lib[64]/extractors/ platzieren. Der Extraktionsprozess lädt automatisch Extraktions-Plugins 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 Bibliothekseinstiegspunkt ist die C2ComponentStore Schnittstelle. Ein Beispiel finden Sie 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 die APEX-Datei mit denselben Prozessen wie der mediaswcodec Dienst. Definieren Sie dazu eine gemeinsam genutzte Bibliothek der obersten 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 Herstellerpartition befindet. Wenn der Codec-Dienstprozess des Anbieters startet, kann er diesen Einstiegspunkt der obersten Ebene laden.

Erstellen Sie einen Extraktor

Stellen Sie beim Hinzufügen eines Extraktors für ein neues Format sicher, dass der Extraktor nur von stabilen NDK-APIs und nicht von privaten APIs abhängt. 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 Extraktor-API unterstützt, stellen Sie sicher, dass Sie Ihren Extraktor nach dem Extraktor mit der höchsten API-Versionsnummer 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 überprüfen, ob das Framework Ihren Extraktor geladen hat.

adb shell dumpsys media.extractor

Sie sollten eine Liste der verfügbaren Extraktoren erhalten, die der folgenden ähnelt.

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 dazu zwingen, Ihren Extraktor zu verwenden, indem Sie die Funktion Sniff() verwenden, um ein höheres Konfidenzniveau als das von Google bereitgestellte zurückzugeben.

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

Erstellen Sie einen benutzerdefinierten Decoder

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

  • Um Media Framework-Unterstützung für AVI-Dateien mit MP3 hinzuzufügen, benötigen Sie einen AVI-Extraktor, aber keinen MP3-Decoder, da einer bereits vorhanden ist.

  • Um Media Framework-Unterstützung für AVI-Dateien mit Windows Media hinzuzufügen, benötigen Sie sowohl einen AVI-Extraktor als auch einen Windows Media-Decoder.

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 darin enthaltenen Medienspuren veröffentlicht, müssen die Codecs, die diese MIME-Typen unterstützen, vorhanden sein, damit die Datei vollständig unterstützt wird. Der tatsächlich verwendete MIME-Typ-String ist ausschließlich eine Vereinbarung zwischen dem Extraktor und dem Codec (der String muss nicht zur Datei MediaDefs.h hinzugefügt werden).

Mit Medienscanner integrieren

Der Medienscanner sucht nach neuen Dateitypen und fügt sie der Mediendatenbank hinzu. Damit der Medienscanner Ihren benutzerdefinierten Dateityp verarbeiten kann, muss der Scanner davon wissen. In Android 10 oder höher verwaltet MimeUtils (in libcore ) die Zuordnung von MIME zu Erweiterung. Bisher wurde diese Zuordnung in der Datei MediaFile.java gehandhabt, die weiterhin eine Zuordnung vom MIME-Typ zu MTP-Formatkonstanten enthält.

Ein Extraktor kann eine Liste der unterstützten Dateinamenerweiterungen exportieren (z. B. MP3 oder MP4). Dies wird jedoch nur LegacyMediaScanner verwendet. Es hat keine Auswirkungen auf ModernMediaScanner , das standardmäßig verwendet wird.