Ürün Haberleri

Media3 1.9.0 - Yenilikler

Okuma süresi 6 dakika
Kristina Simakova
Mühendislik yöneticisi

Media3 1.9.0 yayınlandı. En son sürüm, her zamanki hata düzeltmelerinin ve performans iyileştirmelerinin yanı sıra dört yeni veya büyük ölçüde yeniden yazılmış modül içerir:

  • media3-inspector - Meta verileri ve kareleri oynatma dışında ayıklama
  • media3-ui-compose-material3 - Yalnızca birkaç adımda temel bir Material3 Compose Media kullanıcı arayüzü oluşturma
  • media3-cast - Cast ve yerel oynatma arasındaki geçişleri otomatik olarak yönetme
  • media3-decoder-av1 - dav1d kitaplığına dayalı olarak yeniden yazılan uzantı kod çözücüyle tutarlı AV1 oynatma

Ayrıca PreloadManager'da önbelleğe alma ve bellek yönetimi iyileştirmeleri yaptık ve çeşitli yeni ExoPlayer, Transformer ve MediaSession basitleştirmeleri sağladık. 

Bu sürümde, medya düzenlemelerini önizlemek için CompositionPlayer'ya deneysel erişim de elde edersiniz.  


Daha fazla bilgi edinmek için okumaya devam edin. Bu sürümdeki değişikliklerin kapsamlı bir özetini görmek için her zaman olduğu gibi lütfen sürüm notlarının tamamını inceleyin.

Meta verileri ve kareleri oynatma dışında ayıklama

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

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

  • MetadataRetriever süreyi, biçimi ve statik meta verileri okumak için MediaItem.
  • Bir öğeden çerçeve veya küçük resim almak için FrameExtractor
  • Dosyadaki örnekler hakkında ayrıntılı bilgi edinmek için Android platformundaki MediaExtractor sınıfının doğrudan yerine geçen MediaExtractorCompat.

MetadataRetriever ve FrameExtractor, basit bir AutoCloseable kalıbını izler. 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 Material 3 Compose Media kullanıcı arayüzü oluşturun

Önceki sürümlerde, Compose kullanıcı arayüzü öğeleri ile Player örneğiniz arasında bağlayıcı kod sağlamaya başlamıştık. Media3 1.9.0 ile birlikte, tamamen stilize edilmiş Material3 düğmeleri ve içerik öğeleri içeren yeni bir modül olan media3-ui-compose-material3'ü ekledik. Bu bileşenler, stili özelleştirmek için gereken tüm esnekliği sağlarken medya kullanıcı arayüzünü yalnızca birkaç adımda 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ı ele alan 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 genişletilmiş rehber sayfalarımıza göz atın.

Ayrıca, önceden oluşturulmuş bir arama çubuğu, PlayerView için eksiksiz bir hazır çözümün yanı sıra 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

Hazır öğelerle basit Compose oynatıcı kullanıcı arayüzü

Cast 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 kurulumunu yaptığınızda ExoPlayer etrafında bir CastPlayer oluşturup kullanıcı arayüzünüze bir 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'ye dayalı olarak yeniden yazılan uzantıyla tutarlı AV1 oynatma

1.9.0 sürümünde, popüler dav1d kitaplığına dayalı, tamamen yeniden yazılmış bir AV1 uzantı modülü bulunur. 

Tüm uzantı kod çözücü modüllerinde olduğu gibi, ilgili yerel kodun doğru şekilde paketlenmesi için kaynaktan oluşturma  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 kendi sürecinizde yürüttüğü için en iyi sonucu güvenebileceğiniz içeriklerde verir. 

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

PreloadManager hizmetimizi de daha iyi hale getirdik. Bu API, oynatma dışında medyayı belleğe önceden yüklemenize ve gerektiğinde sorunsuz bir şekilde oynatıcıya aktarmanıza olanak tanıyordu. Oldukça iyi performans gösterse de çok fazla önceden yükleme yaparak bellek sınırlarını aşmamaya dikkat etmeniz gerekiyordu. Bu nedenle, Media3 1.9.0 sürümüne bu işlemi çok daha kolay ve kararlı hale getiren iki özellik ekledik:

  1. Önbelleğe alma desteği : Ne kadar önyükleme yapılacağını tanımlarken artık önyüklenen öğeler için hedef durum olarak PreloadStatus.specifiedRangeCached(0, 5000) seçebilirsiniz. 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 Cache ayarlanması gerektiğini unutmayın.
  2. Otomatik bellek yönetimi : LoadControl arayüzümüzü de güncelledik. Böylece, önceden yükleme durumunu daha iyi yönetebiliyoruz. Artık bellekteki tüm önceden yüklenmiş öğ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 bölümünde yapılandırabilirsiniz. Sınır aşıldığında DefaultPreloadManager önceden yüklemeyi otomatik olarak durdurur ve gerekirse daha düşük öncelikli öğelerin belleğini otomatik olarak boşaltır.

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

