Transformationen

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.