Unter Android 12 (API-Level 31) und höher kann das System Videos, die in Formaten wie HEVC (H.265) aufgenommen wurden, automatisch in AVC (H.264) konvertieren, wenn die Videos in 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 |
HDR10 | HDR10 | MediaFeature.HdrType.HDR10 |
HDR10+ | HDR10Plus | MediaFeature.HdrType.HDR10_PLUS |
Android geht davon aus, dass Apps die Wiedergabe aller Medienformate unterstützen. Daher ist die Transcodierung kompatibler Medien standardmäßig deaktiviert.
Wann die Transcodierung verwendet werden sollte
Die Transcodierung ist ein rechenintensiver Vorgang und führt zu einer erheblichen Verzögerung beim Öffnen einer Videodatei. Beispiel: Die Transkodierung einer HEVC-Videodatei mit einer Länge von einer Minute in AVC dauert auf einem Pixel 3 etwa 20 Sekunden. Aus diesem Grund sollten Sie eine Videodatei nur dann transkodieren, wenn Sie sie vom Gerät senden. Das ist beispielsweise der Fall, wenn Sie eine Videodatei für andere Nutzer derselben App oder für einen Cloud-Server freigeben, der keine modernen Videoformate unterstützt.
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 ist.
Funktionen im Code deklarieren
Sie können Medienfunktionen im Code deklarieren, indem Sie mit einem Builder eine Instanz eines ApplicationMediaCapabilities
-Objekts erstellen:
val mediaCapabilities = ApplicationMediaCapabilities.Builder() .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) .build()
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()
:
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. }
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 angeben
Wenn du Funktionen in einer Ressource deklarierst, kannst du die Transcodierung umfassend steuern. 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 du diese Methode nicht unbedingt verwendest, kann es zu unerwünschten Transcodierungsszenarien kommen, z. B. beim Erstellen von Video-Thumbnails. Das beeinträchtigt die Nutzerfreundlichkeit.
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 Datei mit den Medienfunktionen hinzuzufügen. 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 transkodiert werden, bevor die Empfänger-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.
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. }
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 veranschaulichen die beiden gängigen Anwendungsfälle. In beiden Fällen wird das Originalvideo im HEVC-Format gespeichert und die App für die Videofreigabe unterstützt HEVC nicht.
Beispiel 1 Das Transcodieren wird von der Videoaufnahme-App initiiert.
Die Video-Sharing-App gibt in ihrer Ressourcendatei für Medienfunktionen an, dass sie HEVC nicht unterstützt. Anschließend wird ein Video von der Videoaufzeichnungs-App angefordert. Diese verarbeitet die Anfrage und öffnet die Datei mit
openTypedAssetFileDescriptor
, wobei die UID der App für die Freigabe angegeben wird. 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.
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. Dadurch wird der Transcodierungsvorgang gestartet. Nach Abschluss wird die Datei auf einen Server in der Cloud hochgeladen.
Nicht deklarierte Formate
Die kompatible Medientranscodierung ist für alle Formate aktiviert, die als nicht unterstützt deklariert sind, und für alle Formate deaktiviert, die als unterstützt deklariert sind. Bei anderen nicht deklarierten Formaten entscheidet die Plattform, ob eine Transcodierung durchgeführt wird. In Android 12 ist die Transcodierung deaktiviert für alle nicht deklarierten Formate. Dies kann sich bei neuen Formaten in der in der Zukunft.
Entwickleroptionen
Mit den folgenden Entwickleroptionen können Sie das Standardtranscodierungsverhalten von Android überschreiben:
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 standardmäßig deaktiviert.
Transcodierung aktivieren: Diese Einstellung gibt an, ob nicht deklarierte Formate automatisch transcodiert werden. Sie ist standardmäßig aktiviert, hat aber nur dann eine Auswirkung, wenn auch Transcodierungsstandardwerte überschreiben 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 im Manifest nicht angegeben ist, ob die App ein bestimmtes Format unterstützt, oder wenn Google die App nicht der Liste der serverseitigen erzwungenen Transcodierung hinzugefügt hat. 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.
Cache für Transcodierung deaktivieren: Wenn diese Option aktiviert ist, wird der Cache für Transcodierung nicht für Apps verwendet, für die eine Transcodierung erforderlich ist. Das kann während der Entwicklung hilfreich sein, um die Transcodierung einer nicht unterstützten Mediendatei ganz einfach auszulösen. Es kann jedoch zu einer schlechten Geräteleistung führen. Diese Option ist standardmäßig deaktiviert.