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ına dayalı önceden yükleme yöneticileri, seçtiğiniz ölçütlere göre içeriği sıralamanıza olanak tanır. Bu belgede, her medya öğesinin bir listedeki konumunu (ör. video banttaki konumu) temsil eden bir tam sayıyla sıralandığı türetilmiş sınıf DefaultPreloadManager'nın nasıl kullanılacağı açıklanmaktadır. Ön yükleme yöneticisi, öğeleri kullanıcının şu anda oynattığı öğeye ne kadar yakın olduğuna göre yüklemeye öncelik verir. Bu sayede, kullanıcı başka bir öğeye geçtiğinde yeni öğe hemen oynatılabilir.
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 yükleneceğini öğrenmek için sorgulayabileceği bir
TargetPreloadStatusControltanımlayın. - Önceden yükleme yöneticisini oluşturmak 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 ön yükleme durumu kontrolü nesnesini iletirsiniz. Bu nesne, TargetPreloadStatusControl arayüzünü uygular. Ön yükleme yöneticisi medyayı ön 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. Önceden yükleme, medya verilerini doğrudan oynatıcının bellek içi arabelleğine yükleyerek anında oynatmaya hazır hale getirir. Önbelleğe alma ise oynatıcı belleğini korumak 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: Önceden yükleme yöneticisi, belirtilen başlangıç konumundan ve belirtilen süre boyunca (milisaniye cinsinden) içeriği oynatıcının bellek içi arabelleğine yüklemelidir.STAGE_SPECIFIED_RANGE_CACHED: Önceden yükleme yöneticisi, belirtilen başlangıç konumundan itibaren belirtilen süre boyunca (milisaniye cinsinden) içeriği disk önbelleğine kaydetmelidir.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 henüz yüklemeye başlamamalıdır.STAGE_SOURCE_PREPARED: Ön yükleme yöneticisi, içerik kaynağını hazırlamalıdır. Örneğin, içeriğin meta verileri ayrı bir manifest dosyasındaysa ön yükleme yöneticisi bu manifesti getirebilir ve ayrıştırabilir.null: Önceden yükleme yöneticisi, söz konusu 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, şu anda oynatılan öğeye en yakın öğeler için daha fazla içerik yüklenir. Kullanıcı, dizin n olan içeriği oynatıyorsa, kontrolcü 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: Geri dön
PreloadStatus.TRACKS_SELECTED - n-4 ile n+4 arasındaki diğer medya öğeleri: Döndür
PreloadStatus.SOURCE_PREPARED - Diğer tüm medya öğeleri için
nulldeğerini döndürün.
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 oluşturucuya iletirsiniz. currentPlayingIndex, şu 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
getTargetPreloadStatusişlevini çağırır ve ilgili medya öğesi için belirttiğiniz sıralama bilgilerini iletir.DefaultPreloadManagerdurumunda, bu sıralama bilgisi, öğenin bir banttaki konumunu belirten bir tam sayıdır. Yöntem, döndürülecek kodu seçmek için bu dizini, şu anda seçili olan öğenin diziniyle karşılaştırır.
Ö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 ön yükleme durumu kontrolüyle yapılandırılır. Tüm varsayılan yapılandırmaları içeren bir önceden 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 belirleyici yöntemler de sağlar.
Örneğin, DefaultPreloadManager içindeki tüm önceden yüklenen medya kaynakları için hedef toplam arabellek baytlarını özelleştirebilirsiniz. Böylece, önceden yüklenen veriler bu sınırı aşmaz. Bu sınırı, yöntemini kullanarak yapılandırabilirsiniz.
Oyuncu adının "preload" bulunduğu özel bir DefaultLoadControl.Builder üzerinde setPlayerTargetBufferBytes(String, int) yöntemini kullanın ve bu örneği önceden yükleme yöneticisi oluşturucusuna iletin:
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 belirleyici yöntemleri özelleştirme için temelde isteğe bağlı olsa da herhangi bir medya öğesini diske önbelleğe almak istiyorsanız setCache() çağırarak oluşturucuyu Cache ile yapılandırmanız gerekir. Önbellek yapılandırılmamışsa medya öğelerini önbelleğe almaya çalışmak IllegalStateException ile sonuçlanır.
Önceden yüklenmiş medya öğesini oynatmak için ExoPlayer'ı oluşturun.
Önceden yükleme yöneticisini oluşturmak için oluşturucuyu 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. Bu yapılandırmalar ayarlanmış bir ExoPlayer örneği ileterek ExoPlayer.Builder için oynatmaya özel yapılandırmaları yine de 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)