Transformasi

Melakukan transcoding antar-format

Anda dapat menentukan format audio dan video output yang ingin Anda hasilkan saat yang membangun Transformer. Misalnya, kode berikut menunjukkan cara untuk mengonfigurasi Transformer agar menghasilkan 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 otomatis beralih ke transmuxing, yaitu menyalin sampel terkompresi dari container input ke container output tanpa modifikasi. Hal ini menghindari biaya komputasi dan potensi hilangnya kualitas decoding dan pengkodean ulang dalam format yang sama.

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

Pangkas klip

Anda dapat menghapus media apa pun di luar stempel waktu awal dan akhir yang ditentukan dengan menetapkan 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();

Mengoptimalkan pemangkasan

Untuk mengurangi latensi trim di bagian awal video, aktifkan fitur pangkas pengoptimalan.

Kotlin

Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build()

Java

new Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build();

Hal ini mempercepat ekspor dengan mendekode dan mengenkode ulang durasi video mungkin, kemudian menggabungkan data yang dienkode ulang dengan video. Pengoptimalan bergantung pada kemampuan menggabungkan bagian dari file input dengan output yang baru dienkode, yang berarti format output encoder dan format input harus kompatibel. Misalnya, jika file itu awalnya yang dihasilkan di perangkat dengan implementasi encoder yang berbeda, maka kemungkinan bahwa pengoptimalan itu tidak mungkin dilakukan. Agar pengoptimalan berhasil, encoder disediakan ke Transformer melalui EncoderFactory harus memiliki tingkat dan profil yang kompatibel dengan format input.

Pengoptimalan ini hanya berfungsi dengan input MP4 aset tunggal tanpa efek kecuali tidak ada rotasi dan efek video op yang dibagi 90 derajat. Jika pengoptimalan gagal, Transformer secara otomatis akan kembali ke ekspor normal, dan melaporkan pengoptimalan di ExportResult.OptimizationResult.

Kami memvalidasi fungsi ini dan berharap fungsi ini tidak bersifat eksperimental dalam rilis selanjutnya.

Pengeditan video

EditedMediaItems memiliki daftar prosesor audio dan efek video untuk diterapkan pesanan. Library ini menyertakan implementasi efek video untuk kasus penggunaan umum, atau Anda bisa menulis efek khusus dan meneruskannya saat membuat media yang diedit item.

Anda dapat mengubah skala media, yang dapat berguna untuk menghemat pemrosesan sumber daya atau {i>bandwidth<i} ketika menangani input resolusi sangat tinggi, seperti video 4K atau 8K. Misalnya, untuk menskalakan secara proporsional hingga 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 hingga separuhnya:

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 matriks berturut-turut transformasi, yang 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 AudioProcessor ke audio mentah (PCM). ExoPlayer mendukung penerusan prosesor audio ke DefaultAudioSink.Builder, yang memungkinkan pratinjau pengeditan audio.