Memulai Transformer terdiri dari langkah-langkah berikut:
- Tambahkan Media3 Transformer sebagai dependensi di project Anda.
- Buat
EditedMediaItemyang mewakili media yang akan diproses dan edit yang akan diterapkan padanya. - Buat
Transformer, yang menjelaskan output yang diperlukan dan pemroses untuk peristiwa penyelesaian dan error. - Mulai operasi ekspor, dengan meneruskan
EditedMediaItemuntuk diedit dan jalur output. Selama ekspor, Anda dapat membuat kueri progres saat ini atau membatalkan operasi. - Setelah ekspor selesai, tangani output sesuai kebutuhan. Misalnya, Anda dapat membagikan output ke aplikasi lain atau menguploadnya ke server.
Baca terus untuk mengetahui detail selengkapnya tentang langkah-langkah ini, dan lihat TransformerActivity di
aplikasi demo transformer untuk
contoh lengkap.
Menambahkan Media3 Transformer sebagai dependensi
Cara termudah untuk mulai menggunakan Transformer adalah dengan menambahkan dependensi gradle pada library di file build.gradle modul aplikasi Anda:
Kotlin
implementation("androidx.media3:media3-transformer:1.10.0")
implementation("androidx.media3:media3-effect:1.10.0")
implementation("androidx.media3:media3-common:1.10.0")
Groovy
implementation "androidx.media3:media3-transformer:1.10.0"
implementation "androidx.media3:media3-effect:1.10.0"
implementation "androidx.media3:media3-common:1.10.0"
dengan 1.10.0 adalah versi pilihan Anda. Versi terbaru dapat ditemukan dengan melihat catatan rilis.
Informasi selengkapnya tentang modul library yang tersedia dapat ditemukan di halaman Google Maven AndroidX Media3.
Mengaktifkan dukungan Java 8
Jika belum diaktifkan, Anda harus mengaktifkan dukungan Java 8 di semua file build.gradle yang bergantung pada Transformer dengan menambahkan hal berikut ke bagian android:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Memulai transformasi
Berikut adalah contoh pembuatan EditedMediaItem untuk menghapus audio untuk file input, lalu membuat dan mengonfigurasi instance Transformer untuk mengekspor video H.265/HEVC, yang menghasilkan output ke outputPath.
Kotlin
val inputMediaItem = MediaItem.fromUri("path_to_input_file") val editedMediaItem = EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build() val transformer = Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build() transformer.start(editedMediaItem, outputPath)
Java
MediaItem inputMediaItem = MediaItem.fromUri("path_to_input_file"); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build(); Transformer transformer = new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build(); transformer.start(editedMediaItem, outputPath);
Untuk mengetahui informasi selengkapnya tentang item media, lihat halaman item media ExoPlayer. Input dapat berupa aliran progresif atau adaptif, tetapi output selalu berupa aliran progresif. Untuk input adaptif, trek resolusi tertinggi selalu dipilih untuk transformasi. Input dapat berupa format penampung apa pun yang didukung oleh ExoPlayer, tetapi output selalu berupa file MP4.
Anda dapat menjalankan beberapa operasi ekspor secara berurutan pada instance Transformer yang sama, tetapi ekspor serentak dengan instance yang sama tidak didukung.
Catatan tentang threading
Instance Transformer harus diakses dari satu thread aplikasi, dan metode pemroses dipanggil di thread yang sama. Untuk sebagian besar kasus, thread aplikasi dapat berupa thread utama aplikasi. Secara internal, Transformer melakukan pekerjaannya di latar belakang dan memposting panggilannya ke metode pemroses di thread aplikasi.
Memproses peristiwa
Metode start bersifat asinkron. Metode ini akan segera ditampilkan dan aplikasi akan diberi tahu tentang peristiwa melalui pemroses yang diteruskan ke builder Transformer.
Kotlin
val transformerListener: Transformer.Listener = object : Transformer.Listener { override fun onCompleted(composition: Composition, result: ExportResult) { playOutput() } override fun onError( composition: Composition, result: ExportResult, exception: ExportException, ) { displayError(exception) } }
Java
Transformer.Listener transformerListener = new Transformer.Listener() { @Override public void onCompleted(Composition composition, ExportResult result) { playOutput(); } @Override public void onError( Composition composition, ExportResult result, ExportException exception) { displayError(exception); } };
ExportResult mencakup informasi tentang file output, termasuk ukuran file dan bitrate rata-rata untuk audio dan video, jika berlaku.
Mendapatkan info terbaru tentang progres
Panggil Transformer.getProgress untuk membuat kueri progres transformasi saat ini. Nilai yang ditampilkan menunjukkan status progres. Jika status progres adalah PROGRESS_STATE_AVAILABLE, ProgressHolder yang disediakan akan diperbarui dengan persentase progres saat ini. Contoh berikut menunjukkan cara membuat kueri progres transformasi secara berkala, dengan metode updateProgressInUi dapat diterapkan untuk memperbarui status progres.
Kotlin
transformer.start(inputMediaItem, outputPath) val progressHolder = ProgressHolder() mainHandler.post( object : Runnable { override fun run() { val progressState: @ProgressState Int = transformer.getProgress(progressHolder) updateProgressInUi(progressState, progressHolder) if (progressState != Transformer.PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */ this, /* delayMillis= */ 500) } } } )
Java
transformer.start(inputMediaItem, outputPath); ProgressHolder progressHolder = new ProgressHolder(); mainHandler.post( new Runnable() { @Override public void run() { @Transformer.ProgressState int progressState = transformer.getProgress(progressHolder); updateProgressInUi(progressState, progressHolder); if (progressState != PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */ this, /* delayMillis= */ 500); } } });
Membatalkan transformasi
Jika pengguna memilih untuk keluar dari alur ekspor, batalkan operasi ekspor dengan Transformer.cancel. Resource seperti codec video hardware terbatas, terutama pada perangkat kelas bawah, jadi penting untuk melakukannya guna mengosongkan resource jika output tidak diperlukan.