Transcodierung kompatibler Medien

Die in Android 12 eingeführte kompatible Medientranscodierung ist eine Funktion, mit der Geräte moderne, speichereffiziente Medienformate wie HEVC für die Videoaufnahme verwenden können, während die Kompatibilität mit Apps aufrechterhalten wird. Mit dieser Funktion können Gerätehersteller standardmäßig HEVC anstelle von AVC verwenden, um die Videoqualität zu verbessern und gleichzeitig Speicher- und Bandbreitenanforderungen zu reduzieren. Auf Geräten mit aktivierter kompatibler Medientranscodierung kann Android Videos von bis zu einer Minute Länge automatisch konvertieren, die in Formaten wie HEVC oder HDR aufgenommen wurden, wenn die Videos von einer App geöffnet werden, die dieses Format nicht unterstützt. Dadurch funktionieren Apps auch dann, wenn Videos in neueren Formaten auf dem Gerät aufgenommen werden.

Die Funktion zur Transcodierung kompatibler Medien ist standardmäßig deaktiviert. Um Medientranscodierung anzufordern, müssen Apps ihre Medienfunktionen deklarieren. Weitere Informationen zum Deklarieren von Medienfunktionen finden Sie auf der Website für Android-Entwickler unter Transcodierung kompatibler Medien.

Funktionsweise

Die Funktion für kompatible Medientranscodierung besteht aus zwei Hauptteilen:

  • Transcodierungsdienste im Medien-Framework:Diese Dienste konvertieren Dateien von einem Format in ein anderes unter Verwendung von Hardware für niedrige Latenz und qualitativ hochwertige Konvertierungen. Dazu gehören die Transcodierungs-API, der Transcodierungsdienst, ein OEM-Plug-in für benutzerdefinierte Filter sowie Hardware. Weitere Informationen finden Sie unter Architekturübersicht.
  • Kompatible Funktion zur Medientranscodierung bei Medienanbietern:Diese bei Medienanbietern gefundene Komponente fängt Apps ab, die auf Mediendateien zugreifen, und stellt je nach den deklarierten Funktionen der App entweder die Originaldatei oder eine transcodierte Datei bereit. Wenn eine App das Format der Mediendatei unterstützt, ist keine besondere Verarbeitung erforderlich. Wenn eine Anwendung das Format nicht unterstützt, konvertiert das Framework die Datei in ein älteres Format wie AVC, wenn die Anwendung auf die Datei zugreift.

Abbildung 1 zeigt einen Überblick über den Medientranscodierungsprozess.

Kompatible Medientranscodierung

Abbildung 1: Übersicht über die Transcodierung kompatibler Medien

Unterstützte Formate

Die Funktion für kompatible Medientranscodierung unterstützt die folgenden Formatkonvertierungen:

  • HEVC (8-Bit) zu AVC:Codec-Konvertierungen werden über die Verbindung eines Mediacodec-Decodierers und eines Mediacode-Encoders durchgeführt.
  • HDR10+ (10-Bit) zu AVC (SDR): Konvertierungen von HDR zu SDR werden mithilfe von Mediacodec-Instanzen durchgeführt und ein Anbieter-Plug-in wird in die Decoderinstanzen eingebunden. Weitere Informationen findest du unter HDR-zu-SDR-Codierung.

Unterstützte Contentquellen

Die Funktion für kompatible Medientranscodierung unterstützt On-Device-Medien, die von der nativen OEM-Kamera-App generiert und im Ordner DCIM/Camera/ auf dem primären externen Volume gespeichert werden. Die Funktion unterstützt keine Medien im sekundären Speicher. Inhalte, die per E-Mail oder auf SD-Karten an Geräte übertragen werden, werden nicht unterstützt.

Apps greifen über verschiedene Dateipfade auf die Dateien 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 Intents des Share Sheet des Betriebssystems. (nur MediaStore-URI)
    • Übertragung von MTP-/PTP-Dateien vom Telefon auf den PC
  • Transcodierung wurde umgangen:

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

Benutzerdefinierte Dateipfade für die Transcodierung hinzufügen

