Melakukan transcoding antar-format
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 cocok dengan konfigurasi untuk audio atau video, Transformer otomatis beralih ke transmuxing, yaitu menyalin sampel yang dikompresi dari container input ke container output tanpa modifikasi. Hal ini menghindari biaya komputasi dan potensi hilangnya kualitas akibat 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();
Pangkas klip
Anda dapat menghapus media apa pun di luar stempel waktu awal dan akhir yang ditentukan dengan menyetel konfigurasi klip 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 pemangkasan di awal video, aktifkan 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 video sesedikit mungkin, lalu menggabungkan data yang dienkode ulang dengan sisa video
asli. Pengoptimalan bergantung pada kemampuan 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
pengoptimalan tidak akan 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
tanpa efek dan rotasi video op yang dapat dibagi 90 derajat. Jika pengoptimalan gagal, Transformer otomatis akan kembali ke ekspor normal, dan melaporkan hasil pengoptimalan di ExportResult.OptimizationResult
.
Kami akan memvalidasi fungsi ini dan berharap fungsi tersebut tidak bersifat eksperimental pada rilis selanjutnya.
Pengeditan video
EditedMediaItems
memiliki daftar prosesor 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 telah 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 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 transformasi matriks
berurutan, 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 diterapkan dengan menerapkan urutan instance AudioProcessor
ke audio mentah (PCM). ExoPlayer mendukung penerusan prosesor audio ke
DefaultAudioSink.Builder
, yang memungkinkan pratinjau pengeditan audio.