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 düzenlemeleri temsil eden bir
EditedMediaItem
oluşturun işleyeceğiz. - Gerekli çıkışı ve tamamlama ve hata etkinlikleri için bir dinleyiciyi açıklayan bir
Transformer
oluşturun. - Dışa aktarma işlemini başlatın, düzenlemek için
EditedMediaItem
öğesini iletin ve çıkış yolunu izleyin. Dışa aktarma işlemi 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, şunları yapabilirsiniz: çıkışı başka bir uygulamayla paylaşabilir veya sunucuya yükleyebilir.
Bu adımlar hakkında daha fazla bilgi için okumaya devam edin ve tam bir örnek için dönüştürücü 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.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"
Burada 1.4.1, tercih ettiğiniz sürümdür. En son sürümü sürüm notlarına bakarak bulabilirsiniz.
Kullanılabilir 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
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, sonucu outputPath
konumuna getirir.
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 bir akış 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 sonuç 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.
Konu dizileriyle 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. 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ö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 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
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ı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.