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:
- Önceden yükleme yöneticisinin, medya öğesinin yüklenmeye hazır olup olmadığını ve ne kadarının yükleneceğini öğrenmek için sorgulayabileceği bir
TargetPreloadStatusControltanımlayın. - Önceden yükleme yöneticisini ve uygulamanızın
ExoPlayernesnelerini oluşturmak için kullanacağınız oluşturucuyu oluşturun. - Oluşturucunun
build()yöntemini çağırarak önceden yükleme yöneticisini oluşturmak için oluşturucuyu kullanın.
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
nulldö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.DefaultPreloadManagersö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)