Transcodierung in kompatibles Medienformat

Die kompatible Medientranscodierung, die in Android 12 eingeführt wurde, ist eine Funktion, mit der Geräte modernere, speichereffiziente Medienformate wie HEVC für die Videoaufnahme verwenden können und gleichzeitig die Kompatibilität mit Apps beibehalten. 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. Auf Geräten mit aktivierter kompatibler Medientranscodierung kann Android Videos (bis zu einer Minute lang), die in Formaten wie HEVC oder HDR aufgenommen wurden, automatisch konvertieren, wenn die Videos in einer App geöffnet werden, die das 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. Damit Apps Medientranscodierung anfordern können, müssen sie ihre Medienfunktionen angeben. Weitere Informationen zum Deklarieren von Medienfunktionen finden Sie auf der Website für Android-Entwickler unter Kompatible Medientranscodierung.

Funktionsweise

Die Funktion zum Transcodieren kompatibler Medien besteht aus zwei Hauptteilen:

  • Transcodierungsdienste im Medien-Framework:Diese Dienste konvertieren Dateien mithilfe von Hardware von einem Format in ein anderes, um eine geringe Latenz und eine hohe Konvertierungsqualität zu erreichen. Dazu gehören die Transcoding API, der Transcoding-Dienst, ein OEM-Plug-in für benutzerdefinierte Filter und 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 eine Übersicht über den Medientranscodierungsprozess.

Transcodierung in kompatibles Medienformat

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

Unterstützte Formate

Die kompatible Medientranscodierungsfunktion 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 mit MediaCodec-Instanzen und einem Anbieter-Plug-in durchgeführt, das an die Decoder-Instanzen angehängt ist. Weitere Informationen finden Sie unter HDR-zu-SDR-Codierung.

Unterstützte Contentquellen

Die kompatible Medientranscodierungsfunktion unterstützt On-Device-Medien, die von der nativen Kamera-App des OEMs generiert und im Ordner DCIM/Camera/ auf dem primären externen Volume gespeichert werden. Die Funktion unterstützt keine Medien auf sekundärem Speicher. Inhalte, die per E-Mail oder SD-Karte an Geräte gesendet 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 die Intents des Betriebssystem-Share-Sheets (nur MediaStore-URI)
    • MTP-/PTP-Dateiübertragung vom Smartphone auf den PC
  • Transcodierung übersprungen:

    • Dateien von einem Gerät übertragen, indem die SD-Karte ausgeworfen wird
    • Dateien mithilfe von Optionen wie Nearby Share oder Bluetooth übertragen

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 kann erforderlich sein, um die Anforderungen des Mobilfunkanbieters oder lokale Bestimmungen zu erfüllen.

Wenn du einen Dateipfad hinzufügen möchtest, verwende den Transcode-Pfad Runtime Resource Overlay (RRO), also 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>

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 Medientranscodierungsfunktion 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. Das Modul MediaProvider verwendet diese API.
  • 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 clientseitige und serverseitige Code befindet sich im MediaProvider-Modul, um zeitnah Fehlerkorrekturen und Updates vornehmen zu können.

Dateizugriff

Die kompatible Medientranscodierung basiert auf dem Dateisystem in Userspace (FUSE), das für den befristeten Speicher verwendet wird. Mit FUSE kann das MediaProvider-Modul Dateivorgänge im Nutzerbereich prüfen und den Zugriff auf Dateien basierend auf der Richtlinie zulassen, verweigern oder entfernen.

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 kompatible Medientranscodierungsfunktion ist standardmäßig deaktiviert. Wenn das Gerät HEVC unterstützt, werden Dateien von Android also nur dann transcodiert, wenn dies von einer App in einer Manifestdatei oder in der Liste für die erzwungene Transcodierung angegeben wird.

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

  • Deklarieren Sie nicht unterstützte Formate in der Manifestdatei. 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. Dazu müssen 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).
  • Dateien mit MediaStore öffnen und dabei nicht unterstützte Formate explizit mit der openTypedAssetFileDescriptor-API angeben

Bei USB-Übertragungen (Gerät zu PC) ist die Transcodierung standardmäßig deaktiviert. Nutzer können sie jedoch über die Option 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

