Transformation

Zwischen Formaten transcodieren

Sie können die Audio- und Videoformate für die Ausgabe angeben, die beim Erstellen des Transformers erstellt werden sollen. Der folgende Code zeigt beispielsweise, wie Sie den Transformer für die Ausgabe von H.264/AVC-Video und AAC-Audio 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 oder Video übereinstimmt, wechselt Transformer automatisch zu Transmuxing, d. h., die komprimierten Samples werden unverändert aus dem Eingabecontainer in den Ausgabecontainer kopiert. Dadurch werden die Rechenkosten und der potenzielle Qualitätsverlust bei der Decodierung und Neucodierung im selben Format vermieden.

Audio oder Video entfernen

Entfernen Sie Audio- oder Videoinhalte mit EditedMediaItem.Builder, z. B.:

Kotlin

EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()

Java

new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();

Clip zuschneiden

Sie können alle Medien außerhalb der angegebenen Start- und Endzeitstempel entfernen, indem Sie die Clipping-Konfiguration für das Eingabemedienelement festlegen. So erstellst du beispielsweise einen Clip, der nur Medien zwischen 10 und 20 Sekunden 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();

Videobearbeitungen

EditedMediaItems enthält Listen mit Audioprozessoren und Videoeffekten, die der Reihe nach angewendet werden können. Die Bibliothek enthält Implementierungen von Videoeffekten für häufige Anwendungsfälle. Sie können aber auch benutzerdefinierte Effekte schreiben und beim Erstellen bearbeiteter Medienobjekte übergeben.

Sie können Medien neu skalieren. Dies kann nützlich sein, um Verarbeitungsressourcen oder Bandbreite zu sparen, wenn es sich um sehr hochauflösende Eingaben wie 4K- oder 8K-Videos handelt. So skalieren Sie beispielsweise proportional auf 480 Pixel hoch:

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 auch nach einem bestimmten Faktor skalieren, um beispielsweise 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();

So können Sie die Rotation 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 sollen. Intern wandelt das Effekt-Framework von Transformer die Liste der Videoeffekte in eine Folge von GL-Shader-Programmen um, die nacheinander angewendet werden. In einigen Fällen kann das Effekte-Framework mehrere Effekte mit einem einzigen Shader-Programm anwenden. Beispielsweise kann ein Shader-Programm mehrere aufeinanderfolgende Matrixtransformationen anwenden, was Effizienz und Qualität verbessert.

Videoeffekte werden auch für die Vorschau in ExoPlayer mit ExoPlayer.setVideoEffects unterstützt.

Die Demo-App enthält Beispiele für benutzerdefinierte Videoeffekte.

Audiobearbeitungen

Audioeffekte werden durch Anwendung einer Sequenz von AudioProcessor-Instanzen auf Rohaudio (PCM) implementiert. ExoPlayer unterstützt die Übergabe von Audioprozessoren an den DefaultAudioSink.Builder, wodurch eine Vorschau von Audiobearbeitungen angezeigt werden kann.