Transcodierung kompatibler Medien

Unter Android 12 (API-Level 31) und höher kann das System Videos, die in Formaten wie HEVC (H.265) bis AVC (H.264) aufgenommen wurden, von einer App geöffnet werden, die HEVC nicht unterstützt. Mit dieser Funktion können Apps erfassen, um eine modernere, speichereffizientere Codierung von Videos zu nutzen die auf dem Gerät aufgezeichnet werden, ohne Abstriche bei der Kompatibilität mit anderen Apps zu machen.

Die folgenden Formate können automatisch für Inhalte transcodiert werden, die auf dem Gerät erstellt:

Medienformat XML-Attribut MediaFormat-MIME-Typ
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10 MediaFeature.HdrType.HDR10
HDR10+ HDR10Plus MediaFeature.HdrType.HDR10_PLUS

Android geht davon aus, dass Apps die Wiedergabe aller Medienformate unterstützen, Die Transcodierung für kompatible Medien ist standardmäßig deaktiviert.

Wann sollte die Transcodierung verwendet werden?

Die Transcodierung ist ein rechenintensiver Vorgang und sorgt für eine beim Öffnen einer Videodatei. Eine einminütige HEVC-Videodatei nimmt etwa 20 Sekunden für die AVC auf einem Pixel 3-Smartphone. Aus diesem Grund sollten Sie eine Videodatei nur dann transcodieren, wenn Sie sie aus dem . Wenn Sie beispielsweise eine Videodatei mit anderen Nutzern App oder einen Cloud-Server, der keine modernen Videos unterstützt Formaten.

Transcodieren Sie keine Dateien, wenn Sie Videodateien zur Wiedergabe auf dem Gerät oder zum Erstellen von Miniaturansichten öffnen.

Transcodierung konfigurieren

Apps können ihr Transcodierungsverhalten steuern, indem sie ihre Medien deklarieren Funktionen. Es gibt zwei Möglichkeiten, diese Funktionen zu deklarieren: oder in einer Ressource.

Funktionen im Code deklarieren

Sie können Medienfunktionen im Code deklarieren, indem Sie eine Instanz einer ApplicationMediaCapabilities-Objekt mithilfe eines Builders:

Kotlin

val mediaCapabilities = ApplicationMediaCapabilities.Builder()
    .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
    .build()

Java

ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder()
        .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
        .build();

Verwenden Sie dieses Objekt beim Zugriff auf Medieninhalte über Methoden wie ContentResolver#openTypedAssetFileDescriptor():

Kotlin

val providerOptions = Bundle().apply {
    putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities)
}
contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)
    .use { fileDescriptor ->
        // Content will be transcoded based on values defined in the
        // ApplicationMediaCapabilities provided.
    }

Java

Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities);
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
    // Content will be transcoded based on values defined in the
    // ApplicationMediaCapabilities provided.
}

Diese Methode ermöglicht eine detaillierte Kontrolle für bestimmte Codepfade, z. B. wie die Transcodierung nur beim Übertragen einer Videodatei an ein anderes Gerät erfolgt. Sie hat Vorrang vor der unten beschriebenen Methode.

Funktionen in einer Ressource deklarieren

Durch das Deklarieren von Funktionen in einer Ressource haben Sie die volle Kontrolle über die Transcodierung. Diese Methode sollte nur in sehr spezifischen Fällen verwendet werden. Wenn Ihre App zum Beispiel empfängt nur Videodateien von anderen Apps, anstatt sie direkt zu öffnen. und lädt sie auf einen Server hoch, der keine modernen Video-Codecs unterstützt (siehe Beispielszenario 1 unten).

Wenn diese Methode nicht unbedingt erforderlich ist, kann es passieren, dass die Transcodierung in unbeabsichtigten Szenarien ausgelöst wird, z. B. beim Thumbnail-Bilden von Videos, was die Nutzererfahrung beeinträchtigt.

Erstellen Sie eine media_capabilities.xml-Ressourcendatei, um diese Methode zu verwenden:

<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
    <format android:name="HEVC" supported="true"/>
    <format android:name="HDR10" supported="false"/>
    <format android:name="HDR10Plus" supported="false"/>
</media-capabilities>

In diesem Beispiel werden mit dem Gerät aufgenommene HDR-Videos nahtlos in AVC SDR-Videos (Standard Dynamic Range), HEVC-Videos nicht.

Verwende ein property-Tag innerhalb des application-Tags, um einen Verweis auf die Medien hinzuzufügen. Capabilities-Datei. Fügen Sie der Datei AndroidManifest.xml diese Attribute hinzu:

<property
    android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
    android:resource="@xml/media_capabilities" />

Verwenden der Medienfunktionen einer anderen App zum Öffnen einer Videodatei

Wenn Ihre App eine Videodatei für eine andere App freigibt, muss die Videodatei möglicherweise transcodiert werden kann, bevor die empfangende App sie öffnen kann.

