Kompatible Medientranskodierung

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Kompatible Medientranscodierung, eingeführt in Android 12, ist eine Funktion, die es Geräten ermöglicht, modernere, speichereffizientere Medienformate für die Videoaufnahme zu verwenden, wie z. B. HEVC, während die Kompatibilität mit Apps erhalten bleibt. Mit dieser Funktion können Gerätehersteller standardmäßig HEVC anstelle von AVC verwenden, um die Videoqualität zu verbessern und gleichzeitig die Speicher- und Bandbreitenanforderungen zu reduzieren. Bei Geräten mit aktivierter kompatibler Medientranscodierung kann Android Videos (bis zu einer Minute Länge), die in Formaten wie HEVC oder HDR aufgezeichnet 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 Transkodierungsfunktion für kompatible Medien ist standardmäßig deaktiviert. Um eine Medientranscodierung anzufordern, müssen Apps ihre Medienfunktionen deklarieren. Weitere Informationen zum Deklarieren von Medienfunktionen finden Sie unter Kompatible Medientranscodierung auf der Android Developers-Website.

Wie es funktioniert

Die Transkodierungsfunktion für kompatible Medien besteht aus zwei Hauptteilen:

  • Transcodierungsdienste im Medienframework: Diese Dienste konvertieren Dateien von einem Format in ein anderes mithilfe von Hardware für Konvertierungen mit geringer Latenz und hoher Qualität. Dazu gehören die Transcodierungs-API, der Transcodierungsdienst, ein OEM-Plugin für benutzerdefinierte Filter und Hardware. Weitere Einzelheiten finden Sie unter Architekturübersicht .
  • Funktion zur kompatiblen Medientranscodierung bei Medienanbietern: Diese bei Medienanbietern zu findende Komponente fängt Apps ab, die auf Mediendateien zugreifen, und stellt entweder die Originaldatei oder eine transcodierte Datei bereit, die auf den deklarierten Funktionen der App basiert. 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 Prozess der Medienumcodierung.

Transkodierungsprozess für kompatible Medien

Abbildung 1. Überblick über die Transcodierung kompatibler Medien.

Unterstützte Formate

Die Transkodierungsfunktion für kompatible Medien unterstützt die folgenden Formatkonvertierungen:

  • HEVC (8-Bit) zu AVC: Codec-Konvertierungen werden durch Anschließen 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 Anbieter-Plugin-Hook in die Decoder-Instanzen durchgeführt. Weitere Informationen finden Sie unter HDR-zu-SDR-Codierung .

Unterstützte Inhaltsquellen

Die Funktion zur kompatiblen Medientranscodierung unterstützt Gerätemedien, die von der nativen OEM-Kamera-App generiert wurden und im Ordner DCIM/Camera/ auf dem primären externen Volume gespeichert sind. Die Funktion unterstützt keine Medien im Sekundärspeicher. Inhalte, die per E-Mail oder SD-Karten an Geräte übermittelt werden, werden nicht unterstützt.

Apps greifen auf die Dateien basierend auf verschiedenen Dateipfaden zu. Im Folgenden werden die Dateipfade beschrieben, in denen die Transcodierung aktiviert oder umgangen wird:

  • Transcodierung 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 das Share-Sheet des Betriebssystems Intents. (nur MediaStore-URI)
    • MTP/PTP-Dateiübertragung vom Telefon zum PC
  • Transkodierung umgangen:

    • Übertragen einer Datei von einem Gerät durch Auswerfen der SD-Karte
    • Übertragen von Dateien von Gerät zu Gerät mit Optionen wie Nearby Share oder Bluetooth-Übertragung.

Fügen Sie benutzerdefinierte Dateipfade für die Transcodierung hinzu

Gerätehersteller können optional Dateipfade für die Medientranscodierung im DCIM/ hinzufügen. Alle Pfade außerhalb des DCIM/ 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 zum 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 Medientranscodierungsfunktion beschrieben.

Media-Transcoding-Architektur

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, Transcodierungsanforderungen plant und die Buchhaltung für TranscodingSessions verwaltet.
  • MediaTranscoder: Native Bibliothek, die Transcodierung durchführt. Diese Bibliothek baut auf dem Media Framework NDK auf, um mit Modulen kompatibel zu sein.

Die Funktion zur kompatiblen Medientranscodierung protokolliert Transcodierungsmetriken sowohl im Dienst als auch im Medientranscoder. Der clientseitige und der dienstseitige Code befinden sich im MediaProvider-Modul, um zeitnahe Fehlerbehebungen und Aktualisierungen zu ermöglichen.

Dateizugriff

Kompatible Medientranscodierung baut auf dem Dateisystem Filesystem in Userspace (FUSE) auf, das für die bereichsbezogene Speicherung verwendet wird. FUSE ermöglicht es dem MediaProvider-Modul, Dateioperationen im Benutzerbereich zu untersuchen und den Zugriff auf Dateien basierend auf der Richtlinie zum Zulassen, Verweigern oder Schwärzen des Zugriffs zu sperren.

