Die mit Android 12 eingeführte kompatible Medientranskodierung ist eine Funktion, die es Geräten ermöglicht, modernere, speichereffizientere Medienformate wie HEVC für die Videoaufnahme zu verwenden und gleichzeitig die Kompatibilität mit Apps aufrechtzuerhalten. Mit dieser Funktion können Gerätehersteller standardmäßig HEVC anstelle von AVC verwenden, um die Videoqualität zu verbessern und gleichzeitig den Speicher- und Bandbreitenbedarf zu reduzieren. Bei Geräten mit aktivierter kompatibler Medientranskodierung kann Android Videos (bis zu einer Minute Länge), die in Formaten wie HEVC oder HDR aufgenommen wurden, automatisch konvertieren, wenn die Videos von einer App geöffnet werden, die das Format nicht unterstützt. Dadurch können Apps auch dann funktionieren, wenn Videos in neueren Formaten auf dem Gerät aufgenommen werden.
Die Funktion zur kompatiblen Medientranskodierung ist standardmäßig deaktiviert. Um eine Medientranskodierung anzufordern, müssen Apps ihre Medienfunktionen angeben. Weitere Informationen zum Deklarieren von Medienfunktionen finden Sie unter Kompatible Medientranskodierung auf der Website für Android-Entwickler.
Wie es funktioniert
Die Funktion zur kompatiblen Medientranskodierung besteht aus zwei Hauptteilen:
- Transkodierungsdienste im Medien-Framework: Diese Dienste konvertieren Dateien von einem Format in ein anderes mithilfe von Hardware für geringe Latenz und qualitativ hochwertige Konvertierungen. Dazu gehören die Transkodierungs-API, der Transkodierungsdienst, ein OEM-Plugin für benutzerdefinierte Filter und Hardware. Weitere Einzelheiten finden Sie unter Architekturübersicht .
- Kompatible Medientranskodierungsfunktion bei Medienanbietern: Diese in Medienanbietern enthaltene Komponente fängt Apps ab, die auf Mediendateien zugreifen, und stellt basierend auf den deklarierten Funktionen der App entweder die Originaldatei oder eine transkodierte Datei bereit. Wenn eine App das Format der Mediendatei unterstützt, ist keine besondere Behandlung erforderlich. Wenn eine App das Format nicht unterstützt, konvertiert das Framework die Datei in ein älteres Format, z. B. AVC, wenn die App auf die Datei zugreift.
Abbildung 1 zeigt einen Überblick über den Medientranskodierungsprozess.
Abbildung 1. Übersicht über kompatible Medientranskodierung.
Unterstützte Formate
Die Funktion zur kompatiblen Medientranskodierung unterstützt die folgenden Formatkonvertierungen:
- HEVC (8-Bit) zu AVC: Codec-Konvertierungen werden durch den Anschluss eines Mediacodec-Decoders und eines Mediacode-Encoders durchgeführt.
- HDR10+ (10-Bit) zu AVC (SDR): HDR-zu-SDR-Konvertierungen werden mithilfe von Mediacodec-Instanzen und einem Hersteller-Plugin-Hook in die Decoder-Instanzen durchgeführt. Weitere Informationen finden Sie unter HDR-zu-SDR-Kodierung .
Unterstützte Inhaltsquellen
Die Funktion zur kompatiblen Medientranskodierung unterstützt geräteinterne Medien, die von der nativen OEM-Kamera-App generiert und im Ordner DCIM/Camera/
im primären externen Volume gespeichert sind. Die Funktion unterstützt keine Medien im sekundären Speicher. Inhalte, die per E-Mail oder SD-Karte an Geräte weitergeleitet werden, werden nicht unterstützt.
Apps greifen über verschiedene Dateipfade auf die Dateien zu. Im Folgenden werden die Dateipfade beschrieben, in denen die Transkodierung aktiviert oder umgangen wird:
Transkodierung aktiviert:
- App-Zugriff über MediaStore-APIs
- App-Zugriff über direkte Dateipfad-APIs, einschließlich Java und nativem Code
- App-Zugriff über das Storage Access Framework (SAF)
- App-Zugriff über die Absichten des Betriebssystem-Freigabeblatts. (Nur MediaStore-URI)
- MTP/PTP-Dateiübertragung vom Telefon zum PC
Transkodierung umgangen:
- Übertragen von Dateien von einem Gerät durch Auswerfen der SD-Karte
- Übertragen von Dateien von Gerät zu Gerät mithilfe von Optionen wie Nearby Share oder Bluetooth-Übertragung.
Fügen Sie benutzerdefinierte Dateipfade für die Transkodierung hinzu
Gerätehersteller können optional Dateipfade für die Medientranskodierung im DCIM/
-Verzeichnis hinzufügen. Alle Pfade außerhalb des DCIM/
-Verzeichnisses werden abgelehnt. Das Hinzufügen solcher Dateipfade kann erforderlich sein, um die Anforderungen des Netzbetreibers oder lokale Vorschriften zu erfüllen.
Um einen Dateipfad hinzuzufügen, verwenden Sie das Transcode Path Runtime Resource Overlay (RRO) config_supported_transcoding_relative_paths
. Im Folgenden finden Sie ein Beispiel für das Hinzufügen eines Dateipfads:
<string-array name="config_supported_transcoding_relative_paths" translatable="false">
<item>DCIM/JCF/</item>
</string-array>
Um die konfigurierten Dateipfade zu überprüfen, verwenden Sie:
adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20
Architekturübersicht
In diesem Abschnitt wird die Architektur der Medientranskodierungsfunktion beschrieben.
Abbildung 2. Medientranskodierungsarchitektur.
Die Medientranskodierungsarchitektur besteht aus den folgenden Komponenten:
- MediaTranscodingManager-System-API: Schnittstelle, die es dem Client ermöglicht, mit dem MediaTranscoding-Dienst zu kommunizieren. Das MediaProvider- Modul verwendet diese API.
- MediaTranscodingService: Nativer Dienst, der Clientverbindungen verwaltet, Transkodierungsanfragen plant und die Buchhaltung für
TranscodingSessions
verwaltet. - MediaTranscoder: Native Bibliothek, die die Transkodierung durchführt. Diese Bibliothek basiert auf dem Medienframework NDK, um mit Modulen kompatibel zu sein.
Die Funktion zur kompatiblen Medientranskodierung protokolliert Transkodierungsmetriken sowohl im Dienst als auch im Medientranskodierer. Der clientseitige und dienstseitige Code befindet sich im MediaProvider-Modul, um zeitnahe Fehlerbehebungen und Updates zu ermöglichen.
Dateizugriff
Die kompatible Medientranskodierung basiert auf dem Filesystem in Userspace (FUSE)-Dateisystem , das für die bereichsbezogene Speicherung verwendet wird. FUSE ermöglicht es dem MediaProvider-Modul, Dateivorgänge im Benutzerbereich zu untersuchen und den Zugriff auf Dateien basierend auf der Richtlinie zu sperren, um den Zugriff zuzulassen, zu verweigern oder zu schwärzen.
Wenn eine App versucht, auf eine Datei zuzugreifen, fängt der FUSE-Daemon den Dateilesezugriff der App ab. Wenn die App ein neueres Format unterstützt (z. B. HEVC), wird die Originaldatei zurückgegeben. Wenn die App das Format nicht unterstützt, wird die Datei in ein älteres Format (z. B. AVC) transkodiert oder aus dem Cache zurückgegeben, wenn eine transkodierte Version verfügbar ist.
Fordern Sie transkodierte Dateien an
Die Funktion zur kompatiblen Medientranskodierung ist standardmäßig deaktiviert. Das heißt, wenn das Gerät HEVC unterstützt, transkodiert Android keine Dateien, es sei denn, dies wird von einer App in einer Manifestdatei oder in der Liste „Transkodierung erzwingen“ angegeben.
Apps können transkodierte Assets mit den folgenden Optionen anfordern:
- Deklarieren Sie nicht unterstützte Formate in der Manifestdatei. Einzelheiten finden Sie unter Deklarieren von Funktionen in einer Ressource und Deklarieren von Funktionen im Code .
- Fügen Sie Apps zur Force-Transcode-Liste hinzu, die im MediaProvider- Modul enthalten ist. Dies ermöglicht die Transkodierung für Apps, deren Manifestdatei nicht aktualisiert wurde. Sobald eine App ihre Manifestdatei mit nicht unterstützten Formaten aktualisiert, muss sie aus der Liste „Transkodierung erzwingen“ entfernt werden. Gerätehersteller können vorschlagen, dass ihre Apps zur Force-Transcode-Liste hinzugefügt oder daraus entfernt werden sollen, indem sie einen Patch einreichen oder einen Fehler melden . Das Android-Team überprüft die Liste regelmäßig und entfernt möglicherweise Apps aus der Liste.
- Deaktivieren Sie unterstützte Formate mit dem App-Kompatibilitäts-Framework zur Laufzeit (Benutzer können dies auch für jede App in den Einstellungen deaktivieren).
- Öffnen Sie eine Datei mit
MediaStore
und geben Sie dabei explizit nicht unterstützte Formate mit deropenTypedAssetFileDescriptor
API an.
Bei USB-Übertragungen (Gerät zum PC) ist die Transkodierung standardmäßig deaktiviert, Benutzer können die Transkodierung jedoch mithilfe der Schaltfläche „Videos in AVC konvertieren“ im Einstellungsbildschirm „USB-Einstellungen“ aktivieren, wie in Abbildung 3 dargestellt.
Abbildung 3. Aktivieren Sie die Medientranskodierung im Bildschirm „USB-Einstellungen“.
Einschränkungen beim Anfordern transkodierter Dateien
Um zu verhindern, dass Transkodierungsanfragen Systemressourcen für längere Zeit blockieren, sind Apps, die Transkodierungssitzungen anfordern, auf Folgendes beschränkt:
- 10 aufeinanderfolgende Sitzungen
- eine Gesamtlaufzeit von drei Minuten
Wenn eine App alle diese Einschränkungen überschreitet, gibt das Framework den ursprünglichen Dateideskriptor zurück.
Geräteanforderungen
Um die kompatible Medientranskodierungsfunktion zu unterstützen, müssen Geräte die folgenden Anforderungen erfüllen:
- Auf dem Gerät ist in der nativen Kamera-App standardmäßig die HEVC-Kodierung aktiviert
- (Geräte, die die Transkodierung von HDR zu SDR unterstützen) Das Gerät unterstützt die Aufnahme von HDR-Videos
Um die Geräteleistung für die Medientranskodierung sicherzustellen, müssen die Videohardware und die Lese-/Schreibzugriffsleistung des Speichers optimiert werden. Wenn Mediencodecs mit der Priorität 1
konfiguriert sind, müssen die Codecs mit dem höchstmöglichen Durchsatz arbeiten. Wir empfehlen, dass die Transkodierungsleistung mindestens 200 fps erreicht. Um die Leistung Ihrer Hardware zu testen, führen Sie den Medientranscoder-Benchmark unter frameworks/av/media/libmediatranscoding/transcoder/benchmark
aus.
Validierung
Führen Sie die folgenden CTS-Tests aus, um die kompatible Medientranskodierungsfunktion zu validieren:
-
android.media.mediatranscoding.cts
-
android.mediaprovidertranscode.cts
Aktivieren Sie die globale Medientranskodierung
Um das Medientranskodierungs-Framework oder das App-Verhalten bei der Transkodierung zu testen, können Sie die kompatible Medientranskodierungsfunktion global aktivieren oder deaktivieren. Stellen Sie auf der Seite „Einstellungen“ > „System“ > „Entwickler“ > „Medientranskodierung“ mit den Entwickleroptionen den Schalter „Standardwerte für Transkodierung überschreiben“ auf „ Ein “ und dann den Schalter „ Transkodierung aktivieren“ auf „ Ein “ oder „Aus“ . Wenn diese Einstellung aktiviert ist, erfolgt möglicherweise im Hintergrund eine Medientranskodierung für andere Apps als die, die Sie entwickeln.
Überprüfen Sie den Transkodierungsstatus
Während des Tests können Sie den folgenden ADB-Shell-Befehl verwenden, um den Transkodierungsstatus zu überprüfen, einschließlich aktueller und vergangener Transkodierungssitzungen:
adb shell dumpsys media.transcoding
Erweitern Sie die Videolängenbeschränkung
Zu Testzwecken können Sie die Videolängenbeschränkung von einer Minute für die Transkodierung erweitern, indem Sie den folgenden Befehl verwenden. Nach der Ausführung dieses Befehls ist möglicherweise ein Neustart erforderlich.
adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>
AOSP-Quelle und Referenzen
Im Folgenden finden Sie AOSP-Quellcode im Zusammenhang mit der kompatiblen Medientranskodierung.
Transcoding System API (wird nur von MediaProvider verwendet)
ApplicationMediaCapabilities-API
frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java
MediaTranscoding-Dienst
-
frameworks/av/services/mediatranscoding/
-
frameworks/av/media/libmediatranscoding/
-
Nativer MediaTranscoder
-
frameworks/av/media/libmediatranscoding/transcoder
-
HDR-Beispiel-Plugin für MediaTranscoder
Code zum Abfangen und Transkodieren von MediaProvider-Dateien
MediaTranscoder-Benchmark
-
frameworks/av/media/libmediatranscoding/transcoder/benchmark
-
CTS-Tests
-
cts/tests/tests/mediatranscoding/
-
HDR-zu-SDR-Kodierung
Um die HDR-zu-SDR-Kodierung zu unterstützen, können Gerätehersteller das AOSP-Beispiel-Codec 2.0-Filter-Plugin verwenden, das sich in /platform/frameworks/av/media/codec2/hidl/plugin/
befindet. In diesem Abschnitt wird beschrieben, wie das Filter-Plugin funktioniert, wie das Plugin implementiert wird und wie das Plugin getestet wird.
Wenn ein Gerät kein Plugin enthält, das die HDR-zu-SDR-Kodierung unterstützt, erhält eine App, die auf ein HDR-Video zugreift, den ursprünglichen Dateideskriptor, unabhängig von den im Manifest deklarierten Medienfunktionen der App.
Wie es funktioniert
In diesem Abschnitt wird das allgemeine Verhalten des Codec 2.0-Filter-Plugins beschrieben.
Hintergrund
Android bietet eine Anpassungsschichtimplementierung zwischen der Codec 2.0- Schnittstelle und der HAL-Schnittstelle android.hardware.media.c2
unter android::hardware::media::c2
. Für Filter-Plugins enthält AOSP einen Wrapper-Mechanismus, der Decoder zusammen mit Filter-Plugins verpackt. MediaCodec
erkennt diese verpackten Komponenten als Decoder mit Filterfunktionen.
Überblick
Die FilterWrapper
Klasse übernimmt Codecs von Anbietern und gibt verpackte Codecs zurück an die Adaptionsschicht media.c2
. Die FilterWrapper
Klasse lädt libc2filterplugin.so
über die FilterWrapper::Plugin
API und zeichnet verfügbare Filter vom Plugin auf. Bei der Erstellung instanziiert FilterWrapper
alle verfügbaren Filter. Beim Start werden nur Filter gestartet, die den Puffer verändern.
Abbildung 1. Filter-Plugin-Architektur.
Filter-Plugin-Schnittstelle
Die FilterPlugin.h
Schnittstelle definiert die folgenden APIs, um die Filter verfügbar zu machen:
std::shared_ptr<C2ComponentStore>getComponentStore()
Gibt ein
C2ComponentStore
Objekt zurück, das Filter enthält. Dies unterscheidet sich von dem, was die Codec 2.0-Implementierung des Anbieters offenlegt. Normalerweise enthält dieser Speicher nur die von derFilterWrapper
Klasse verwendeten Filter.bool describe(C2String name, Descriptor *desc)
Beschreibt die Filter zusätzlich zu dem, was im
C2ComponentStore
verfügbar ist. Folgende Beschreibungen sind definiert:-
controlParam
: Parameter, die das Verhalten der Filter steuern. Beim HDR-zu-SDR-Tonmapper ist der Steuerparameter beispielsweise die Zielübertragungsfunktion. -
affectedParams
: Parameter, die von den Filtervorgängen betroffen sind. Beim HDR-zu-SDR-Tonmapper sind beispielsweise die Farbaspekte die betroffenen Parameter.
-
bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)
Gibt
true
zurück, wenn die Filterkomponente den Puffer ändert. Der Tone-Mapping-Filter gibt beispielsweisetrue
zurück, wenn die Zielübertragungsfunktion SDR und die Eingabeübertragungsfunktion HDR (HLG oder PQ) ist.
FilterWrapper-Details
Der Abschnitt beschreibt Details der FilterWrapper
Klasse.
Schaffung
Die verpackte Komponente instanziiert den zugrunde liegenden Decoder und alle definierten Filter bei der Erstellung.
Abfrage und Konfiguration
Die umschlossene Komponente trennt eingehende Parameter von Abfragen oder Konfigurationsanfragen entsprechend der Filterbeschreibung. Beispielsweise wird die Konfiguration des Filtersteuerungsparameters an den entsprechenden Filter weitergeleitet und betroffene Parameter der Filter sind in den Abfragen vorhanden (anstatt vom Decoder zu lesen, der nicht betroffene Parameter hat).
Abbildung 2. Abfrage und Konfiguration.
Start
Beim Start startet die verpackte Komponente den Decoder und alle Filter, die die Puffer ändern. Wenn kein Filter aktiviert ist, startet die verpackte Komponente den Decoder und die Durchgangspuffer und sendet Befehle an den Decoder selbst.
Pufferhandhabung
Abbildung 3. Pufferhandhabung.
Puffer, die in der Warteschlange des umhüllten Decoders stehen, werden an den zugrunde liegenden Decoder weitergeleitet. Die verpackte Komponente ruft den Ausgabepuffer über einen onWorkDone_nb()
-Rückruf vom Decoder ab und stellt ihn dann in die Warteschlange der Filter. Der endgültige Ausgabepuffer des letzten Filters wird dem Client gemeldet.
Damit diese Pufferbehandlung funktioniert, muss die umschlossene Komponente C2PortBlockPoolsTuning
auf den letzten Filter konfigurieren, damit das Framework Puffer aus dem erwarteten Blockpool ausgibt.
Stoppen, zurücksetzen und loslassen
Bei Stopp stoppt die verpackte Komponente den Decoder und alle aktivierten Filter, die gestartet wurden. Beim Zurücksetzen und Freigeben werden alle Komponenten zurückgesetzt oder freigegeben, unabhängig davon, ob sie aktiviert sind oder nicht.
Implementieren Sie das Beispielfilter-Plugin
Um das Plugin zu aktivieren, gehen Sie wie folgt vor:
- Implementieren Sie die
FilterPlugin
Schnittstelle in einer Bibliothek und legen Sie sie unter/vendor/lib[64]/libc2filterplugin.so.
- Fügen Sie bei Bedarf zusätzliche Berechtigungen zu
mediacodec.te
hinzu. - Aktualisieren Sie die Anpassungsebene auf Android 12 und erstellen Sie den Dienst
media.c2
neu.
Testen Sie das Plugin
Gehen Sie wie folgt vor, um das Beispiel-Plugin zu testen:
- Erstellen Sie das Gerät neu und flashen Sie es.
Erstellen Sie das Beispiel-Plugin mit dem folgenden Befehl:
m sample-codec2-filter-plugin
Hängen Sie das Gerät erneut ein und benennen Sie das Hersteller-Plugin um, damit es vom Codec-Dienst erkannt wird.
adb root adb remount adb reboot adb wait-for-device adb root adb remount adb push /out/target/<...>/lib64/sample-codec2-filter-plugin.so \ /vendor/lib64/libc2filterplugin.so adb push /out/target/<...>/lib/sample-codec2-filter-plugin.so \ /vendor/lib/libc2filterplugin.so adb reboot