Transformer
ürününü kullanmaya başlamak için aşağıdaki adımlar gerekir:
- Projenize bağımlılık olarak Media3 Dönüştürücüsü ekleyin.
- İşlenecek medyayı ve bu medyaya uygulanacak düzenlemeleri temsil eden bir
EditedMediaItem
oluşturun. - Gerekli çıktıyı ve tamamlanma ile hata olayları için bir işleyici açıklayan bir
Transformer
oluşturun. - Düzenlemek için
EditedMediaItem
ve bir çıkış yolunu ileterek dışa aktarma işlemini başlatın. Dışa aktarma sırasında mevcut ilerlemeyi sorgulayabilir veya işlemi iptal edebilirsiniz. - Dışa aktarma işlemi tamamlandığında, çıkışı gereken şekilde işleyin. Örneğin, çıkışı 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ındaki kitaplığa gradle bağımlıları 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")
Eski
implementation "androidx.media3:media3-transformer:1.3.1" implementation "androidx.media3:media3-effect:1.3.1" implementation "androidx.media3:media3-common:1.3.1"
Buradaki 1.3.1, 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
Etkinleştirilmemişse Transformer'a dayalı tüm build.gradle
dosyaları için Java 8 desteğini etkinleştirmeniz gerekir. Bunun için aşağıdaki kodu android
bölümüne eklemeniz gerekir:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Dönüşüm başlatma
Bir giriş dosyasından sesi kaldırmak için EditedMediaItem
oluşturup H.265/HEVC videosunu dışa aktarmak üzere Transformer
örneği oluşturup sonucu outputPath
olarak veren 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 çıkış her zaman progresif (progresif) akış olur. Uyarlanabilir girişler için 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 MP4 dosyası olur.
Aynı Transformer
örneği üzerinde sırayla birden çok dışa aktarma işlemi yürütebilirsiniz ancak aynı örnekle eşzamanlı dışa aktarma işlemleri desteklenmez.
İ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ığı yalnızca uygulamanın ana iş parçacığı olabilir. Transformer, dahili olarak işlerini arka planda gerçekleştirir 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 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
, ses ve video için dosya boyutu ve ortalama bit hızları (hangisi geçerliyse) dahil olmak üzere çıkış dosyasıyla ilgili bilgileri içerir.
İlerleme durumu güncellemeleri alın
Bir dönüşümün mevcut ilerleme durumunu sorgulamak için Transformer.getProgress
çağrısı yapı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 sorgulanacağı gösterilmektedir. Bu durumda 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 dışa aktarma işlemini Transformer.cancel
ile iptal edin. Özellikle alt segment cihazlarda donanımsal video codec'leri gibi kaynaklar sınırlıdır. Dolayısıyla, çıkış gerekli değilse kaynakları boşa çıkarmak için bunu yapmanız önemlidir.