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 hilangnya kualitas
decoding dan encoding ulang dalam format yang sama.
## Menghapus audio atau video {: #remove-audio-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 {: #trim }
Anda dapat menghapus media apa pun di luar stempel waktu mulai dan akhir yang ditentukan dengan menyetel
konfigurasi pemangkasan 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 {: #mp4-edit-lists }
Untuk pemangkasan yang lebih cepat, Transformer mendukung daftar edit MP4, sehingga memungkinkan pengeditan "khusus pangkas" yang lebih efisien tanpa melakukan transkode ulang video secara penuh. Metode ini
menggunakan sampel yang sudah dienkode dan "pre-roll" dalam daftar pengeditan, 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();
Penting untuk diperhatikan bahwa tidak semua pemutar media mendukung posisi "pre-roll".
Artinya, saat pemutar tersebut digunakan, file akan mulai diputar dari
awal mutlak sampel yang dienkode, terlepas dari informasi daftar edit
yang mungkin menentukan titik awal yang berbeda.
Perhatian: Memangkas video sering kali menyiratkan penghapusan permanen bagian yang tidak diinginkan. Namun,
menggunakan daftar edit menimbulkan risiko privasi: pengguna mungkin tanpa sadar membagikan
informasi sensitif yang "dihapus" yang "disembunyikan" oleh posisi "pra-putar".
## Mengoptimalkan pangkasan {: #trim-optimization }
Untuk mengurangi latensi pemangkasan awal video, aktifkan pengoptimalan
pangkasan.
Kotlin
Transformer.Builder(context)
.experimentalSetTrimOptimizationEnabled(true)
.build()
Java
new Transformer.Builder(context)
.experimentalSetTrimOptimizationEnabled(true)
.build();
Hal ini mempercepat ekspor dengan mendekode dan mengenkode ulang sesedikit mungkin video, lalu menggabungkan data yang dienkode ulang dengan video asli lainnya. Pengoptimalan bergantung pada kemampuan untuk menggabungkan bagian file input dengan output yang baru dienkode, yang berarti bahwa format output encoder dan format input harus kompatibel. Jadi, misalnya, jika file awalnya
dibuat di perangkat dengan penerapan encoder yang berbeda, kemungkinan
pengoptimalan tidak dapat diterapkan.
Agar pengoptimalan berhasil, encoder yang diberikan 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 akan menjadi non-eksperimental dalam rilis mendatang.
## Pengeditan video {: #video-edits }
`EditedMediaItems` memiliki daftar pemroses audio dan efek video yang akan diterapkan secara
berurutan. Library ini mencakup penerapan 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 beresolusi 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 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 {: #custom-video }
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][effect-demo-app].
[Aplikasi demo](demo-application) mencakup contoh efek video kustom.
## Input gambar {: #image-input }
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 membungkus `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 pada 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();
EditedMediaItem editedImageItem = 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.