Dönüşümler

Jetpack Media3 Transformer, Android'de medya öğelerinin düzenlenmesini, dönüştürülmesini ve dışa aktarılmasını sağlar. Bu sayfada, temel dönüşümlerin nasıl yapılandırılacağı açıklanmaktadır:

  • Kod dönüştürme ve yeniden çoklama: Ses ve video biçimlerini dönüştürün veya kapsayıcı örneği kopyalama (yeniden çoklama) yoluyla yeniden kodlamayı atlayın.
  • Parça kaldırma: Medyadaki ses veya video parçalarını kaldırın.
  • Kırpma ve optimizasyon: MP4 düzenleme listelerini ve kırpma optimizasyonunu kullanarak daha hızlı dışa aktarma seçenekleriyle medyayı zaman damgasına göre kırpın.
  • Video efektleri: Ölçeklendirme, döndürme veya özel OpenGL gölgelendirici efektleri uygulama. Bu efektler ExoPlayer'da da önizlenebilir.
  • Resim girişi: Statik resimleri özel süre ve kare hızlarına sahip video kliplere dönüştürün.
  • Ses işleme: Ham sesi değiştirmek için AudioProcessor örneklerini zincirleyin.

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'ı H.264/AVC video ve AAC ses çıkışı verecek şekilde nasıl yapılandıracağınız 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 zaten ses veya video yapılandırmalarıyla eşleşiyorsa Transformer otomatik olarak transmuksing'e (yani sıkıştırılmış örnekleri giriş kapsayıcısından çıkış kapsayıcısına değiştirmeden kopyalama) geçer. 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 simgesini 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(
      MediaItem.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

Daha hızlı kırpma için Transformer, MP4 düzenleme listelerini destekler. Bu sayede, videonun tamamını yeniden kodlamadan daha verimli "yalnızca kırpma" düzenlemeleri yapabilirsiniz. Bu yöntemde, mevcut kodlanmış örnekler ve düzenleme listesindeki bir "videodan önce gösterilen reklam" kullanılır. Bu videodan önce gösterilen reklam, oynatıcıya oynatmayı belirli bir noktada başlatmasını söyleyerek istenmeyen ilk segmenti etkili bir şekilde atlar.

Yalnızca kırpma işlemlerini çok daha hızlı yapmak için experimentalSetMp4EditListTrimEnabled(true) işlevini kullanın.

Kotlin

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

Java

new Transformer.Builder(context).experimentalSetMp4EditListTrimEnabled(true).build();
Tüm medya oynatıcıların "ön rulo" konumunu desteklemediğini unutmayın. Bu nedenle, böyle bir oynatıcı kullanıldığında dosya, farklı bir başlangıç noktası belirtebilecek düzenleme listesi bilgilerinden 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üzeyi ve profili olmalıdır.

Bu optimizasyon yalnızca, video efektleri ve 90 dereceye bölünebilen döndürmeler dışında 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 Sırayla uygulanacak ses işlemcilerinin ve video efektlerinin listelerini içeriyorsa. 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, özellikle 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 efektleriyle ilgili örnekler yer alır.

Resim girişi

Transformer, görüntü girişlerini statik video klipler olarak ele alarak destekler. Bir resmi giriş kaynağı olarak yapılandırmak için aşağıdaki adımları uygulayın:

  • MediaItem.Builder kullanarak MediaItem oluşturun. setImageDurationMs işlevini çağırarak çıkış videosundaki resmin görüntülenme süresini belirtin.

  • EditedMediaItem öğesini MediaItem ile sarmalayan bir yapı oluşturun. EditedMediaItem.Builder#setFrameRate kullanarak oluşturulan video akışının hedef kare hızını belirtin.

Aşağıdaki örnekte, saniyede 30 kare hızında 5 saniyelik bir video oluşturmak için görüntü girişinin nasıl yapılandırılacağı gösterilmektedir:

Kotlin

val imageMediaItem =
  MediaItem.Builder()
    .setUri(imageUri)
    .setImageDurationMs(5000) // 5 seconds
    .build()

val editedImageItem =
  EditedMediaItem.Builder(imageMediaItem)
    .setFrameRate(30) // 30 frames per second
    .build()

Java

MediaItem imageMediaItem =
    new MediaItem.Builder()
        .setUri(imageUri)
        .setImageDurationMs(5000) // 5 seconds
        .build();
new EditedMediaItem.Builder(imageMediaItem)
    .setFrameRate(30) // 30 frames per second
    .build();

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.