Gerätehersteller können optional Dateipfade für die Medientranscodierung im Verzeichnis DCIM/ hinzufügen. Pfade außerhalb des Verzeichnisses DCIM/ werden abgelehnt. Das Hinzufügen solcher Dateipfade ist möglicherweise erforderlich, um Anforderungen des Mobilfunkanbieters oder lokalen Vorschriften zu erfüllen.

Verwenden Sie zum Hinzufügen eines Dateipfads den Transcodierungspfad Laufzeitressourcen-Overlay (RRO), config_supported_transcoding_relative_paths. Das folgende Beispiel zeigt, wie Sie einen Dateipfad hinzufügen:

<string-array name="config_supported_transcoding_relative_paths" translatable="false">
    <item>DCIM/JCF/</item>
</string-array>

So überprüfen Sie die konfigurierten Dateipfade:

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 Funktion zur Medientranscodierung beschrieben.

Architektur der Medientranscodierung

Abbildung 2: Medientranscodierungsarchitektur

Die Architektur für die Medientranscodierung besteht aus den folgenden Komponenten:

  • MediaTranscodingManager-System-API:Schnittstelle, die dem Client die Kommunikation mit dem MediaTranscoding-Dienst ermöglicht. Diese API wird vom Modul MediaProvider verwendet.
  • MediaTranscodingService:Nativer Dienst, der Clientverbindungen verwaltet, Transcodierungsanfragen plant und die Buchhaltung für TranscodingSessions verwaltet.
  • MediaTranscoder:Native Bibliothek, die die Transcodierung durchführt. Diese Bibliothek baut auf dem Media-Framework NDK auf, um mit Modulen kompatibel zu sein.

Mit der Funktion zur kompatiblen Medientranscodierung werden Transcodierungsmesswerte sowohl im Dienst als auch im Media-Transcoder protokolliert. Der Client- und Service-Code befindet sich im MediaProvider-Modul, um zeitnahe Fehlerkorrekturen und Updates zu ermöglichen.

Dateizugriff

Die kompatible Medientranscodierung basiert auf dem FUSE-Dateisystem (Filesystem in Userspace), das für den begrenzten Speicher verwendet wird. Mit FUSE kann das MediaProvider-Modul Dateivorgänge im Nutzerbereich untersuchen und den Zugriff auf Dateien basierend auf der Richtlinie zum Zulassen, Ablehnen oder Entfernen des Zugriffs steuern.

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

Transcodierte Dateien anfordern

Die Funktion für kompatible Medientranscodierung ist standardmäßig deaktiviert. Wenn das Gerät HEVC unterstützt, transcodiert Android Dateien nur, wenn dies von einer App in einer Manifestdatei oder in der erzwungenen Transcodierungsliste angegeben wird.

Apps können transcodierte Assets mit den folgenden Optionen anfordern:

  • Deklariere in der Manifestdatei nicht unterstützte Formate. Weitere Informationen finden Sie unter Funktionen in einer Ressource deklarieren und Funktionen im Code deklarieren.
  • Fügen Sie die Apps der erzwungenen Transcodierungsliste hinzu, die im Modul MediaProvider enthalten ist. Dadurch wird die Transcodierung für Apps ermöglicht, deren Manifestdatei nicht aktualisiert wurde. Sobald eine App ihre Manifestdatei mit nicht unterstützten Formaten aktualisiert, muss sie aus der Liste der erzwungenen Transcodierungen entfernt werden. Gerätehersteller können nominieren, dass ihre Apps der Liste der erzwungenen Transcodierungen hinzugefügt oder daraus entfernt werden, 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.
  • Unterstützte Formate mit dem App-Kompatibilitäts-Framework während der Laufzeit deaktivieren (Nutzer können dies auch in den Einstellungen für jede Anwendung deaktivieren).
  • Öffnen Sie eine Datei mit MediaStore und geben Sie gleichzeitig nicht unterstützte Formate mit der openTypedAssetFileDescriptor API explizit an.

Für USB-Übertragungen (von einem Gerät zum PC) ist die Transcodierung standardmäßig deaktiviert. Nutzer können sie jedoch über die Ein/Aus-Schaltfläche Videos in AVC konvertieren auf dem Einstellungsbildschirm USB-Einstellungen aktivieren (siehe Abbildung 3).

Ein/Aus-Schaltfläche zum Aktivieren der Medientranscodierung

