Eine Einführung in Media-Formate 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. Allerdings werden die gebündelten Software-Decoder-Module von ExoPlayer nicht unterstützt.
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 MediaCodec-Videocodecs.
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, Ogg und WAV mit speziellen Muxern wie
WebmMuxer, AacMuxer, OggMuxer und
WavMuxer. Diese müssen in eine benutzerdefinierte
Muxer.Factory eingebunden werden, um eingefügt zu werden. Zukünftige Versionen werden jedoch
sofort einsatzbereite Factory-Implementierungen enthalten, um diesen Prozess zu vereinfachen.
Bildunterstützung
Transformer verwendet BitmapFactory zum Laden und Decodieren aller Bild-Assets. Daher werden alle Formate unterstützt, 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, greift Transformer auf HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL zurück.
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 das Tonemapping auch 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, sodass 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.