Öffnen Sie in diesem Fall eine Videodatei mit openTypedAssetFileDescriptor. und die UID der empfangenden App angeben, die mit Binder.getCallingUid abgerufen werden kann. Die Plattform ermittelt dann mithilfe der Medienfunktionen der empfangenden App ob die Videodatei transcodiert werden soll.

Kotlin

val providerOptions = Bundle().apply {
    putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid())
}
contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)
    .use { fileDescriptor ->
        // Content will be transcoded based on the media capabilities of the
        // calling app.
    }

Java

Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid());
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
    // Content will be transcoded based on the media capabilities of the
    // calling app.
}

Beispielszenarien

Die folgenden Diagramme zeigen die beiden häufigsten Anwendungsfälle. In beiden Fällen wird das Originalvideo im HEVC-Format gespeichert und die App zum Teilen von Videos unterstützen HEVC.

Beispiel 1: Die Transcodierung wird von der Videoaufnahme-App eingeleitet. Beispiel 1 Die App zum Teilen von Videos gibt an, dass sie HEVC in ihren Medien nicht unterstützt Datei mit Capabilities-Ressourcen. Anschließend wird ein Video von der Videoaufnahme-App angefordert. Die Videoaufnahme Die App verarbeitet die Anfrage und öffnet die Datei mit openTypedAssetFileDescriptor. Dabei wird die UID der Freigabe-App angegeben. Dadurch wird der Transcodierungsprozess gestartet. Wenn das transcodierte Video empfangen wird, wird es der Freigabe-App bereitgestellt, die es auf einen Server in der Cloud hochlädt.

Beispiel 2: Die Transcodierung wird von der App zum Teilen von Videos eingeleitet. Beispiel 2 Die Videoaufnahme-App teilt ein Video über eine MediaStore-URI. Die App zum Teilen von Videos öffnet die Videodatei mit openTypedAssetFileDescriptor und gibt an, dass HEVC in den Medienfunktionen nicht unterstützt wird. Dieses initiiert den Transcodierungsprozess. Sobald er abgeschlossen ist, wird die Datei auf einem Server in der Cloud.

Nicht deklarierte Formate

Die kompatible Medientranscodierung ist für alle deklarierten Formate aktiviert wird nicht unterstützt und ist für alle Formate deaktiviert, die als unterstützt deklariert werden. Für nicht deklarierte Formate, entscheidet die Plattform, ob die Transcodierung oder nicht. In Android 12 ist die Transcodierung deaktiviert für alle nicht deklarierten Formate. Dies kann sich bei neuen Formaten in der zu entwickeln.

Entwickleroptionen

Mit den folgenden Entwickleroptionen können Sie die Standardeinstellung von Android überschreiben. Transcodierungsverhalten:

  • Standardeinstellungen für Transcodierung überschreiben Mit dieser Einstellung wird festgelegt, steuert die Plattform die automatische Transcodierung. Wenn überschrieben aktiviert ist, werden die Standardeinstellungen der Plattform ignoriert und die Option Transcodierung steuert die automatische Transcodierung. Diese Option ist deaktiviert durch Standardeinstellung.

  • Transcodierung aktivieren: Diese Einstellung gibt an, ob Formate automatisch transcodiert. Standardmäßig ist es aktiviert, aber es wird nur wird angewendet, wenn Standardeinstellungen für die Transcodierung überschreiben ebenfalls aktiviert ist.

  • Vorausgesetzt, Apps unterstützen moderne Formate Mit dieser Einstellung wird festgelegt, was passiert, wenn versucht die App, ein nicht deklariertes Format wiederzugeben. Das passiert, wenn das Manifest nicht angeben, ob die App ein bestimmtes Format unterstützt oder nicht hat die Anwendung nicht zur serverseitigen Liste erzwungener Transcodierungen hinzugefügt. Wenn die Einstellung aktiviert ist, transcodiert die App nicht. Ist sie deaktiviert, tut die App Transkodierung. Diese Option ist standardmäßig aktiviert.

  • Benachrichtigungen zur Transcodierung anzeigen Wenn diese Option aktiviert ist, zeigt die App Benachrichtigung über den Fortschritt der Transcodierung, wenn die Transcodierung durch Lesen eines nicht unterstützte Mediendatei. Diese Option ist standardmäßig aktiviert.

  • Transcodierungs-Cache deaktivieren: Wenn diese Option aktiviert ist, gilt das für Apps, die eine Transcodierung erfordern, den Transcodierungs-Cache verwenden. Das kann bei der Entwicklung hilfreich sein, Die Transcodierung wird für eine nicht unterstützte Mediendatei ausgelöst, dies kann jedoch zu einem schlechten Gerät führen. die Leistung. Diese Option ist standardmäßig deaktiviert.