DefaultPreloadManager oluşturma ve yapılandırma

Bu sayfada, seçtiğiniz stratejiye göre uygulamanız için medya içeriğini önceden yükleyen bir DefaultPreloadManager oluşturma işlemi açıklanmaktadır.

BasePreloadManager soyut sınıfını temel alan önceden yükleme yöneticileri, içeriği seçtiğiniz ölçütlere göre sıralamanıza olanak tanır. Bu dokümanda, her medya öğesinin bir listedeki konumunu (örneğin, video bandındaki konumu) temsil eden bir tam sayı ile sıralandığı türetilmiş sınıf DefaultPreloadManager'ın nasıl kullanılacağı açıklanmaktadır. Önceden yükleme yöneticisi, öğeleri kullanıcının oynatmakta olduğu öğeye yakınlığına göre önceliklendirerek yükler. Böylece kullanıcı başka bir öğeye geçerse yeni öğe hemen oynatılmaya başlar.

DefaultPreloadManager örneği oluşturmanın üç adımı vardır:

Hedef önceden yükleme durumu kontrolü oluşturma

DefaultPreloadManager.Builder oluşturduğunuzda, tanımladığınız bir hedef önceden yükleme durumu kontrolü nesnesini iletirsiniz. Bu nesne, TargetPreloadStatusControl arayüzünü uygular. Önceden yükleme yöneticisi, medyayı önceden yüklemeye hazırlanırken bir medya öğesi için içeriğin hazırlanıp hazırlanmayacağını, yüklenip yüklenmeyeceğini veya önbelleğe alınıp alınmayacağını belirlemek üzere durum kontrolünüzün getTargetPreloadStatus() yöntemini çağırır. Yükleme, medya verilerini doğrudan oynatıcının bellek içi arabelleğine önceden yükleyerek anında oynatılmaya hazır hale getirir. Önbelleğe alma ise oynatıcı belleğinden tasarruf etmek için medya verilerini kalıcı bir disk önbelleğine kaydeder. Durum kontrolü, aşağıdaki durum kodlarından biriyle yanıt verebilir:

  • STAGE_SPECIFIED_RANGE_LOADED: Ön yükleme yöneticisi, içeriği belirtilen başlangıç konumundan ve belirtilen süre boyunca (milisaniye cinsinden) oynatıcının bellek içi arabelleğine yüklemelidir.
  • STAGE_SPECIFIED_RANGE_CACHED: Ön yükleme yöneticisi, belirtilen başlangıç konumundan ve belirtilen süre boyunca (milisaniye cinsinden) içeriği disk önbelleğine almalıdır.
  • STAGE_TRACKS_SELECTED: Önceden yükleme yöneticisi, içerik parçasının bilgilerini yükleyip işlemeli ve parçaları seçmelidir. Önceden yükleme yöneticisi, içeriği yüklemeye henüz başlamamalıdır.
  • STAGE_SOURCE_PREPARED: Önceden yükleme yöneticisi, içerik kaynağını hazırlamalıdır. Örneğin, içeriğin meta verileri ayrı bir manifesto dosyasındaysa önceden yükleme yöneticisi bu manifestoyu getirip ayrıştırabilir.
  • null: Önceden yükleme yöneticisi, ilgili medya öğesi için herhangi bir içerik veya meta veri yüklememelidir.

Her medya öğesi için ne kadar içerik yükleneceğine karar vermek üzere bir stratejiniz olmalıdır. Bu örnekte, oynatılmakta olan öğeye en yakın öğeler için daha fazla içerik yüklenir. Kullanıcı n dizinine sahip içeriği oynatıyorsa kumanda aşağıdaki kodları döndürür:

  • Dizin n+1 (sonraki medya öğesi): Varsayılan başlangıç konumundan 3.000 ms (3 saniye) yükleyin.
  • Dizin n-1 (önceki medya öğesi): Varsayılan başlangıç konumundan 1.000 ms (1 saniye) yükleyin.
  • n-2 ile n+2 aralığındaki diğer medya öğeleri: Return PreloadStatus.TRACKS_SELECTED
  • n-4 ile n+4 aralığındaki diğer medya öğeleri: Geri dön PreloadStatus.SOURCE_PREPARED
  • Diğer tüm medya öğeleri için null döndürülür.

