Memulai

Memulai Transformer terdiri dari langkah-langkah berikut:

  1. Tambahkan Media3 Transformer sebagai dependensi dalam project Anda.
  2. Bangun EditedMediaItem yang mewakili media untuk diproses dan edit untuk diterapkan.
  3. Membuat Transformer, yang menjelaskan output yang diperlukan dan pemroses untuk penyelesaian dan peristiwa error.
  4. Mulai operasi ekspor, dengan meneruskan EditedMediaItem yang akan diedit dan jalur output. Selama ekspor, Anda dapat mengkueri progres saat ini atau membatalkan operasi.
  5. Setelah mengekspor 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 dalam aplikasi demo transformasi untuk contoh lengkap.

Menambahkan Transformer Media3 sebagai dependensi

Cara termudah untuk memulai menggunakan Transformer adalah dengan menambahkan dependensi gradle pada library dalam file build.gradle modul aplikasi Anda:

Kotlin

implementation("androidx.media3:media3-transformer:1.3.1")
implementation("androidx.media3:media3-effect:1.3.1")
implementation("androidx.media3:media3-common:1.3.1")

Groovy

implementation "androidx.media3:media3-transformer:1.3.1"
implementation "androidx.media3:media3-effect:1.3.1"
implementation "androidx.media3:media3-common:1.3.1"

di mana 1.3.1 adalah versi yang Anda sukai. Versi terbaru dapat ditemukan dengan membaca catatan rilis.

Informasi selengkapnya tentang modul library yang tersedia dapat ditemukan di halaman Media3 Google Maven AndroidX.

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 adalah contoh pembuatan EditedMediaItem untuk menghapus audio dari file input, lalu membuat dan mengonfigurasi instance Transformer untuk mengekspor video H.265/HEVC, yang menampilkan hasilnya 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 streaming progresif atau adaptif, tetapi output selalu berupa streaming progresif. Untuk input adaptif, jalur dengan resolusi tertinggi selalu dipilih untuk transformasi. Input dapat berupa format container apa pun yang didukung oleh ExoPlayer, tetapi output-nya 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 pada thread yang sama. Untuk sebagian besar kasus, thread aplikasi bisa 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 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.

Dapatkan info terbaru tentang progres

Panggil Transformer.getProgress untuk mengkueri progres transformasi saat ini. Nilai yang ditampilkan menunjukkan status progres. Jika status progres adalah PROGRESS_STATE_AVAILABLE, ProgressHolder yang disediakan akan diupdate dengan persentase progres saat ini. Contoh berikut menunjukkan cara mengkueri progres transformasi secara berkala, dengan metode updateProgressInUi dapat diimplementasikan 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 dilakukan untuk mengosongkan resource jika output tidak diperlukan.