Wenn eine App versucht, auf eine Datei zuzugreifen, fängt der FUSE-Daemon den Lesezugriff auf die Datei von der App ab. Wenn die App ein neueres Format (z. B. HEVC) unterstützt, wird die Originaldatei zurückgegeben. Wenn die App das Format nicht unterstützt, wird die Datei in ein älteres Format (z. B. AVC) transcodiert oder aus dem Cache zurückgegeben, wenn eine transcodierte Version verfügbar ist.

Fordern Sie transcodierte Dateien an

Die Transcodierungsfunktion für kompatible Medien ist standardmäßig deaktiviert. Wenn das Gerät HEVC unterstützt, transcodiert Android also keine Dateien, es sei denn, dies wird von einer App in einer Manifestdatei oder in der Liste zum Erzwingen der Transcodierung angegeben.

Apps können mithilfe der folgenden Optionen transcodierte Assets 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. Dadurch wird die Transcodierung für Apps aktiviert, die ihre Manifestdatei nicht aktualisiert haben. Sobald eine App ihre Manifestdatei mit nicht unterstützten Formaten aktualisiert, muss sie aus der Liste zum Erzwingen der Transcodierung entfernt werden. Gerätehersteller können ihre Apps für das Hinzufügen oder Entfernen von der Force-Transcode-Liste nominieren, indem sie einen Patch einreichen oder einen Fehler melden . Das Android-Team überprüft die Liste regelmäßig und kann Apps aus der Liste entfernen.
  • Deaktivieren Sie unterstützte Formate mit dem App-Kompatibilitätsframework zur Laufzeit (Benutzer können dies auch für jede App in den Einstellungen deaktivieren).
  • Öffnen Sie eine Datei mit MediaStore , während Sie explizit nicht unterstützte Formate mit der openTypedAssetFileDescriptor API angeben.

Bei USB-Übertragungen (vom Gerät zum PC) ist die Transcodierung standardmäßig deaktiviert, aber Benutzer können die Transcodierung mit dem Umschalter „Videos in AVC konvertieren “ im Einstellungsbildschirm „ USB -Einstellungen“ aktivieren, wie in Abbildung 3 gezeigt.

Schalten Sie um, um die Medientranscodierung zu aktivieren

Abbildung 3. Wechseln Sie zum Aktivieren der Medientranskodierung im Bildschirm „USB-Einstellungen“.

Einschränkungen beim Anfordern transcodierter Dateien

Um zu verhindern, dass Transcodierungsanforderungen Systemressourcen für längere Zeit blockieren, sind Apps, die Transcodierungssitzungen anfordern, beschränkt auf:

  • 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 die HEVC-Codierung standardmäßig in der nativen Kamera-App aktiviert
  • (Geräte, die HDR-zu-SDR-Transkodierung unterstützen) Das Gerät unterstützt die HDR-Videoaufnahme

Um die Geräteleistung für die Medientranscodierung sicherzustellen, müssen die Videohardware und die Lese-/Schreibzugriffsleistung des Speichers optimiert werden. Wenn Medien-Codecs mit einer Priorität von 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 Medien-Transcoder-Benchmark unter frameworks/av/media/libmediatranscoding/transcoder/benchmark .

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 Medienumcodierung global

Um das Medientranskodierungs-Framework oder das App-Verhalten mit Transkodierung zu testen, können Sie die kompatible Medientranskodierungsfunktion global aktivieren oder deaktivieren. Setzen Sie auf der Seite „Einstellungen“ > „System“ > „Entwickler“ > „Medientranscodierung“ für Entwickleroptionen den Schalter „ Transcodierungsstandardwerte überschreibenauf „Ein“ und dann den Schalter „Transcodierung aktivieren“ auf „Ein“ oder „ Aus “ . Wenn diese Einstellung aktiviert ist, erfolgt die Medientranscodierung möglicherweise im Hintergrund für andere Apps als die, die Sie entwickeln.

Überprüfen Sie den Transcodierungsstatus

Während des Tests können Sie den folgenden ADB-Shell-Befehl verwenden, um den Transcodierungsstatus zu überprüfen, einschließlich aktueller und vergangener Transcodierungssitzungen:

adb shell dumpsys media.transcoding

Erweitern Sie die Beschränkung der Videolänge

Zu Testzwecken können Sie die Begrenzung der Videolänge von einer Minute für die Transcodierung mit dem folgenden Befehl erweitern. Nach dem Ausführen 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

Das Folgende ist der AOSP-Quellcode, der sich auf die kompatible Medientranscodierung bezieht.

HDR-zu-SDR-Codierung

