Ürün Haberleri

Media3 1.9.0 - Yenilikler

Okuma süresi: 6 dk.
Kristina Simakova adlı kullanıcının profilini görüntüle
Kristina Simakova Mühendislik Müdürü

Media3 1.9.0 çıktı. En son sürümde, her zamanki hata düzeltmeleri ve performans iyileştirmelerinin yanı sıra dört yeni veya büyük ölçüde yeniden yazılmış modül de yer alıyor:

  • media3-inspector - Oynatma dışında meta verileri ve kareleri ayıklama
  • media3-ui-compose-material3 - Birkaç adımda temel bir Material3 Compose Media kullanıcı arayüzü oluşturma
  • media3-cast - Yayınlama ve yerel oynatma arasındaki geçişleri otomatik olarak yönetme
  • media3-decoder-av1 - Dav1d kitaplığını temel alan yeniden yazılmış uzantı kod çözücü ile tutarlı AV1 oynatma

Ayrıca PreloadManager için önbelleğe alma ve bellek yönetimi iyileştirmeleri ekledik ve çeşitli yeni ExoPlayer, Transformer ve MediaSession basitleştirmeleri sunduk. 

Bu sürümde, medya düzenlemelerini önizlemek için CompositionPlayer özelliğine ilk deneysel erişim de sunulur.  


Daha fazla bilgi edinmek için okumaya devam edin. Bu sürümdeki değişikliklere kapsamlı bir genel bakış için her zaman olduğu gibi sürüm notlarının tamamını inceleyebilirsiniz.

Oynatma dışında meta verileri ve kareleri ayıklama

Oynatmayı başlatmadan medyayı incelemek istediğiniz birçok durum vardır. Örneğin, videonun hangi biçimleri içerdiğini veya süresini tespit etmek ya da küçük resimleri almak isteyebilirsiniz.

Yeni media3-inspector modülü, medyayı oynatmadan incelemeye yarayan tüm yardımcı programları tek bir yerde birleştirir:

  • MetadataRetriever, MediaItem öğesinden süre, biçim ve statik meta verileri okumak için kullanılır.
  • Bir öğeden kare veya küçük resim almak için FrameExtractor.
  • Dosyadaki örnekler hakkında ayrıntılı bilgi edinmek için Android platformu MediaExtractor sınıfının doğrudan yerine geçen MediaExtractorCompat.

MetadataRetriever ve FrameExtractor, basit bir AutoCloseable kalıbını takip eder. Daha fazla bilgi için yeni rehber sayfalarımıza göz atın.

suspend fun extractThumbnail(mediaItem: MediaItem) {

  FrameExtractor.Builder(context, mediaItem).build().use {

    val thumbnail = frameExtractor.getThumbnail().await()

  } 

}

Yalnızca birkaç adımda temel bir Material3 Compose Media kullanıcı arayüzü oluşturma

Önceki sürümlerde, Compose kullanıcı arayüzü öğeleri ile Player örneğiniz arasında bağlayıcı kod sağlamaya başladık. Media3 1.9.0 ile, tamamen stillendirilmiş Material3 düğmeleri ve içerik öğeleri içeren yeni bir modül olan media3-ui-compose-material3'ü ekledik. Stili özelleştirmek için gereken tüm esnekliği sağlarken yalnızca birkaç adımda medya kullanıcı arayüzü oluşturmanıza olanak tanır. Kendi kullanıcı arayüzü stilinizi oluşturmayı tercih ederseniz tüm güncelleme ve bağlantı mantığını yöneten yapı taşlarını kullanabilirsiniz. Böylece yalnızca kullanıcı arayüzü öğesini tasarlamaya odaklanmanız gerekir. Compose kullanıcı arayüzü modülleri için lütfen kapsamlı kılavuz sayfalarımıza göz atın.

Ayrıca, önceden oluşturulmuş bir arama çubuğu, PlayerView için eksiksiz bir hazır alternatif, altyazı ve reklam entegrasyonu gibi daha fazla Compose bileşeni üzerinde çalışmaya devam ediyoruz.

@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
  Column(modifier) {
    ContentFrame(player)  // Video surface and shutter logic
    Row (Modifier.align(Alignment.CenterHorizontally)) {                 
      SeekBackButton(player)   // Simple controls
      PlayPauseButton(player)
      SeekForwardButton(player)
    }
  }
}

 

image.png

Kullanıma hazır öğeler içeren basit Compose oynatıcı kullanıcı arayüzü

Yayınlama ve yerel oynatma arasındaki geçişleri otomatik olarak yönetme

media3-cast modülündeki CastPlayer, yerel oynatma (ör. ExoPlayer ile) ve uzaktan Cast oynatma arasındaki geçişleri otomatik olarak işleyecek şekilde yeniden yazıldı.

MediaSession uygulamanızı ayarlarken ExoPlayer etrafında bir CastPlayer oluşturup kullanıcı arayüzünüze MediaRouteButton eklemeniz yeterlidir.