Her zaman olduğu gibi ExoPlayer'da da birçok küçük iyileştirme yaptık. Bunlardan bazıları:

  • Sesi kapatma ve açma: Bu işlem için setVolume yöntemimiz vardı ancak artık sesi kendiniz takip etmeden kolayca geri yüklemek için mute ve unmute yöntemlerini de ekledik.
  • Takılan oynatıcıyı algılama: Nadir durumlarda, oynatıcı ilerleme kaydetmeden arabelleğe alma veya oynatma durumunda takılabilir. Örneğin, bu durum codec sorunları veya yanlış yapılandırmalardan kaynaklanabilir. Kullanıcılarınız bu sorunlardan rahatsız olur ancak siz bu sorunları analizlerinizde asla görmezsiniz. 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 tutma kilidi: Uyanık tutma kilidi yönetimi daha önce isteğe bağlıydı. Bu nedenle, arka planda çalışırken oynatma ilerlemesinin çok fazla gecikebileceği uç durumları bulmak zordu. Bu özellik artık devre dışı bırakılabilir. Bu nedenle, bu konuda endişelenmenize gerek yoktur ve oynatma sırasında tüm manuel uyandırma kilidi işlemlerini kaldırabilirsiniz.
  • Altyazı düğmesi mantığı için basitleştirilmiş ayar: TrackSelectionParameters ifadesini "altyazıları aç/kapat" olarak değiştirmek beklenenden daha zor olduğu için bu kullanım alanı için basit bir boolean selectTextByDefault seçeneği ekledik.

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

Şimdiye kadar, Android Auto veya WearOS'teki medya bildirimi çekmecesinde hangi düğmelerin gösterileceğiyle ilgili tercihlerinizi tanımlamak için standart bir oynatıcı yöntemini tetiklemek isteseniz bile özel komutlar ve düğmeler tanımlamanız gerekiyordu.

Media3 1.9.0, bu işlemi çok daha basit hale getiren yeni bir işlev sunuyor. Artık standart bir oynatıcı komutuyla medya düğmesi tercihlerini tanımlayabilir ve özel komut işleme gerektirmeyen bir çözüm kullanabilirsiniz.

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

Hızlı ileri sarma düğmesi içeren medya düğmesi tercihleri

Gerçek zamanlı önizleme için CompositionPlayer

1.9.0 sürümünde, yeni bir @ExperimentalApi ek açıklaması altında CompositionPlayer kullanıma sunuluyor. Ek açıklama, özelliğin deneme için kullanılabildiğini ancak geliştirme aşamasında olduğunu gösterir. 

CompositionPlayer, medya düzenlemelerinin gerçek zamanlı önizlemesi için tasarlanmış Media3 düzenleme API'lerindeki yeni bir bileşendir. Tanıdık Media3 Player arayüzü üzerine kurulu olan CompositionPlayer, kullanıcıların dışa aktarma işlemine başlamadan önce değişikliklerini uygulamada görmelerini sağlar. Dışa aktarma için Transformer'ye ileteceğiniz Composition nesnesini kullanır. Böylece, ö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 bilgi için yakında yayınlanacak gönderileri ve dokümanlardaki güncellemeleri 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, tüm API sürümlerinde tutarlı davranış sağlayan Media3 Muxer modülüne bağlıdır. 

Transformer artık varsayılan olarak Android platformunun MediaMuxer'ını kullanmasa da kullanım alanınız gerektiriyorsa FrameworkMuxer.Factory'yi setMuxerFactory aracılığıyla 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 setSpeed(SpeedProvider provider) üzerinde EditedMediaItem.Builder ç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, desteğini sonlandırdığımız ve gelecekteki bir sürümde kaldıracağımız Effects#createExperimentalSpeedChangingEffects() kullanımına yönelik önceki yöntemin yerini alıyor.

EditedMediaItemSequence için parça türleriyle tanışın 

1.9.0 sürümünde, EditedMediaItemSequence için sıra oluşturma sırasında istenen çıkış parçası türlerinin belirtilmesi gerekir. Bu değişiklik, parçaların işlenmesinin tüm beste boyunca daha açık 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 sürecini 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()

Hatalarla karşılaşırsanız veya sorularınız ya da özellik istekleriniz varsa lütfen Media3 Sorun İzleyici üzerinden iletişime geçin. Sizden haber bekliyoruz.

Yazan:

Okumaya devam edin