Transformasi

Melakukan transcoding antarformat

Anda dapat menentukan format audio dan video output yang ingin dihasilkan saat mem-build Transformer. Misalnya, kode berikut menunjukkan cara mengonfigurasi Transformer untuk menghasilkan output video H.264/AVC dan audio AAC:

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();

Jika format media input sudah sesuai dengan konfigurasi untuk audio atau video, Transformer akan otomatis beralih ke transmuxing, yaitu menyalin sampel terkompresi dari penampung input ke penampung output tanpa perubahan. Hal ini akan menghindari biaya komputasi dan potensi hilangnya kualitas decoding dan encoding ulang dalam format yang sama.

Hapus audio atau video

Hapus audio atau video menggunakan EditedMediaItem.Builder, misalnya:

Kotlin

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

Java

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

Memangkas klip

Anda dapat menghapus media apa pun di luar stempel waktu awal dan akhir yang ditentukan dengan menyetel konfigurasi kliping pada item media input. Misalnya, untuk menghasilkan klip yang hanya berisi media antara 10 detik dan 20 detik:

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();

Pengeditan video

EditedMediaItems memiliki daftar pemroses audio dan efek video untuk diterapkan secara berurutan. Library ini menyertakan implementasi efek video untuk kasus penggunaan umum, atau Anda dapat menulis efek kustom dan meneruskannya saat membuat item media yang diedit.

Anda dapat menskalakan ulang media, yang dapat berguna untuk menghemat resource atau bandwidth pemrosesan saat menangani input resolusi sangat tinggi, seperti video 4K atau 8K. Misalnya, untuk menskalakan secara proporsional ke tinggi 480 piksel:

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();

Atau, Anda dapat menskalakan berdasarkan faktor tertentu, misalnya, untuk membagi ukuran menjadi dua:

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();

Anda dapat mengonfigurasi rotasi dengan cara yang sama:

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();

Efek video kustom

Konstruktor Effects menerima daftar efek audio dan video untuk diterapkan. Secara internal, framework efek Transformer mengonversi daftar efek video menjadi urutan program shader GL yang diterapkan secara berurutan. Dalam beberapa kasus, framework efek dapat menerapkan beberapa efek dengan satu program shader. Misalnya, satu program shader dapat menerapkan beberapa transformasi matriks berurutan, yang akan meningkatkan efisiensi dan kualitas.

Efek video juga didukung untuk pratinjau di ExoPlayer, menggunakan ExoPlayer.setVideoEffects.

Aplikasi demo menyertakan contoh efek video kustom.

Pengeditan audio

Efek audio diimplementasikan dengan menerapkan urutan instance AudioProcessor ke audio mentah (PCM). ExoPlayer mendukung penerusan prosesor audio ke DefaultAudioSink.Builder, yang memungkinkan pratinjau pengeditan audio.