Başlarken

Transformer ürününü kullanmaya başlamak için aşağıdaki adımlar gerekir:

  1. Projenize bağımlılık olarak Media3 Dönüştürücüsü ekleyin.
  2. İşlenecek medyayı ve düzenlemeleri temsil eden bir EditedMediaItem oluşturun işleyeceğiz.
  3. Gerekli çıkışı ve işleyiciyi açıklayan bir Transformer oluşturun tamamlanma ve hata olayları için kritik önem taşır.
  4. Dışa aktarma işlemini başlatın, düzenlemek için EditedMediaItem öğesini iletin ve çıkış yolunu izleyin. Dışa aktarma sırasında mevcut ilerleme durumunu sorgulayabilir veya işlemidir.
  5. Dışa aktarma işlemi tamamlandığında, çıkışı gereken şekilde işleyin. Örneğin, şunları yapabilirsiniz: çıkışı başka bir uygulamayla paylaşabilir veya bir sunucuya yükleyebilir.

Bu adımlarla ilgili daha ayrıntılı bilgi için okumaya devam edin ve TransformerActivity için dönüşüm demosu uygulamasını kullanarak tam bir örnek verelim.

Bağımlılık olarak Media3 Dönüştürücüsü ekleme

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

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

Eski

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

Buradaki 1.4.1 sürümü tercih ettiğiniz sürümdür. En son sürüm ise notlar ekleyin.

Mevcut kütüphane modülleri hakkında daha fazla bilgiyi şu adreste bulabilirsiniz: Google Maven AndroidX Media3 öğrenin.

Java 8 desteğini etkinleştirme

Henüz etkinleştirmediyseniz build.gradle için Java 8 desteğini etkinleştirmeniz gerekir. aşağıdakini android öğesine ekleyerek Transformer'a bağlı dosyaları bölüm:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Dönüşüm başlatma

Bir girişin sesini kaldırmak için EditedMediaItem oluşturma örneğini burada bulabilirsiniz dosyası oluşturup dışa aktarmak için bir Transformer örneği oluşturup H.265/HEVC videosu, çıktısı outputPath olur.

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 bkz. ExoPlayer medya öğeleri öğrenin. Giriş, progresif veya uyarlanabilir olabilir. Ancak çıkış her zaman progresif bir akıştır. Uyarlanabilir girişler için dönüştürme 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 çıktı her zaman MP4 dosyası olur.

Aynı veri tabanında ardışık olarak birden fazla dışa aktarma işlemi yürütebilirsiniz. Transformer örneği ancak aynı örnekle eşzamanlı dışa aktarma işlemleri desteklenir.

İleti dizisiyle ilgili 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. Dahili olarak, Transformer, işlerini arka planda yapar ve çağrılarını dinleyiciye iletir. yöntemlerine göz atacağız.

Etkinlikleri dinleme

start yöntemi eşzamansızdır. Hemen geri dönüyor ve uygulama Transformer oluşturucuya iletilen işleyici aracılığıyla etkinlikler hakkında bildirim alır.

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, dosya da dahil olmak üzere çıkış dosyasıyla ilgili bilgileri içerir ve ortalama bit hızlarını uygun şekilde değiştirmeniz gerekir.

İlerleme durumu güncellemeleri alın

Bir görevin mevcut ilerlemesini sorgulamak için Transformer.getProgress bahsedeceğim. Döndürülen değer ilerleme durumunu gösterir. İlerleme durumu PROGRESS_STATE_AVAILABLE ise sağlanan ProgressHolder değeri güncel ilerleme yüzdesiyle güncellenir. Aşağıdaki örnekte, dönüşümün ilerlemesini periyodik olarak sorgulayabilir. İlerleme ç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 dışa aktarma işlemini iptal edin. Transformer.cancel ile birlikte. Donanımla video codec'leri gibi kaynaklar sınırlıdır, özellikle de düşük kaliteli cihazlarda kullanılabilir. Bu yüzden, ihtiyaç duymuyorsunuz.