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
TargetPreloadStatusControl
tanımlayın. - Önceden yükleme yöneticisini oluşturmak ve uygulamanızın
ExoPlayer
nesnelerini 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 ön yükleme durumu kontrolü oluşturma
DefaultPreloadManager.Builder
oluşturduğunuzda, tanımladığınız bir hedef önceden yükleme durumu kontrolü nesnesi iletirsiniz. Bu nesne, TargetPreloadStatusControl
arayüzünü uygular. Önceden yükleme yöneticisi medyayı önceden yüklemeye hazırlanırken ne kadar içerik yükleneceğini öğrenmek için durum kontrolünüzün getTargetPreloadStatus()
yöntemini çağırır. Durum kontrolü, aşağıdaki durum kodlarından biriyle yanıt verebilir:
STAGE_SPECIFIED_RANGE_LOADED
: Önceden yükleme yöneticisi, içeriği belirtilen başlangıç konumundan ve belirtilen süre boyunca (milisaniye cinsinden) yüklemelidir.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 önceden 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 ile içerik oynatıyorsa, kontrol cihazı 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.
- Aralıktaki diğer medya öğeleri n-2 ile n+2: Return
PreloadStatus.TRACKS_SELECTED
- n-4 ile n+4 aralığındaki diğer medya öğeleri: Döndür
PreloadStatus.SOURCE_PREPARED
- Diğer tüm medya öğeleri için
null
değerini döndürün.
class MyTargetPreloadStatusControl(
currentPlayingIndex: Int = C.INDEX_UNSET
): 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.TRACKS_SELECTED
} else if (abs(index - currentPlayingIndex) <= 4) {
// return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
}
return null
}
}
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
getTargetPreloadStatus
işlevini çağırır ve ilgili medya öğesi için belirttiğiniz sıralama bilgilerini iletir.DefaultPreloadManager
durumunda, 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.
Ön 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. Oluşturucu, önceden yükleme yöneticisinin özel bileşenlerini ayarlamak için kullanabileceğiniz ayarlayıcı yöntemler de sağlar.
Ön 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.
val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()
Kodla ilgili önemli noktalar
MyTargetPreloadStatusControl
, Hedef önceden yükleme durumu kontrolü oluşturma bölümünde tanımladığınız sınıftır.- Bu ön yükleme yöneticisi tarafından yönetilen içerikleri oynatacak
DefaultPreloadManager.Builder
nesnelerini oluşturmak için aynıExoPlayer
öğesini kullanırsınız.