class MyTargetPreloadStatusControl(var currentPlayingIndex: Int = 0) :
  TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> {

  override fun getTargetPreloadStatus(index: Int): DefaultPreloadManager.PreloadStatus {
    if (index - currentPlayingIndex == 1) { // next track
      // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and
      // suggest loading 3000ms from the default start position
      return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
    } else if (index - currentPlayingIndex == -1) { // previous track
      // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and
      // suggest loading 3000ms from the default start position
      return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
    } else if (abs(index - currentPlayingIndex) == 2) {
      // return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED
      return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_TRACKS_SELECTED
    } else if (abs(index - currentPlayingIndex) <= 4) {
      // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
      return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED
    }
    return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED
  }
}

Kodla ilgili önemli noktalar

  • Önceden yükleme yöneticisi oluşturucuyu oluştururken MyTargetPreloadStatusControl örneğini bu oluşturucuya iletirsiniz.
  • currentPlayingIndex, o anda oynatılan medya öğesinin dizinini tutar. Bu değeri güncel tutmak uygulamanın görevidir.
  • Ön yükleme yöneticisi içerik yüklemeye hazır olduğunda getTargetPreloadStatus öğesini çağırır ve ilgili medya öğesi için belirttiğiniz sıralama bilgilerini iletir. DefaultPreloadManager söz konusu olduğunda bu sıralama bilgisi, öğenin banttaki konumunu belirten bir tam sayıdır. Yöntem, bu dizini o anda seçili olan öğenin diziniyle karşılaştırarak hangi kodun döndürüleceğini seçer.

Önceden yükleme yöneticisini oluşturma

Ön yükleme yöneticinizi oluşturmak için DefaultPreloadManager.Builder gerekir. Bu oluşturucu, mevcut bağlam ve uygulamanın hedef önceden yükleme durumu kontrolüyle yapılandırılır. Tüm varsayılan yapılandırmalarla bir ön yükleme yöneticisi oluşturabilirsiniz.

val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()

Oluşturucu, önceden yükleme yöneticisinin özel bileşenlerini ayarlamak için kullanabileceğiniz ayarlayıcı yöntemleri de sağlar.

Örneğin, DefaultPreloadManager uygulamasındaki tüm önceden yüklenen medya kaynakları için hedef toplam arabellek bayt sayısını özelleştirebilirsiniz. Böylece önceden yüklenen veriler bu sınırı aşmaz. Bu sınırı, "preload" oynatıcı adıyla özel bir DefaultLoadControl.Builder üzerinde setPlayerTargetBufferBytes(String, int) kullanarak yapılandırabilir ve bu örneği önceden yükleme yöneticisi oluşturucuya iletebilirsiniz:

val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)

preloadManagerBuilder.setLoadControl(
  DefaultLoadControl.Builder()
    .setPlayerTargetBufferBytes("preload", 128 * 1024 * 1024) // 128 MiB
    .build()
)
val preloadManager = preloadManagerBuilder.build()

Oluşturucunun ayarlayıcı yöntemleri özelleştirme için temel olarak isteğe bağlı olsa da herhangi bir medya öğesini diske önbelleğe almak istiyorsanız oluşturucuyu setCache() yöntemini çağırarak bir Cache ile yapılandırmanız gerekir. Önbellek yapılandırılmamışsa medya öğelerini önbelleğe alma girişimi IllegalStateException ile sonuçlanır.

Önceden yüklenen medya öğesini oynatmak için ExoPlayer'ı oluşturun.

Oluşturucuyu önceden yükleme yöneticisini oluşturmak için kullanmanın yanı sıra, uygulamanızın içeriği oynatmak için kullandığı ExoPlayer nesnelerini oluşturmak için de kullanırsınız. Böylece ExoPlayer, bileşenleri önceden yükleme yöneticisiyle doğru şekilde paylaşır. ExoPlayer için oynatmaya özel yapılandırmaları, bu yapılandırmaların ayarlandığı bir ExoPlayer.Builder örneği ileterek ayarlayabilirsiniz.

// Direct creation
val exoPlayer = preloadManagerBuilder.buildExoPlayer()

// Creation with custom playback specific configurations
val skipSilenceExoPlayerBuilder = ExoPlayer.Builder(context).setSkipSilenceEnabled(true)
val skipSilenceExoPlayer = preloadManagerBuilder.buildExoPlayer(skipSilenceExoPlayerBuilder)