Transformer
'ü kullanmaya başlamak için aşağıdaki adımları uygulayın:
- Projenize Media3 Transformer'ı bağımlılık olarak ekleyin.
- İşlenecek medyayı ve bu medyaya uygulanacak düzenlemeleri temsil eden bir
EditedMediaItem
oluşturun. - Gerekli çıkışı ve tamamlama ve hata etkinlikleri için bir dinleyiciyi açıklayan bir
Transformer
oluşturun. - Düzenlenecek
EditedMediaItem
dosyasını ve bir çıkış yolunu göndererek dışa aktarma işlemini başlatın. Dışa aktarma işlemi sırasında mevcut ilerleme durumunu sorgulayabilir veya işlemi iptal edebilirsiniz. - Dışa aktarma işlemi tamamlandığında, çıkışı gereken şekilde işleyin. Örneğin, çıktıyı başka bir uygulamayla paylaşabilir veya bir sunucuya yükleyebilirsiniz.
Bu adımlar hakkında daha fazla ayrıntı için okumaya devam edin. Eksiksiz bir örnek için dönüşüm demo uygulamasında TransformerActivity
bölümüne bakın.
Bağımlılık olarak Media3 Dönüştürücüsü ekleme
Transformer'ı kullanmaya başlamanın en kolay yolu, uygulama modülünüzün build.gradle
dosyasında kitaplığa Gradle bağımlılıkları eklemektir:
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"
Buradaki 1.4.1 sürümü tercih ettiğiniz sürümdür. Sürüm notlarına bakarak güncel sürüme ulaşabilirsiniz.
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 android
bölümüne aşağıdakileri ekleyerek build.gradle
dosyalarında Transformer'a dayalı tüm Java 8 desteğini etkinleştirmeniz gerekir:
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 videoyu dışa aktarmak için Transformer
örneği oluşturma ve yapılandırarak sonucu outputPath
'ye 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 akış olabilir ancak çıkış her zaman progresif (progresif) akış olur. Uyarlanabilir girişler için dönüşüm işleminde 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 MP4 dosyası olur.
Aynı Transformer
örneğinde art arda birden fazla dışa aktarma işlemi yürütebilirsiniz ancak aynı örnekte eşzamanlı dışa aktarma işlemleri desteklenmez.
İleti dizisiyle ilgili not
Dönüştürücü örneklerine tek bir uygulama iş parçacığında erişilmelidir ve dinleyici yöntemleri aynı iş parçacığında çağrılır. Çoğu durumda, uygulama iş parçacığı yalnızca uygulamanın ana iş parçacığı olabilir. Transformer, dahili olarak arka planda çalışır ve çağrılarını uygulama iş parçacığındaki dinleyici yöntemlerine gönderir.
Etkinlikleri dinleme
start
yöntemi eşzamansızdır. Hemen geri döner ve Transformer
oluşturucuya iletilen işleyici aracılığıyla uygulamaya etkinlikler bildirilir.
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
, geçerli olduğunda ses ve video için dosya boyutu ve ortalama bit hızları da dahil olmak üzere çıkış dosyası hakkındaki bilgileri içerir.
İlerleme güncellemeleri alma
Dönüşümün mevcut ilerleme durumunu sorgulamak için Transformer.getProgress
numaralı telefonu arayı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 ilerlemesinin düzenli olarak nasıl sorgulandığı gösterilmektedir. Bu örnekte, 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ışında geri çıkmayı seçerse Transformer.cancel
ile dışa aktarma işlemini iptal edin. Donanım video codec'leri gibi kaynaklar özellikle düşük kaliteli cihazlarda sınırlıdır. Bu nedenle, çıkışa ihtiyaç duyulmadığında kaynakları boşaltmak için bu işlemi yapmanız önemlidir.