// MediaSession setup with CastPlayer 

val exoPlayer = ExoPlayer.Builder(context).build()

val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()

val session = MediaSession.Builder(context, castPlayer).build()

// MediaRouteButton in UI 

@Composable fun UIWithMediaRouteButton() {

  MediaRouteButton()

}
image.png

Media3 oturumu demo uygulamasında yeni CastPlayer entegrasyonu

dav1d tabanlı yeniden yazılmış uzantıyla tutarlı AV1 oynatma

1.9.0 sürümü, popüler dav1d kitaplığını temel alan ve tamamen yeniden yazılmış bir AV1 uzantı modülü içerir. 

Tüm uzantı kod çözücü modüllerinde olduğu gibi, ilgili yerel kodu doğru şekilde paketlemek için kaynaktan derleme  yapılması gerektiğini lütfen unutmayın. Kod çözücü paketlemek, tüm cihazlarda tutarlılık ve biçim desteği sağlar ancak kod çözme işlemini sizin işleminizde çalıştırdığı için güvenebileceğiniz içerikler için en uygun seçenektir. 

Önbelleğe alma ve bellek yönetimini PreloadManager'a entegre etme

PreloadManager ürünümüzü de daha iyi hale getirdik. Bu API, medya öğelerini oynatma dışında belleğe önceden yüklemenize ve gerektiğinde sorunsuz bir şekilde oynatıcıya aktarmanıza olanak tanıyordu. Oldukça yüksek performanslı olsa da yanlışlıkla çok fazla önceden yükleme yaparak bellek sınırlarını aşmamaya dikkat etmeniz gerekiyordu. Media3 1.9.0 ile bu süreci çok daha kolay ve kararlı hale getiren iki özellik ekledik:

  1. Önbelleğe alma desteği: Önceden yüklemenin ne kadar ileriye kadar yapılacağını tanımlarken artık önceden yüklenen öğeler için hedef durum olarak PreloadStatus.specifiedRangeCached(0, 5000) seçeneğini belirleyebilirsiniz. Bu işlem, verileri belleğe yüklemek yerine belirtilen aralığı diskteki önbelleğinize ekler. Bu sayede, mevcut öğeden daha uzakta olan öğelerin artık bellekte yer kaplaması gerekmediğinden önceden yükleme için çok daha geniş bir öğe aralığı sağlayabilirsiniz. Bunun için DefaultPreloadManager.Builder içinde bir Cache ayarlamanız gerektiğini unutmayın.
  2. Otomatik bellek yönetimi : Önceden yükleme durumunu daha iyi yönetmek için LoadControl arayüzümüzü de güncelledik. Artık bellekte önceden yüklenen tüm öğeler için açık bir üst bellek sınırı belirleyebilirsiniz. Varsayılan olarak 144 MB'tır ve sınırı DefaultLoadControl.Builder üzerinden yapılandırabilirsiniz. DefaultPreloadManager, sınıra ulaşıldığında önceden yüklemeyi otomatik olarak durdurur ve gerekirse daha düşük öncelikli öğelerin belleğini otomatik olarak serbest bırakır.

ExoPlayer'daki yeni basitleştirilmiş varsayılan davranışlardan yararlanma

Her zaman olduğu gibi ExoPlayer'a da birçok kademeli iyileştirme ekledik. Bunlardan sadece birkaçı:

  • Sesi kapatma ve açma: Zaten bir setVolume yöntemimiz vardı ancak şimdi, önceki ses seviyesini kendiniz takip etmeden kolayca geri yüklemek için kullanışlı mute ve unmute yöntemlerini ekledik.
  • Takılan oynatıcı algılama: Bazı nadir durumlarda oynatıcı, örneğin codec sorunları veya yanlış yapılandırmalar nedeniyle herhangi bir ilerleme kaydetmeden arabelleğe alma veya oynatma durumunda takılabilir. Kullanıcılarınız rahatsız olur ancak siz bu sorunları analizlerinizde göremezsiniz. Bu durumu daha belirgin hale getirmek için oynatıcı, takılma durumu algıladığında artık StuckPlayerException bildiriyor.
  • Varsayılan olarak uyanık kalma kilidi: Uyanık kalma kilidi yönetimi daha önce isteğe bağlıydı. Bu durum, arka planda çalışırken oynatma ilerleme durumunun çok gecikebileceği, bulunması zor uç durumlara neden oluyordu. Bu özellik artık devre dışı bırakılabiliyor. Bu nedenle, oynatmayla ilgili tüm manuel uyanık kalma kilidi işlemlerini kaldırabilirsiniz.
  • Altyazı düğmesi mantığı için basitleştirilmiş ayar: TrackSelectionParameters ayarını "altyazıları aç/kapat" olarak değiştirmek şaşırtıcı derecede zordu. Bu nedenle, bu kullanım alanı için basit bir boole selectTextByDefault seçeneği ekledik.