Abbildung 3: Ein/Aus-Schaltfläche, um die Medientranscodierung im Bildschirm „USB-Einstellungen“ zu aktivieren.

Einschränkungen beim Anfordern von transcodierten Dateien

Um zu verhindern, dass Transcodierungsanfragen Systemressourcen über einen längeren Zeitraum sperren, sind Apps, die Transcodierungssitzungen anfordern, auf Folgendes beschränkt:

  • 10 aufeinanderfolgende Sitzungen
  • eine Gesamtlaufzeit von drei Minuten

Wenn eine Anwendung alle diese Einschränkungen überschreitet, gibt das Framework den ursprünglichen Dateideskriptor zurück.

Geräteanforderungen

Damit die kompatible Funktion für die Medientranscodierung unterstützt wird, müssen die Geräte die folgenden Anforderungen erfüllen:

  • In der nativen Kamera-App ist auf dem Gerät standardmäßig die HEVC-Codierung aktiviert
  • (Geräte, die die HDR-zu-SDR-Transcodierung unterstützen) Gerät unterstützt die HDR-Videoaufnahme

Damit die Geräteleistung für die Medientranscodierung gewährleistet wird, muss die Leistung der Videohardware und des Lese-/Schreibzugriffs auf Speicher 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 eine Transcodierungsleistung von mindestens 200 fps. Führe die Media-Transcoder-Benchmark unter frameworks/av/media/libmediatranscoding/transcoder/benchmark aus, um die Leistung deiner Hardware zu testen.

Zertifizierungsstufe

Führen Sie die folgenden CTS-Tests aus, um die Funktion zur Transcodierung von kompatiblen Medien zu validieren:

  • android.media.mediatranscoding.cts
  • android.mediaprovidertranscode.cts

Medientranscodierung global aktivieren

Wenn Sie das Framework zur Medientranscodierung oder das Verhalten der App bei der Transcodierung testen möchten, können Sie die Funktion für die kompatible Medientranscodierung global aktivieren oder deaktivieren. Stellen Sie auf der Seite Einstellungen > System > Entwickler > Medientranscodierung die Ein/Aus-Schaltfläche Transcodierungsstandards überschreiben auf Ein und stellen Sie dann die Ein/Aus-Schaltfläche Transcodierung aktivieren auf Ein oder Aus. Wenn diese Einstellung aktiviert ist, erfolgt die Medientranscodierung möglicherweise im Hintergrund für andere als die von Ihnen entwickelte Apps.

Transcodierungsstatus prüfen

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

adb shell dumpsys media.transcoding

Längenbeschränkung für Videos verlängern

Zu Testzwecken können Sie die Längenbeschränkung für das Video von einer Minute für die Transcodierung mit dem folgenden Befehl erweitern. 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 den AOSP-Quellcode für die Transcodierung von kompatiblen Medien.

HDR-zu-SDR-Codierung

Zur Unterstützung der HDR-zu-SDR-Codierung können Gerätehersteller das AOSP-Beispiel-Codec 2.0-Filter-Plug-in in /platform/frameworks/av/media/codec2/hidl/plugin/ verwenden. In diesem Abschnitt wird beschrieben, wie das Filter-Plug-in funktioniert, wie es implementiert und getestet wird.

Wenn ein Gerät kein Plug-in hat, das die HDR-zu-SDR-Codierung 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.

Funktionsweise

In diesem Abschnitt wird das allgemeine Verhalten des Codec 2.0-Filter-Plug-ins beschrieben.

Hintergrund

Android bietet eine Anpassungsschicht-Implementierung zwischen der Codec 2.0-Schnittstelle und der HAL-Schnittstelle android.hardware.media.c2 unter android::hardware::media::c2. Für Filter-Plug-ins enthält AOSP einen Wrapper-Mechanismus, der Decodierer mit Filter-Plug-ins umschließt. MediaCodec erkennt diese umschlossenen Komponenten als Decodierer mit Filterfunktionen.

Übersicht

Die Klasse FilterWrapper nimmt Anbieter-Codecs und gibt umschlossene Codecs an die Anpassungsebene media.c2 zurück. Die Klasse FilterWrapper lädt libc2filterplugin.so über die FilterWrapper::Plugin API und zeichnet verfügbare Filter aus dem Plug-in auf. Beim Erstellen instanziiert FilterWrapper alle verfügbaren Filter. Nur Filter, die den Zwischenspeicher ändern, werden beim Start gestartet.

