Dönüşümler

Biçimler arasında kod dönüştürme

Transformer'ı geliştirirken ü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ışı olacak ş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ş medyası biçimi, ses veya video yapılandırmalarıyla zaten eşleşiyorsa Transformer, otomatik olarak transmuxing yöntemine geçer. Yani, sıkıştırılmış örnekleri giriş kapsayıcıdan çıkış kapsayıcısına herhangi bir değişiklik yapmadan kopyalar. Böylece hem işlem maliyeti hem de kod çözme ve aynı biçimde yeniden kodlamada olası kalite kaybı önlenir.

Sesi veya videoyu kaldırma

EditedMediaItem.Builder ile ses veya videoyu kaldırın. Ö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 medyaları kaldırabilirsiniz. Örneğin, yalnızca 10 ile 20 saniye arasında 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();

Kırpma işlemlerini optimize etme

Videonun başlangıcını kırpmadaki gecikmeyi azaltmak için kırpma optimizasyonunu etkinleştirin.

Kotlin

Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build()

Java

new Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build();

Bu, videonun mümkün olduğunca küçük bir kısmını çözerek ve yeniden kodlayarak dışa aktarma işlemini hızlandırır. Ardından, yeniden kodlanmış verileri orijinal videonun geri kalanıyla birleştirir. Optimizasyon, giriş dosyasının bir kısmını yeni kodlanmış çıkışla birleştirilmeye dayanır. Bu, kodlayıcının çıkış biçiminin ve giriş biçiminin uyumlu olması gerektiği anlamına gelir. Örneğin, dosya orijinal olarak farklı bir kodlayıcı uygulamasının kullanıldığı bir cihazda oluşturulmuşsa, optimizasyonun uygulanması mümkün olmayabilir. Optimizasyonun başarılı olması için, EncoderFactory aracılığıyla Transformer'a sağlanan kodlayıcının, giriş biçimiyle uyumlu bir seviyeye ve profile sahip olması gerekir.

Bu optimizasyon, işlem video efektleri ve 90 dereceye bölünebilen dönüşler hariç hiçbir efekti olmayan tek öğeli MP4 girişiyle çalışır. Optimizasyon başarısız olursa Transformer, otomatik olarak normal dışa aktarma işlemine geri döner ve optimizasyonun sonucunu ExportResult.OptimizationResult aracında bildirir.

Bu işlevi doğruluyoruz ve daha sonraki bir sürümde deneysel olmayan bir işleve sahip olmasını bekliyoruz.

Video düzenlemeleri

EditedMediaItems, sırayla uygulanacak ses işlemcilerinin ve video efektlerinin listelerine sahiptir. Kitaplıkta, yaygın kullanım alanları için video efekti uygulamaları bulunur veya özel efektler yazıp düzenlenmiş medya öğeleri oluştururken bunları iletebilirsiniz.

Medyayı yeniden ölçeklendirebilirsiniz. Bu, 4K veya 8K video gibi çok yüksek çözünürlüklü girişlerle çalışırken işlem kaynaklarından veya bant genişliğinden tasarruf etmek için yararlı olabilir. Örneğin, 480 piksel yüksekliğe 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 inebilirsiniz:

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şturucu, uygulanacak ses ve video efektleri listesini kabul eder. Dahili olarak Transformer'ın efekt çerçevesi, video efektleri listesini sırayla uygulanan bir GL gölgelendirici programı dizisine dönüştürür. Efektler çerçevesi bazı durumlarda tek bir gölgelendirici programıyla birden fazla efekt uygulayabilir. Örneğin, bir gölgelendirici programı birden fazla ardışık matris dönüşümü uygulayabilir, bu da verimliliği ve kaliteyi artırır.

Video efektleri, ExoPlayer.setVideoEffects kullanılarak ExoPlayer'da önizleme için de desteklenir.

Demo uygulaması, özel video efekti örnekleri içerir.

Ses düzenlemeleri

Ses efektleri, ham (PCM) sese bir AudioProcessor örnek dizisi uygulanarak uygulanır. ExoPlayer, ses işlemcilerinin DefaultAudioSink.Builder içine geçirilmesini destekler ve ses düzenlemelerinin önizlenmesine olanak tanır.