Zwischen Formaten transcodieren
Du kannst die Audio- und Videoausgabeformate angeben, die du produzieren möchtest, wenn der Entwicklung von Transformer. Der folgende Code zeigt beispielsweise, wie um den Transformer für die Ausgabe von H.264/AVC-Video und AAC-Audio zu konfigurieren:
Kotlin
Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build()
Java
new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build();
Wenn das Eingabemedienformat bereits mit den Konfigurationen für Audio übereinstimmt oder Videos übertragen, wechselt Transformer automatisch zu Transmuxing, d. h. vom Eingabecontainer in den Ausgabecontainer, Änderung. Dadurch werden Computing-Kosten und potenzielle Qualitätsverluste die Decodierung und Neucodierung im selben Format.
Audio oder Video entfernen
Entfernen Sie Audio- oder Videoinhalte mit EditedMediaItem.Builder
. Beispiele:
Kotlin
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
Java
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
Clip zuschneiden
Du kannst alle Medien außerhalb der angegebenen Start- und Endzeiten entfernen, indem du die Clipping-Konfiguration für das Eingabemedienelement. Um beispielsweise eine Clip zwischen 10 und 20 Sekunden, der nur die Medien enthält:
Kotlin
val inputMediaItem = MediaItem.Builder() .setUri(uri) .setClippingConfiguration( ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build()
Java
MediaItem inputMediaItem = new MediaItem.Builder() .setUri(uri) .setClippingConfiguration( new MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build();
Schnitte optimieren
Wenn du die Latenz beim Zuschneiden des Anfangs eines Videos verringern möchtest, aktiviere die Option „Zuschneiden“ Optimierung.
Kotlin
Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build()
Java
new Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build();
Dadurch wird der Export beschleunigt, da nur so wenig Video wie
Anschließend werden die neu codierten Daten
mit dem Rest der ursprünglichen
Video. Die Optimierung basiert darauf, dass ein Teil der Eingabedatei zusammengefügt werden kann.
mit neu codierter Ausgabe. Das bedeutet, dass das Ausgabeformat des Encoders und der
Eingabeformat muss kompatibel sein. Wenn die Datei beispielsweise ursprünglich
die auf einem Gerät mit einer anderen Encoder-Implementierung produziert wurden,
dass die Optimierung nicht angewendet werden kann.
Für eine erfolgreiche Optimierung muss der Encoder, der Transformer über die
EncoderFactory
muss eine Stufe und ein Profil haben, die mit dem Eingabeformat kompatibel sind.
Diese Optimierung funktioniert nur bei MP4-Eingaben aus einem Asset ohne Effekte außer
keine durch 90 Grad teilbaren Videoeffekte und Rotationen. Wenn die Optimierung
schlägt er fehl, greift Transformer automatisch auf den normalen Export zurück und meldet
Ergebnis der Optimierung in ExportResult.OptimizationResult
.
Wir überprüfen diese Funktionalität und gehen davon aus, dass sie nicht experimentell ist in einer späteren Version.
Videobearbeitungen
In EditedMediaItems
findest du eine Liste mit Audioprozessoren und Videoeffekten, die in
Reihenfolge. Die Bibliothek enthält Videoeffekt-Implementierungen
für gängige Anwendungsfälle,
Sie können auch benutzerdefinierte Effekte schreiben und diese beim Erstellen bearbeiteter Medien übergeben.
Elemente.
Sie können Medien neu skalieren. Dies kann nützlich sein, um Bandbreite bei einer sehr hohen Auflösung wie 4K- oder 8K-Video. So skalieren Sie beispielsweise proportional auf eine Höhe von 480 Pixeln:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf(Presentation.createForHeight(480)) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480)))) .build();
Alternativ können Sie um einen bestimmten Faktor skalieren, z. B. um die Größe zu halbieren:
Kotlin
val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()))) .build();
Sie können die Rotation auf die gleiche Weise konfigurieren:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder() .setRotationDegrees(90f) .build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build()))) .build();
Benutzerdefinierte Videoeffekte
Der Effects
-Konstruktor akzeptiert eine Liste von Audio- und Videoeffekten, die angewendet werden können.
Intern konvertiert das Effect-Framework von Transformer die Liste der Videoeffekte
in eine Abfolge von GL-Shaderprogrammen,
die der Reihe nach angewendet werden. In einigen Fällen
kann das Effecten-Framework mehrere Effekte mit einem Shader-Programm anwenden.
Zum Beispiel kann ein Shader-Programm mehrere aufeinanderfolgende Matrix anwenden.
Transformationen, die die Effizienz und Qualität verbessern.
Videoeffekte werden auch für die Vorschau im ExoPlayer unterstützt, wobei
ExoPlayer.setVideoEffects
Die Demo-App enthält Beispiele für benutzerdefinierte Videoeffekte.
Audiobearbeitungen
Audioeffekte werden durch Anwenden einer AudioProcessor
-Sequenz implementiert
in Rohaudio (PCM-Audio). ExoPlayer unterstützt die Übergabe von Audioprozessoren an den
DefaultAudioSink.Builder
, womit sich Audiobearbeitungen in der Vorschau ansehen können.