Um die HDR-zu-SDR-Codierung zu unterstützen, können Gerätehersteller das AOSP-Beispiel-Codec 2.0-Filter-Plugin verwenden, das sich unter /platform/frameworks/av/media/codec2/hidl/plugin/ . Dieser Abschnitt beschreibt, wie das Filter-Plugin funktioniert, wie das Plugin implementiert und wie das Plugin getestet wird.

Wenn ein Gerät kein Plug-in enthält, das HDR-zu-SDR-Codierung unterstützt, erhält eine App, die auf ein HDR-Video zugreift, unabhängig von den im Manifest deklarierten Medienfunktionen der App den ursprünglichen Dateideskriptor.

Wie es funktioniert

Dieser Abschnitt beschreibt das allgemeine Verhalten des Codec 2.0-Filter-Plugins.

Hintergrund

Android bietet eine Anpassungsschichtimplementierung zwischen der Codec 2.0 -Schnittstelle und der android.hardware.media.c2 HAL-Schnittstelle unter android::hardware::media::c2 . Für Filter-Plugins enthält AOSP einen Wrapper-Mechanismus, der Decoder zusammen mit Filter-Plugins umschließt. MediaCodec erkennt diese verpackten Komponenten als Decoder mit Filterfunktionen.

Überblick

Die FilterWrapper -Klasse nimmt Hersteller-Codecs und gibt verpackte Codecs zurück an die media.c2 Anpassungsschicht. Die FilterWrapper -Klasse lädt libc2filterplugin.so über die FilterWrapper::Plugin API und zeichnet verfügbare Filter aus dem Plugin auf. Bei der Erstellung instanziiert FilterWrapper alle verfügbaren Filter. Beim Start werden nur Filter gestartet, die den Puffer verändern.

Filter-Plugin-Architektur

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 Filter, die von der FilterWrapper -Klasse verwendet werden.

  • 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. Beispielsweise ist für HDR-zu-SDR-Tone-Mapper der Steuerparameter die Zielübertragungsfunktion.
    • affectedParams : Parameter, die von den Filtervorgängen betroffen sind. Beispielsweise sind beim HDR-zu-SDR-Tone-Mapper die Farbaspekte die betroffenen Parameter.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Gibt true zurück, wenn die Filterkomponente den Puffer ändert. Beispielsweise gibt der Tone-Mapping-Filter „ true “ 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 verpackte Komponente trennt eingehende Parameter von Abfragen oder Konfigurationsanforderungen gemäß der Filterbeschreibung. Beispielsweise wird die Konfiguration des Filtersteuerparameters zum entsprechenden Filter geleitet, und betroffene Parameter von den Filtern sind in den Abfragen vorhanden (anstatt von dem Decoder zu lesen, der nicht betroffene Parameter hat).

Abfrage und Konfiguration

Abbildung 2. Abfrage und Konfiguration.

Anfang

Beim Start startet die verpackte Komponente den Decoder und alle Filter, die die Puffer ändern. Wenn kein Filter aktiviert ist, startet die Wrapped-Komponente den Decoder und Pass-Through-Puffer und sendet Befehle an den Decoder selbst.

Pufferbehandlung

Pufferbehandlung

Abbildung 3. Pufferbehandlung.

Puffer, die in die Warteschlange des Wrapped-Decoders gestellt werden, gehen an den zugrunde liegenden Decoder. Die verpackte Komponente greift den Ausgabepuffer vom Decoder über einen onWorkDone_nb() -Callback und stellt ihn dann in die Warteschlange der Filter. Der endgültige Ausgabepuffer des letzten Filters wird an den Client gemeldet.

Damit diese Pufferbehandlung funktioniert, muss die umschlossene Komponente C2PortBlockPoolsTuning für den letzten Filter konfigurieren, damit die Frameworkausgabe Puffer aus dem erwarteten Blockpool ausgibt.

Anhalten, zurücksetzen und loslassen

Beim Stopp stoppt die umschlossene 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

Gehen Sie wie folgt vor, um das Plugin zu aktivieren:

  1. Implementieren Sie die FilterPlugin Schnittstelle in einer Bibliothek und legen Sie sie unter /vendor/lib[64]/libc2filterplugin.so.
  2. Fügen Sie bei Bedarf zusätzliche Berechtigungen für mediacodec.te .
  3. Aktualisieren Sie die Anpassungsschicht auf Android 12 und erstellen Sie den Dienst media.c2 neu.

Testen Sie das Plugin

Gehen Sie wie folgt vor, um das Beispiel-Plug-in zu testen:

  1. Bauen Sie das Gerät neu auf und flashen Sie es.
  2. Erstellen Sie das Beispiel-Plugin mit dem folgenden Befehl:

    m sample-codec2-filter-plugin
    
  3. Stellen Sie das Gerät erneut bereit und benennen Sie das Anbieter-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