Mulai menggunakan Transformer
terdiri dari langkah-langkah berikut:
- Tambahkan Transformer Media3 sebagai dependensi dalam project Anda.
- Membangun
EditedMediaItem
yang mewakili media yang akan diproses dan diedit menerapkannya. - Buat
Transformer
, yang menjelaskan output yang diperlukan dan pemroses untuk peristiwa penyelesaian dan error. - Mulai operasi ekspor, dengan meneruskan
EditedMediaItem
yang akan diedit dan . Selama ekspor, Anda dapat mengkueri progres saat ini atau membatalkan operasi. - Saat ekspor selesai, tangani output sesuai kebutuhan. Sebagai contoh, Anda dapat membagikan {i>outputnya<i} ke aplikasi lain atau mengunggahnya ke server.
Baca terus untuk mengetahui detail selengkapnya tentang langkah-langkah ini, dan lihat TransformerActivity
di
demo transformer
aplikasi untuk
contoh lengkap.
Menambahkan Transformator Media3 sebagai dependensi
Cara termudah untuk mulai menggunakan Transformer adalah dengan menambahkan dependensi gradle
pada library dalam file build.gradle
modul aplikasi Anda:
Kotlin
implementation("androidx.media3:media3-transformer:1.4.1") implementation("androidx.media3:media3-effect:1.4.1") implementation("androidx.media3:media3-common:1.4.1")
Groovy
implementation "androidx.media3:media3-transformer:1.4.1" implementation "androidx.media3:media3-effect:1.4.1" implementation "androidx.media3:media3-common:1.4.1"
dengan 1.4.1 adalah versi pilihan Anda. Versi terbaru dapat berupa yang ditemukan dengan membaca catatan.
Informasi selengkapnya tentang modul library yang tersedia dapat ditemukan di Android Maven AndroidX Media3 halaman kami.
Mengaktifkan dukungan Java 8
Jika belum diaktifkan, Anda perlu mengaktifkan dukungan Java 8 di semua file build.gradle
yang bergantung pada Transformer dengan menambahkan kode berikut ke bagian
android
:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Memulai transformasi
Berikut contoh pembuatan EditedMediaItem
untuk menghapus audio untuk input
lalu membuat dan mengonfigurasi instance Transformer
untuk mengekspor
Video H.265/HEVC, yang menampilkan hasil 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 informasi selengkapnya tentang item media, lihat halaman item media ExoPlayer. Input dapat berupa streaming progresif atau adaptif, tetapi output selalu berupa streaming progresif. Untuk input adaptif, trek dengan resolusi tertinggi selalu dipilih untuk transformasi. Input dapat dalam format container apa pun yang didukung oleh ExoPlayer, tetapi {i>outputnya<i} akan selalu berupa file MP4.
Anda dapat menjalankan beberapa operasi ekspor secara berurutan pada
Transformer
, tetapi ekspor serentak dengan instance yang sama tidak
didukung.
Catatan tentang threading
Instance transformer harus diakses dari satu thread aplikasi, dan metode pemroses dipanggil pada thread yang sama. Untuk sebagian besar kasus, thread aplikasi hanya dapat berupa thread utama aplikasi. Secara internal, Transformer melakukan tugasnya di latar belakang dan memposting panggilannya ke pemroses metode pada thread aplikasi.
Memproses peristiwa
Metode start
bersifat asinkron. Fungsi ini 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
menyertakan informasi tentang file output, termasuk ukuran file
dan kecepatan bit rata-rata untuk audio dan video, sebagaimana berlaku.
Mendapatkan pembaruan 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 diberikan
akan diperbarui dengan persentase progres saat ini. Contoh berikut menunjukkan cara
secara berkala mengkueri kemajuan transformasi, di mana
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
. Sumber daya seperti codec video
perangkat keras terbatas,
terutama pada perangkat kelas bawah, jadi
hal ini penting dilakukan untuk mengurangi
resource jika output tidak diperlukan.