Transcodierung in kompatibles Medienformat

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. So können Apps auch dann funktionieren, wenn Videos auf dem Gerät in neueren Formaten aufgenommen werden.

Die Funktion „Transcodierung in kompatibles Medienformat“ 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 Medientranscodierungsfunktion bei Medienanbietern: Diese Komponente bei Medienanbietern fängt Apps ab, die auf Mediendateien zugreifen, und liefert entweder die Originaldatei oder eine transcodierte Datei basierend auf den angegebenen Funktionen der App. Wenn eine App das Format der Mediendatei unterstützt, ist keine spezielle Verarbeitung erforderlich. Wenn eine App das Format nicht unterstützt, konvertiert das Framework die Datei in ein älteres Format wie AVC, wenn die App auf die Datei zugreift.

Abbildung 1 zeigt einen Überblick über den Medientranscodierungsprozess.

Kompatible Medientranscodierung

Abbildung 1: Übersicht über die Transcodierung in kompatible Medienformate

Unterstützte Formate

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

  • HEVC (8 Bit) zu AVC: Codec-Konvertierungen werden durch die Verbindung eines Media-Codec-Decoders und eines Media-Codec-Encoders durchgeführt.
  • HDR10+ (10-Bit) zu AVC (SDR): HDR-zu-SDR-Konvertierungen werden mithilfe von MediaCodec-Instanzen und einem Anbieter-Plug-in durchgeführt, das in die Dekoderinstanzen eingebunden ist. Weitere Informationen finden Sie 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, bei denen das Transcodieren 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 Freigabetabellenblatts 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 der 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 prü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.

media-transcoding-architecture

Abbildung 2. Architektur der Medientranscodierung.

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

  • MediaTranscodingManager-System-API: Schnittstelle, über die der Client mit dem MediaTranscoding-Dienst kommunizieren kann. 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 basiert auf dem Media Framework NDK, um mit Modulen kompatibel zu sein.

Bei der Funktion „Transcodierung in kompatibles Medienformat“ werden Transcodierungsmesswerte sowohl im Dienst als auch im Medientranscodierer 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 App versucht, auf eine Datei zuzugreifen, fängt der FUSE-Daemon den Lesezugriff der App auf die Datei 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.

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 transkribierte 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üge der Liste für die erzwungene Transcodierung, die im Modul MediaProvider enthalten ist, Apps hinzu. Dadurch wird das Transcodieren für Apps ermöglicht, die ihre Manifestdatei nicht aktualisiert haben. Sobald eine App ihre Manifestdatei mit nicht unterstützten Formaten aktualisiert hat, muss sie aus der Liste der erzwungenen Transcodierung entfernt werden. Gerätehersteller können ihre Apps zur Liste der Apps hinzufügen oder daraus entfernen, die bei der Wiedergabe automatisch transkodiert werden, indem sie einen Patch einreichen oder einen Fehler melden. Das Android-Team überprüft die Liste regelmäßig und entfernt möglicherweise Apps daraus.
  • Unterstützte Formate mit dem App-Kompatibilitäts-Framework zur Laufzeit deaktivieren (Nutzer können dies auch in den Einstellungen für jede App 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).

Medientranscodierung aktivieren

Abbildung 3: Aktivieren Sie die Medientranscodierung auf dem Bildschirm „USB-Einstellungen“.

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 der Priorität 1 konfiguriert sind, müssen sie mit dem höchstmöglichen Durchsatz arbeiten. Wir empfehlen, dass die Transcodierungsleistung mindestens 200 fps erreicht. Führe die Media-Transcoder-Benchmark unter frameworks/av/media/libmediatranscoding/transcoder/benchmark aus, um die Leistung deiner Hardware zu testen.

Zertifizierungsstufe

Führe die folgenden CTS-Tests aus, um die kompatible Medientranscodierungsfunktion 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

Beschränkung der Videolänge verlängern

Für Testzwecke kannst du die Beschränkung der Videolänge auf eine Minute für das Transcodieren mit dem folgenden Befehl aufheben. Nach 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 Transcodierung in kompatibles Medienformat.

HDR-zu-SDR-Codierung

Zur Unterstützung der HDR-zu-SDR-Codierung können Gerätehersteller das AOSP-Sample-Codec 2.0-Filter-Plug-in unter /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 enthält, das die Codierung von HDR in SDR 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 Decoder mit Filter-Plug-ins umschließt. MediaCodec erkennt diese umschlossenen Komponenten als Decodierer mit Filterfunktionen.

Übersicht

Die FilterWrapper-Klasse nimmt Anbieter-Codecs entgegen und gibt verpackte Codecs an die media.c2-Anpassungsschicht zurück. Die FilterWrapper-Klasse 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.

Architektur von Filter-Plug-ins

Abbildung 1. Architektur des Filter-Plug-ins

Filter-Plug-in-Oberfläche

In der Schnittstelle FilterPlugin.h werden die folgenden APIs definiert, um die Filter verfügbar zu machen:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Gibt ein C2ComponentStore-Objekt mit Filtern zurück. 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 FilterWrapper-Klasse verwendet werden.

  • bool describe(C2String name, Descriptor *desc)

    Hier werden die Filter beschrieben, die zusätzlich zu den Filtern verfügbar sind, die über C2ComponentStore aufgerufen werden können. Folgende Beschreibungen sind definiert:

    • controlParam: Parameter, die das Verhalten der Filter steuern. Bei einem HDR-zu-SDR-Ton-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 Parameters für die Filtersteuerung an den entsprechenden Filter weitergeleitet und betroffene Parameter aus den Filtern sind in den Abfragen vorhanden (anstelle des Lesens aus dem Decoder mit nicht betroffenen Parametern).

Abfrage und Konfiguration

Abbildung 2. Abfrage und Konfiguration

Starten

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

Pufferbehandlung

Pufferbehandlung

Abbildung 3 Zwischenspeicherverwaltung

Puffer in der Warteschlange des verpackten Decoders werden an den zugrunde liegenden Decoder geleitet. Die verpackte Komponente erfasst den Ausgabepuffer 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.

Beispiel-Filter-Plug-in implementieren

So aktivieren Sie das Plug-in:

  1. Implementieren Sie die FilterPlugin-Schnittstelle in einer Bibliothek und legen Sie sie unter /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. Verbinden Sie das Gerät wieder 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