MediaSession'da medya düğmesi tercihlerinizi basitleştirme

Şimdiye kadar, Android Auto veya WearOS'teki medya bildirim çekmecesinde hangi düğmelerin gösterileceğine dair tercihlerinizi tanımlamak için özel komutlar ve düğmeler tanımlamanız gerekiyordu. Bu durum, yalnızca standart bir oynatıcı yöntemini tetiklemek istediğinizde bile geçerliydi.

Media3 1.9.0, bu işlemi çok daha basit hale getiren yeni bir işleve sahiptir. Artık standart bir oynatıcı komutuyla medya düğmesi tercihlerinizi tanımlayabilirsiniz. Bu sayede özel komut işleme gerek kalmaz.

session.setMediaButtonPreferences(listOf(
    CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
      .setDisplayName(R.string.skip_forward)
      .setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action 
      .build()
))
image.png

İleri sarma düğmesiyle medya düğmesi tercihleri

Gerçek zamanlı önizleme için CompositionPlayer

1.9.0 sürümü, CompositionPlayer'ı yeni bir @ExperimentalApi ek açıklamasıyla sunar. Ek açıklama, özelliğin deneme için kullanılabilir olduğunu ancak hâlâ geliştirme aşamasında olduğunu gösterir. 

CompositionPlayer, Media3 düzenleme API'lerinde medya düzenlemelerinin gerçek zamanlı önizlemesi için tasarlanmış yeni bir bileşendir. Tanıdık Media3 Player arayüzü üzerine inşa edilen CompositionPlayer, kullanıcıların dışa aktarma işlemine başlamadan önce değişikliklerini uygulamada görmelerine olanak tanır. Dışa aktarma için Transformer yöntemine ileteceğiniz Composition nesnesini kullanır. Önizleme ve dışa aktarma için veri modelini birleştirerek düzenleme iş akışını kolaylaştırır.

CompositionPlayer'ı kullanmaya başlamanızı ve geri bildiriminizi paylaşmanızı öneririz. Daha fazla ayrıntı için gelecek yayınları ve doküman güncellemelerini takip edin.

Transformer'da varsayılan muxer olarak InAppMuxer

Transformer artık medya kapsayıcı dosyalarını yazmak için varsayılan muxer olarak InAppMp4Muxer kullanıyor. Dahili olarak InAppMp4Muxer, Media3 Muxer modülüne bağlıdır ve tüm API sürümlerinde tutarlı bir davranış sağlar. 

Transformer artık varsayılan olarak Android platformunun MediaMuxer'ını kullanmasa da kullanım alanınız gerektiriyorsa setMuxerFactory aracılığıyla FrameworkMuxer.Factory sağlayabilirsiniz.

Yeni hız ayarlama API'leri

1.9.0 sürümü, medya düzenleme için hız ayarlama API'lerini basitleştirir. Hızı kontrol etmek için doğrudan EditedMediaItem.Builder üzerinde yeni yöntemler sunarak API'yi daha sezgisel hale getirdik. Artık EditedMediaItem.Builder üzerinde setSpeed(SpeedProvider provider) yöntemini çağırarak bir klibin hızını değiştirebilirsiniz:

val speedProvider = object : SpeedProvider {
    override fun getSpeed(presentationTimeUs: Long): Float {
        return speed
    }

    override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
        return C.TIME_UNSET
    }
}

EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
    .setSpeed(speedProvider)
    .build()

Bu yeni yaklaşım, daha önce kullandığımız ve gelecekteki bir sürümde kaldıracağımız Effects#createExperimentalSpeedChangingEffects() yönteminin yerini alacak.

EditedMediaItemSequence için parça türleri 

1.9.0 sürümünde, EditedMediaItemSequence, sekans oluşturma sırasında istenen çıkış kanalı türlerinin belirtilmesini gerektirir. Bu değişiklik, parça işleme sürecinin tüm kompozisyonda daha net ve sağlam olmasını sağlar. 

Bu işlem, bir dizi parça türünü (ör. C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO) kabul eden yeni bir EditedMediaItemSequence.Builder oluşturucu aracılığıyla yapılır. 

Oluşturma işlemini basitleştirmek için yeni statik kolaylık yöntemleri ekledik:

  • EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
  • EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
  • EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)

Daha net ve güvenilir sıra tanımları için yeni oluşturucuya veya kolaylık yöntemlerine geçmenizi öneririz.

Yalnızca video içeren bir dizi oluşturma örneği:

EditedMediaItemSequence videoOnlySequence =
    EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
        .addItem(editedMediaItem)
        .build()

Herhangi bir hatayla karşılaşırsanız veya sorularınız ya da özellik istekleriniz olursa lütfen Media3 Issue Tracker üzerinden bizimle iletişime geçin. Düşüncelerinizi öğrenmek isteriz.

Okumaya devam et