Transformer
ile çalışmaya başlamak için aşağıdaki adımları uygulayın:
- Projenize bağımlılık olarak Media3 Transformer'ı ekleyin.
- İşlenecek medyayı ve uygulanacak düzenlemeleri temsil eden bir
EditedMediaItem
oluşturun. - Gerekli çıkışı ve tamamlanma ile hata etkinlikleri için bir dinleyiciyi açıklayan bir
Transformer
oluşturun. - 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. - Dışa aktarma işlemi tamamlandığında çıktıyı gerektiği ş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 bilgi edinmek için okumaya devam edin. Tam 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ında kitaplığa Gradle bağımlılıkları eklemektir:
Kotlin
implementation("androidx.media3:media3-transformer:1.7.1") implementation("androidx.media3:media3-effect:1.7.1") implementation("androidx.media3:media3-common:1.7.1")
Groovy
implementation "androidx.media3:media3-transformer:1.7.1" implementation "androidx.media3:media3-effect:1.7.1" implementation "androidx.media3:media3-common:1.7.1"
Burada 1.7.1, tercih ettiğiniz sürümdür. En son sürümü sürüm notlarına bakarak bulabilirsiniz.
Kullanılabilen 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
dosyalarda Java 8 desteğini etkinleştirmeniz gerekir. Bunu yapmak 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, giriş dosyasındaki sesi 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
olarak verme ö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ını inceleyin. Giriş, progresif veya uyarlanabilir bir akış olabilir ancak çıkış her zaman progresif bir akıştır. Uyarlanabilir girişlerde, 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 çı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.
İş parçacığı oluşturma hakkında 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 ileti dizisi yalnızca uygulamanın ana ileti dizisi 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 uygulamaya, Transformer
oluşturucuya iletilen dinleyici aracılığıyla etkinlikler hakkında bildirim gönderilir.
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 boyutu ve ses ile video için geçerli olan ortalama bit hızları da dahil olmak üzere çıkış dosyasıyla ilgili bilgileri içerir.
İlerleme durumu güncellemelerini 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 ilerleme durumunun nasıl düzenli olarak 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ı bir dışa aktarma akışından çıkmayı seçerse dışa aktarma işlemini Transformer.cancel
ile iptal edin. Donanım video codec'leri gibi kaynaklar, özellikle düşük seviyeli cihazlarda sınırlıdır. Bu nedenle, çıkışa ihtiyaç duyulmuyorsa kaynakları boşaltmak için bu işlemi yapmanız önemlidir.