Biçimler arasında kod dönüştürme
Transformer'ı oluştururken üretmek istediğiniz çıkış ses ve video biçimlerini belirtebilirsiniz. Örneğin, aşağıdaki kodda Transformer'ın H.264/AVC video ve AAC ses çıkışı verecek şekilde nasıl yapılandırılacağı gösterilmektedir:
Kotlin
Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build()
Java
new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build();
Giriş medya biçimi, ses veya video yapılandırmalarıyla eşleşiyorsa Transformer otomatik olarak transmukslama işlemine geçer. Bu işlem, sıkıştırılmış örnekleri giriş kapsayıcısından çıkış kapsayıcısına değiştirmeden kopyalama işlemidir. Bu sayede, aynı biçimde kod çözme ve yeniden kodlamanın hesaplama maliyeti ve olası kalite kaybı önlenir.
Ses veya videoyu kaldırma
EditedMediaItem.Builder
kullanarak ses veya video kaldırma (örneğin):
Kotlin
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
Java
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
Klip kırpma
Giriş medya öğesinde kırpma yapılandırmasını ayarlayarak belirtilen başlangıç ve bitiş zaman damgaları dışındaki tüm medyaları kaldırabilirsiniz. Örneğin, yalnızca 10 saniye ile 20 saniye arasındaki medyayı içeren bir klip oluşturmak için:
Kotlin
val inputMediaItem = MediaItem.Builder() .setUri(uri) .setClippingConfiguration( ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build()
Java
MediaItem inputMediaItem = new MediaItem.Builder() .setUri(uri) .setClippingConfiguration( new MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build();
MP4 düzenleme listeleri
Transformer, daha hızlı kırpma için MP4 düzenleme listelerini destekler. Bu sayede, videonun tamamını yeniden kodlamadan daha verimli "yalnızca kırpma" işlemleri yapılabilir. Bu yöntemde, mevcut kodlanmış örnekler ve düzenleme listesindeki bir "ön rulo" kullanılır. Bu, oynatıcıya oynatmayı belirli bir noktada başlatmasını söyler ve istenmeyen ilk segmenti etkili bir şekilde atlar.
Yalnızca kırpma işlemlerini önemli ölçüde hızlandırmak için experimentalSetMp4EditListTrimEnabled(true)
işlevini çağırın.
Kotlin
Transformer.Builder(context) .experimentalSetMp4EditListTrimEnabled(true) .build()
Java
new Transformer.Builder(context) .experimentalSetMp4EditListTrimEnabled(true) .build();
Tüm medya oynatıcıların "videodan önce gösterilen reklam" konumunu desteklemediğini unutmayın. Bu nedenle, böyle bir oynatıcı kullanıldığında dosya, farklı bir başlangıç noktası belirtebilecek herhangi bir düzenleme listesi bilgisinden bağımsız olarak, kodlanmış örneğin en başından itibaren oynatılmaya başlar.
Kırpma işlemlerini optimize etme
Bir videonun başlangıcını kırpma gecikmesini azaltmak için kırpma optimizasyonunu etkinleştirin.
Kotlin
Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build()
Java
new Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build();
Bu işlem, videonun mümkün olduğunca az bir kısmını kod çözüp yeniden kodlayarak ve ardından yeniden kodlanan verileri orijinal videonun geri kalanıyla birleştirerek dışa aktarma işlemini hızlandırır. Optimizasyon, giriş dosyasının bir bölümünü yeni kodlanmış çıkışla birleştirebilmeye dayanır. Bu nedenle, kodlayıcının çıkış biçimi ile giriş biçimi uyumlu olmalıdır. Dolayısıyla, örneğin, dosya başlangıçta farklı bir kodlayıcı uygulamasına sahip bir cihazda üretildiyse optimizasyonun uygulanması muhtemelen mümkün olmayacaktır.
Optimizasyonun başarılı olması için EncoderFactory
aracılığıyla Transformer'a sağlanan kodlayıcının, giriş biçimiyle uyumlu bir düzeye ve profile sahip olması gerekir.
Bu optimizasyon yalnızca, video efektleri ve 90 dereceye bölünebilen döndürmeler hariç efekt içermeyen tek öğeli MP4 girişleriyle çalışır. Optimizasyon başarısız olursa Transformer otomatik olarak normal dışa aktarmaya geri döner ve optimizasyonun sonucunu ExportResult.OptimizationResult
içinde bildirir.
Bu işlevi doğruluyoruz ve daha sonraki bir sürümde deneysel olmaktan çıkmasını bekliyoruz.
Video düzenlemeleri
EditedMediaItems
Uygulanacak ses işlemcileri ve video efektlerinin listelerini sırayla içerir. Kitaplıkta, yaygın kullanım alanları için video efekti uygulamaları bulunur. Ayrıca, özel efektler yazabilir ve düzenlenmiş medya öğeleri oluştururken bunları iletebilirsiniz.
Medyanın yeniden ölçeklendirilmesi, 4K veya 8K video gibi çok yüksek çözünürlüklü girişlerle çalışırken işleme kaynaklarından veya bant genişliğinden tasarruf etmek için faydalı olabilir. Örneğin, yüksekliği 480 piksele orantılı olarak ölçeklendirmek için:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf(Presentation.createForHeight(480)) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480)))) .build();
Alternatif olarak, belirli bir faktöre göre ölçeklendirme yapabilirsiniz. Örneğin, boyutu yarıya indirmek için:
Kotlin
val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()))) .build();
Rotasyonu aynı şekilde yapılandırabilirsiniz:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder() .setRotationDegrees(90f) .build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build()))) .build();
Özel video efektleri
Effects
oluşturucusu, uygulanacak ses ve video efektlerinin listesini kabul eder.
Dönüştürücü'nün efekt çerçevesi, dahili olarak video efektleri listesini sırayla uygulanan bir GL gölgelendirici programları dizisine dönüştürür. Bazı durumlarda, efekt çerçevesi tek bir gölgelendirici programla birden fazla efekt uygulayabilir.
Örneğin, bir gölgelendirici programı, verimliliği ve kaliteyi artıran birden fazla ardışık matris dönüşümü uygulayabilir.
Video efektleri, ExoPlayer.setVideoEffects
kullanılarak ExoPlayer'da önizleme için de desteklenir. Bu API'nin nasıl kullanılacağına dair bir örnek için efekt demo uygulamasına göz atın.
Demo uygulamasında özel video efektleri örnekleri yer alır.
Ses düzenlemeleri
Ses efektleri, ham (PCM) sese bir dizi AudioProcessor
örnek uygulanarak gerçekleştirilir. ExoPlayer, ses düzenlemelerinin önizlemesine olanak tanıyan DefaultAudioSink.Builder
öğesine ses işlemcilerinin iletilmesini destekler.