Başlarken

Transformer hizmetini kullanmaya başlamak için aşağıdaki adımlar bulunmaktadır:

  1. Media3 Transformer'ı projenize bağımlılık olarak ekleyin.
  2. İşlenecek medyayı ve buna uygulanacak düzenlemeleri temsil eden bir EditedMediaItem oluşturun.
  3. Gerekli çıkışı ve tamamlama ve hata etkinlikleri için bir işleyici tanımlayan bir Transformer oluşturun.
  4. Düzenlemek için 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 tamamlandığında, çıkışı gerektiği gibi kullanın. Örneğin, çıktıyı 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 dönüştürücü demo uygulamasında 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.3.1")
implementation("androidx.media3:media3-effect:1.3.1")
implementation("androidx.media3:media3-common:1.3.1")

Modern

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

burada 1.3.1 tercih ettiğiniz sürümdür. En yeni sürüme, sürüm notlarına bakarak ulaşabilirsiniz.

Kullanabileceğiniz kitaplık modülleri hakkında daha fazla bilgiyi Google Maven AndroidX Media3 sayfasında bulabilirsiniz.

Java 8 desteğini etkinleştirme

Etkinleştirilmemişse android bölümüne aşağıdaki kodu ekleyerek Transformer'a bağlı tüm build.gradle dosyalarında Java 8 desteğini etkinleştirmeniz gerekir:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Dönüşüm başlatma

Bir giriş dosyası için sesi kaldırmak üzere EditedMediaItem oluşturma, ardından H.265/HEVC videoyu dışa aktarmak üzere Transformer oluşturma ve yapılandırma, sonucun çıkışını outputPath yapma ile ilgili bir örneği burada bulabilirsiniz.

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 akış olabilir ancak çıktı her zaman progresif bir akıştır. Uyarlanabilir girişler söz konusu olduğunda, dönüşüm 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.

İleti dizisiyle ilgili bir not

Dönüştürücü örneklerine tek bir uygulama iş parçacığından erişilmelidir ve işleyici yöntemleri aynı iş parçacığında çağrılır. Çoğu durumda, uygulama iş parçacığı uygulamanın ana iş parçacığı olabilir. Transformer dahili olarak arka planda çalışır ve çağrılarını uygulama iş parçacığında dinleyici yöntemlerine yayınlar.

Etkinlikleri dinleme

start yöntemi eşzamansızdır. Hemen geri döner ve uygulama, Transformer oluşturucuya iletilen işleyici aracılığıyla etkinlikler konusunda 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, ses ve video için dosya boyutu ve ortalama bit hızları dahil olmak üzere çıkış dosyasıyla ilgili bilgileri içerir.

İlerlemeyle ilgili son bilgileri alın

Bir 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 durumunu düzenli olarak nasıl sorgulayacağınız gösterilmektedir. Bu durumda, ilerleme çubuğunun güncellenmesi 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ı tercih ederse dışa aktarma işlemini Transformer.cancel ile iptal edin. Donanım video codec'leri gibi kaynaklar, özellikle alt segment cihazlarda sınırlıdır. Bu nedenle, çıkışa ihtiyaç duyulmuyorsa kaynakları serbest bırakmak için bunu yapmak önemlidir.