Plug-in-Architektur filtern

Abbildung 1: Plug-in-Architektur filtern.

Filter-Plug-in-Oberfläche

In der Oberfläche FilterPlugin.h werden die folgenden APIs definiert, 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 bereitstellt. Normalerweise enthält dieser Speicher nur die Filter, die von der Klasse FilterWrapper verwendet werden.

  • bool describe(C2String name, Descriptor *desc)

    Beschreibt die Filter zusätzlich zu den in C2ComponentStore verfügbaren Filtern. Folgende Beschreibungen sind definiert:

    • controlParam: Parameter, die das Verhalten der Filter steuern. Bei HDR zu SDR Tone Mapper ist der Steuerparameter beispielsweise die Zielübertragungsfunktion.
    • affectedParams: Parameter, die von den Filtervorgängen betroffen sind. Bei HDR zu SDR Tone Mapper sind beispielsweise die Farbaspekte betroffen.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Gibt true zurück, wenn die Filterkomponente den Zwischenspeicher verändert. Der Tonzuordnungsfilter gibt beispielsweise true zurück, wenn die Zielübertragungsfunktion SDR und die Eingabeübertragungsfunktion HDR (HLG oder PQ) ist.

FilterWrapper-Details

Im Abschnitt werden Details zur Klasse FilterWrapper beschrieben.

Erstellung

Die umschlossene Komponente instanziiert den zugrunde liegenden Decoder und alle definierten Filter bei der Erstellung.

Abfrage und Konfiguration

Die umschlossene Komponente trennt eingehende Parameter entsprechend der Filterbeschreibung von Abfragen oder Konfigurationsanfragen. Beispielsweise wird die Konfiguration des Filtersteuerungsparameters an den entsprechenden Filter weitergeleitet und die betroffenen Parameter aus den Filtern sind in den Abfragen vorhanden (anstatt aus dem Decodierer mit nicht betroffenen Parametern zu lesen).

Abfrage und Konfiguration

Abbildung 2: Abfrage und Konfiguration.

Start

Zu Beginn startet die umschlossene Komponente den Decoder und alle Filter, die die Zwischenspeicher ändern. Wenn kein Filter aktiviert ist, startet die umschlossene Komponente den Decoder und den Passthrough-Zwischenspeicher und sendet Befehle an den Decoder selbst.

Pufferbehandlung

Pufferbehandlung

Abbildung 3: Pufferbehandlung.

Puffer in der Warteschlange des verpackten Decoders werden an den zugrunde liegenden Decoder geleitet. Die verpackte Komponente erfasst den Ausgabezwischenspeicher vom Decoder über einen onWorkDone_nb()-Callback und stellt ihn dann bei den Filtern in die Warteschlange. Der endgültige Ausgabepuffer des letzten Filters wird dem Client gemeldet.

Damit diese Zwischenspeicherbehandlung funktioniert, muss die umschlossene Komponente C2PortBlockPoolsTuning für den letzten Filter konfigurieren, damit die Framework-Ausgabe vom erwarteten Blockpool aus zwischengespeichert wird.

Beenden, zurücksetzen und freigeben

Beim Beenden stoppt die umschlossene Komponente den Decoder und alle aktivierten Filter, die gestartet wurden. Beim Zurücksetzen und Release werden alle Komponenten zurückgesetzt oder freigegeben, unabhängig davon, ob sie aktiviert sind oder nicht.

Beispielfilter-Plug-in implementieren

So aktivieren Sie das Plug-in:

  1. Implementieren Sie die Schnittstelle FilterPlugin in einer Bibliothek und legen Sie sie bei /vendor/lib[64]/libc2filterplugin.so. ab.
  2. Fügen Sie mediacodec.te bei Bedarf weitere Berechtigungen hinzu.
  3. Aktualisieren Sie die Anpassungsebene auf Android 12 und erstellen Sie den Dienst media.c2 neu.

Plug-in testen

So testen Sie das Beispiel-Plug-in:

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

    m sample-codec2-filter-plugin
    
  3. Stellen Sie das Gerät wieder bereit und benennen Sie das Anbieter-Plug-in so um, dass 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