Başlangıç

Transformer'i kullanmaya başlamak için aşağıdaki adımları uygulayın:

  1. Media3 Transformer'ı projenize bağımlılık olarak ekleyin.
  2. İşlenecek medyayı ve uygulanacak düzenlemeleri temsil eden bir EditedMediaItem oluşturun.
  3. Gerekli çıkışı ve tamamlama ile hata etkinlikleri için bir işleyiciyi açıklayan bir Transformer oluşturun.
  4. Düzenlenecek EditedMediaItem ve bir çıkış yolu ileterek dışa aktarma işlemini başlatın. Dışa aktarma sırasında mevcut ilerleme durumunu sorgulayabilir veya işlemi iptal edebilirsiniz.
  5. Dışa aktarma işlemi tamamlandığında çıktıyı gerektiği gibi işleyin. Örneğin, çıkışı başka bir uygulamayla paylaşabilir veya bir sunucuya yükleyebilirsiniz.

Bu adımlar hakkında daha fazla bilgi edinmek için okumaya devam edin ve eksiksiz bir örnek için Transformer demo uygulamasındaki TransformerActivity bölümüne bakın.

Media3 Transformer'ı bağımlılık olarak ekleme

Transformer'ı kullanmaya başlamanın en kolay yolu, uygulama modülünüzün build.gradle dosyasındaki kitaplığa Gradle bağımlılıkları eklemektir:

Kotlin

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

Modern

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

Burada 1.11.1, tercih ettiğiniz sürümdür. En yeni sürümü sürüm notlarında bulabilirsiniz.

Kullanılabilir kitaplık modülleri hakkında daha fazla bilgiyi Google Maven AndroidX Media3 sayfasında bulabilirsiniz.

Java 8 desteğini etkinleştirme

Henüz etkinleştirilmediyse Transformer'a bağlı tüm build.gradle dosyalarında Java 8 desteğini etkinleştirmeniz gerekir. Bunun için android bölümüne aşağıdakileri ekleyin:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Dönüşüm başlatma

Aşağıda, bir giriş dosyasının sesini kaldırmak için EditedMediaItem oluşturma, ardından H.265/HEVC video dışa aktarmak için Transformer örneği oluşturup yapılandırma ve sonucu outputPath dosyasına aktarma örneği verilmiştir.

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);

Medya öğeleri hakkında daha fazla bilgi için ExoPlayer medya öğeleri sayfasına bakın. Giriş, progresif veya uyarlanabilir bir akış olabilir ancak çıkış her zaman progresif bir akıştır. Uyarlanabilir girişler için her zaman en yüksek çözünürlüklü parçalar seçilir. Giriş, ExoPlayer tarafından desteklenen herhangi bir kapsayıcı biçiminde olabilir ancak çıkış her zaman bir MP4 dosyasıdır.

Aynı Transformer örneğinde birden fazla dışa aktarma işlemini sırayla yürütebilirsiniz ancak aynı örnekle eşzamanlı dışa aktarma işlemleri desteklenmez.

Birden fazla girişi birleştirerek üretken yapay zeka aracı oluşturma hakkında bilgi edinmek için Çoklu öğe düzenleme başlıklı makaleyi inceleyin.

İleti dizileriyle ilgili bir not

Transformer örneklerine tek bir uygulama iş parçacığından erişilmeli ve dinleyici yöntemleri aynı iş parçacığında çağrılmalıdır. Çoğu durumda uygulama iş parçacığı, uygulamanın ana iş parçacığı olabilir. Dahili olarak, Transformer, işini arka planda yapar ve dinleyici yöntemlerine yönelik çağrılarını uygulama iş parçacığında yayınlar.

Etkinlikleri dinleme

start yöntemi eşzamansızdır. Hemen döndürülür ve uygulama, Transformer oluşturucuya iletilen işleyici aracılığıyla etkinlikler hakkında bilgilendirilir.

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, çıkış dosyasıyla ilgili bilgileri (ör. dosya boyutu ve ses ile video için ortalama bit hızları) içerir.

İlerleme güncellemelerini alma

Dönüşümün mevcut ilerleme durumunu sorgulamak için Transformer.getProgress yöntemini çağırın. Döndürülen değer, ilerleme durumunu gösterir. İlerleme durumu PROGRESS_STATE_AVAILABLE ise sağlanan ProgressHolder, mevcut ilerleme yüzdesiyle güncellenir. Aşağıdaki örnekte, bir dönüşümün ilerleme durumunun düzenli olarak nasıl sorgulanacağı gösterilmektedir. Burada, ilerleme çubuğunu güncellemek için updateProgressInUi yöntemi uygulanabilir.

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);
        }
      }
    });

Dönüşümü iptal etme

Kullanıcı dışa aktarma akışından çıkmayı seçerse Transformer.cancel ile dışa aktarma işlemini iptal edin. Donanım video codec'leri gibi kaynaklar, özellikle alt seviye cihazlarda sınırlıdır. Bu nedenle, çıkışa ihtiyaç duyulmuyorsa kaynakları serbest bırakmak için bu işlemi yapmak önemlidir.