Unterstützte Formate

Eine Einführung zu Media-Formaten im Allgemeinen findest du auf der ExoPlayer supported formats Seite. Für das Laden, Extrahieren und Decodieren von Streams gelten mit Transformer dieselben Einschränkungen. Transformer unterstützt jedoch nicht die gebündelten Software-Decoder-Module von ExoPlayer.

Transformer verwendet außerdem MediaCodec für die Codierung, was die unterstützten Ausgabeformate einschränkt. Weitere Informationen zu den Einschränkungen bei der Codierung findest du unter Video-Codecs von MediaCodec.

Standardmäßig gibt Transformer Standard-MP4-Dateien mit InAppMp4Muxer aus. Wenn deine App fragmentierte MP4-Dateien erfordert, kannst du beim Initialisieren deiner Transformer Instanz eine InAppFragmentedMp4Muxer.Factory übergeben. Media3 unterstützt auch andere Formate wie WebM, AAC und Ogg mit speziellen Muxern wie WebmMuxer , AacMuxer und OggMuxer. Diese müssen in eine benutzerdefinierte Muxer.Factory eingebunden werden, um eingefügt zu werden. Zukünftige Versionen enthalten jedoch sofort einsatzbereite Factory-Implementierungen, um diesen Vorgang zu vereinfachen.

Bildunterstützung

Transformer verwendet BitmapFactory zum Laden und Decodieren aller Bild-Assets. Daher unterstützt Transformer alle Formate, die auch von BitmapFactory unterstützt werden. Unter Bildunterstützung findest du eine Liste der unterstützten Bildtypen. Bei Formaten mit mehreren Bildern (z.B. GIFs) wird ein einzelner Bildframe aus dem Container angezeigt, wenn DefaultAssetLoaderFactory verwendet wird.

Sonderformate

Transformer unterstützt die Verarbeitung von Eingaben in neueren Media-Formaten, die im Vergleich zu herkömmlichen Formaten spezielle Funktionen bieten.

Umgang mit HDR-Videos

Immer mehr Geräte unterstützen die HDR-Video aufnahme, die lebendigere, genauere Farben und einen größeren Helligkeitsbereich ermöglicht.

Transformer unterstützt die Bearbeitung von HDR-Videos ab Android 13 (API-Level 33) auf Geräten mit der erforderlichen Codierungsunterstützung. Beim Bearbeiten von HDR-Videos müssen alle GL-Videoeffekte 16-Bit-Gleitkomma-Farbkomponenten und den BT.2020-Farbraum verarbeiten. HDR_MODE_KEEP_HDR ist der Standardmodus beim Erstellen der Composition. Wenn die HDR-Bearbeitung nicht unterstützt wird, verwendet Transformer stattdessen HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL.

Die Konvertierung von HDR in SDR, auch Tonemapping genannt, wird ab Android 10 (API-Level 29) auf Geräten mit der erforderlichen Decodierungs- und OpenGL Unterstützung unterstützt. Das ist nützlich, wenn du HDR-Medien für andere Apps oder Dienste freigeben möchtest, die die Aufnahme von HDR-Inhalten nicht unterstützen. Wenn du das Tonemapping mit OpenGL aktivieren möchtest, rufe beim Erstellen der Composition die Funktion setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL) auf. Ab Android 12 (API-Level 31) unterstützt MediaCodec auch das Tonemapping auf einigen Geräten, einschließlich aller Geräte mit Android 13 oder höher, die HDR-Videos aufnehmen können. Wenn du das Tonemapping mit MediaCodec aktivieren möchtest, rufe setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC) auf.

Umgang mit Zeitlupenmedien

Zeitlupenvideos enthalten Metadaten, die die Geschwindigkeit angeben, mit der die einzelnen Abschnitte des Streams wiedergegeben werden sollen. Beim Flattening wird ein neuer Videostream auf Grundlage des Zeitlupenvideos erstellt, wobei die Abschnitte anhand der Metadaten beschleunigt oder verlangsamt werden, damit sie auch auf Playern korrekt wiedergegeben werden, die keine Zeitlupen-Metadaten anwenden.

Verwende die Builder-Methode setFlattenForSlowMotion für EditedMediaItem, um Zeitlupen-Streams zu flachen.

Kotlin

val editedMediaItem =
  EditedMediaItem.Builder(inputMediaItem).setFlattenForSlowMotion(true).build()
val transformer = Transformer.Builder(context).addListener(transformerListener).build()
transformer.start(editedMediaItem, outputPath)

Java

EditedMediaItem editedMediaItem =
    new EditedMediaItem.Builder(inputMediaItem).setFlattenForSlowMotion(true).build();
Transformer transformer =
    new Transformer.Builder(context).addListener(transformerListener).build();
transformer.start(editedMediaItem, outputPath);

So kannst du Zeitlupenvideos unterstützen, ohne dich um die Verarbeitung dieser Sonderformate kümmern zu müssen. Du musst nur die geflachte Version des Videos anstelle des Originals speichern und wiedergeben.