Damit Transcodierungsanfragen die Systemressourcen nicht über einen längeren Zeitraum belegen, sind Apps, die Transcodierungssitzungen 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

Damit die Funktion zur Transcodierung kompatibler Medien unterstützt wird, müssen die 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 die Transcodierung von HDR nach SDR unterstützen) Gerät unterstützt die HDR-Videoaufnahme

Um die Geräteleistung für die Medientranscodierung zu gewährleisten, müssen die Leistung der Videohardware und die Lese-/Schreibleistung des Speichers 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 den Benchmark für den Medientranskoder unter frameworks/av/media/libmediatranscoding/transcoder/benchmark aus, um die Hardwareleistung 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 Transcodierungs-Framework oder das App-Verhalten mit Transcodierung testen möchten, können Sie die Funktion „Transcodierung in kompatibles Medienformat“ global aktivieren oder deaktivieren. Aktivieren Sie auf der Seite „Entwickleroptionen“ unter Einstellungen > System > Entwickler > Medientranscodierung die Option Transcodierungsstandardwerte überschreiben und dann die Option Transcodierung aktivieren. Wenn diese Einstellung aktiviert ist, kann die Medientranscodierung im Hintergrund für andere Apps als die von Ihnen entwickelte erfolgen.

Transcodierungsstatus prüfen

Während des Tests kannst du mit dem folgenden ADB-Shell-Befehl den Transcodierungsstatus 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-Beispiel-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 zwischen der Codec 2.0-Schnittstelle und der android.hardware.media.c2 HAL-Schnittstelle 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 verpackten Komponenten als Decoder 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. Bei der Erstellung instanziiert FilterWrapper alle verfügbaren Filter. Nur Filter, die den Puffer ändern, werden beim Start gestartet.

Architektur von Filter-Plug-ins

Abbildung 4: Architektur des Filter-Plug-ins

Filter-Plug-in-Benutzeroberfläche

Die FilterPlugin.h-Schnittstelle definiert die folgenden APIs, um die Filter bereitzustellen:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Gibt ein C2ComponentStore-Objekt mit Filtern zurück. Dies ist unabhängig von den Informationen, die 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. Die folgenden 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 einem HDR-zu-SDR-Ton-Mapper sind beispielsweise die Farbaspekte betroffen.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Gibt true zurück, wenn die Filterkomponente den Puffer verändert. Der Tonmapping-Filter gibt beispielsweise true zurück, wenn die Zieltransferfunktion SDR und die Eingabetransferfunktion HDR (HLG oder PQ) ist.

FilterWrapper-Details

In diesem Abschnitt werden Details zur FilterWrapper-Klasse beschrieben.

Erstellung

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

Abfrage und Konfiguration

Die gewrappte Komponente trennt eingehende Parameter gemäß 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 5: Abfrage und Konfiguration

Starten

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

Pufferverwaltung

Pufferverwaltung

Abbildung 6 Zwischenspeicherverwaltung

Puffer, die für den verpackten Decoder in die Warteschlange gestellt werden, werden an den zugrunde liegenden Decoder weitergeleitet. Die gewrappte Komponente ruft den Ausgabepuffer über einen onWorkDone_nb()-Callback vom Decoder ab und stellt ihn dann den Filtern zur Verfügung. Der letzte Ausgabepuffer vom letzten Filter wird an den Client gesendet.

Damit diese Pufferverwaltung funktioniert, muss die gewrappte Komponente C2PortBlockPoolsTuning für den letzten Filter konfigurieren, damit die Framework-Ausgabe-Puffer aus dem erwarteten Blockpool stammen.

Beenden, zurücksetzen und freigeben

Bei „stop“ beendet die gewrappte 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.

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 zusätzliche Berechtigungen hinzu.
  3. Aktualisieren Sie die Anpassungsschicht auf Android 12 und erstellen Sie den media.c2-Dienst neu.

Plug-in testen

So testen Sie das Beispiel-Plug-in:

  1. Erstellen Sie das Gerät neu und flashen Sie es.
  2. Erstelle 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