Transformasi

Melakukan transcoding antar-format

Anda dapat menentukan format audio dan video output yang ingin dihasilkan saat membuat Transformer. Misalnya, kode berikut menunjukkan cara mengonfigurasi Transformer untuk 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 cocok dengan konfigurasi untuk audio atau video, Transformer akan otomatis beralih ke transmuxing, yaitu menyalin sampel terkompresi dari penampung input ke penampung output tanpa modifikasi. Hal ini menghindari biaya komputasi dan potensi penurunan kualitas decoding dan encoding 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();

Memangkas 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(
      MediaItem.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();

Daftar edit MP4

Untuk pemangkasan yang lebih cepat, Transformer mendukung daftar edit MP4, sehingga memungkinkan pengeditan "khusus pemangkasan" yang lebih efisien tanpa transcoding ulang video lengkap. Metode ini menggunakan sampel yang dienkode yang ada dan "pre-roll" dalam daftar edit, yang menginstruksikan pemutar untuk memulai pemutaran pada titik tertentu, sehingga secara efektif melewati segmen awal yang tidak diinginkan.

Untuk membuat pengeditan khusus pemangkasan jauh lebih cepat, panggil experimentalSetMp4EditListTrimEnabled(true).

Kotlin

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

Java

new Transformer.Builder(context).experimentalSetMp4EditListTrimEnabled(true).build();
Perlu diperhatikan bahwa tidak semua pemutar media mendukung posisi "pre-roll". Artinya, saat pemutar tersebut digunakan, file akan mulai diputar dari awal absolut sampel yang dienkode, terlepas dari informasi daftar edit yang mungkin menentukan titik awal yang berbeda.

Mengoptimalkan pemangkasan

Untuk mengurangi latensi pemangkasan awal video, aktifkan pengoptimalan pemangkasan.

Kotlin

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

Java

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

Hal ini mempercepat ekspor dengan melakukan decoding dan encoding ulang sesedikit mungkin video, lalu menggabungkan data yang dienkode ulang dengan bagian video asli lainnya. Pengoptimalan bergantung pada kemampuan untuk menggabungkan bagian file input dengan output yang baru dienkode, yang berarti format output encoder dan format input harus kompatibel. Jadi, misalnya, jika file awalnya diproduksi di perangkat dengan implementasi encoder yang berbeda, kemungkinan besar pengoptimalan tidak dapat diterapkan. Agar pengoptimalan berhasil, encoder yang disediakan ke Transformer melalui EncoderFactory harus memiliki level dan profil yang kompatibel dengan format input.

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

Kami sedang memvalidasi fungsi ini dan berharap fungsi ini tidak lagi bersifat eksperimental dalam rilis mendatang.

Pengeditan video

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

Anda dapat mengubah skala media, yang dapat berguna untuk menghemat resource pemrosesan atau bandwidth saat menangani input resolusi sangat tinggi, seperti video 4k atau 8k. Misalnya, untuk mengubah skala secara proporsional menjadi 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 mengubah skala dengan faktor tertentu, misalnya, untuk mengurangi ukuran menjadi setengahnya:

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 yang akan 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 berturut-turut, yang meningkatkan efisiensi dan kualitas.

Efek video juga didukung untuk pratinjau di ExoPlayer, menggunakan ExoPlayer.setVideoEffects. Untuk contoh cara menggunakan API ini, lihat aplikasi demo efek.

Aplikasi demo mencakup contoh efek video kustom.

Input gambar

Transformer mendukung input gambar dengan memperlakukannya sebagai klip video statis. Untuk mengonfigurasi gambar sebagai sumber input, ikuti langkah-langkah berikut:

  • Buat MediaItem menggunakan MediaItem.Builder. Tentukan durasi tampilan gambar dalam video output dengan memanggil setImageDurationMs.

  • Buat EditedMediaItem yang menggabungkan MediaItem. Tentukan kecepatan frame target untuk aliran video yang dihasilkan menggunakan EditedMediaItem.Builder#setFrameRate.

Contoh berikut menunjukkan cara mengonfigurasi input gambar untuk menghasilkan video 5 detik dengan kecepatan 30 frame per detik:

Kotlin

val imageMediaItem =
  MediaItem.Builder()
    .setUri(imageUri)
    .setImageDurationMs(5000) // 5 seconds
    .build()

val editedImageItem =
  EditedMediaItem.Builder(imageMediaItem)
    .setFrameRate(30) // 30 frames per second
    .build()

Java

MediaItem imageMediaItem =
    new MediaItem.Builder()
        .setUri(imageUri)
        .setImageDurationMs(5000) // 5 seconds
        .build();
new EditedMediaItem.Builder(imageMediaItem)
    .setFrameRate(30) // 30 frames per second
    .build();

Pengeditan audio

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