Memulai

Mulai menggunakan Transformer terdiri dari langkah-langkah berikut:

  1. Tambahkan Transformer Media3 sebagai dependensi dalam project Anda.
  2. Membangun EditedMediaItem yang mewakili media yang akan diproses dan diedit menerapkannya.
  3. Membuat Transformer, yang menjelaskan output yang diperlukan dan pemroses untuk penyelesaian dan peristiwa {i>error<i}.
  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. 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 yang lengkap.

Menambahkan Transformator Media3 sebagai dependensi

Cara termudah untuk mulai menggunakan Transformer adalah dengan menambahkan dependensi gradle di 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.

Mengaktifkan dukungan Java 8

Jika belum diaktifkan, Anda harus mengaktifkan dukungan Java 8 di semua build.gradle file yang bergantung pada Transformer dengan menambahkan kode berikut ke android :

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Memulai transformasi

Berikut adalah 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 item media ExoPlayer halaman. Input bisa berupa input progresif atau adaptif {i>stream<i}, tetapi {i>outputnya<i} akan selalu berupa aliran progresif. Untuk input adaptif, jalur dengan resolusi tertinggi selalu dipilih untuk proses 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. Dalam sebagian besar kasus, thread aplikasi 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 asinkron. Aplikasi akan segera ditampilkan dan notifikasi 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 file dan kecepatan bit rata-rata untuk audio dan video, sebagaimana berlaku.

Dapatkan info terbaru tentang progres

Panggil Transformer.getProgress untuk mengkueri progres saat ini transformasi. Nilai yang ditampilkan menunjukkan status progres. Jika kemajuan status adalah PROGRESS_STATE_AVAILABLE, maka ProgressHolder yang disediakan adalah 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.