本頁說明如何建立 DefaultPreloadManager
,根據您選擇的策略預先載入應用程式的媒體內容。
根據 BasePreloadManager
抽象類別預先載入管理員,即可依據所選條件對內容進行排序。本文說明如何使用衍生類別 DefaultPreloadManager
,其中每個媒體項目都會以整數表示在清單中的位置 (例如在影片輪播介面中的位置)。預先載入管理工具會根據項目與使用者目前播放項目的距離,決定載入項目的優先順序。這樣一來,使用者移至其他項目時,新項目就能立即開始播放。
建立 DefaultPreloadManager
例項的步驟如下:
- 定義
TargetPreloadStatusControl
,預先載入管理工具可查詢該項目,瞭解媒體項目是否已準備好載入,以及要載入多少內容。 - 建立建構工具,用於建立預先載入管理工具,以及建立應用程式的
ExoPlayer
物件。 - 呼叫建構工具的
build()
方法,使用建構工具建立預先載入管理工具。
建立目標預先載入狀態控制項
建立 DefaultPreloadManager.Builder
時,您會傳遞定義的目標預先載入狀態控制項物件。這個物件會實作 TargetPreloadStatusControl
介面。預先載入管理工具準備預先載入媒體時,會呼叫狀態控制項的 getTargetPreloadStatus()
方法,瞭解要載入多少內容。狀態控制項可回覆下列任一狀態碼:
STAGE_SPECIFIED_RANGE_LOADED
:預先載入管理工具應從指定開始位置載入內容,並持續指定時間 (以毫秒為單位)。STAGE_TRACKS_SELECTED
:預先載入管理工具應載入及處理內容軌的資訊,並選取軌。預先載入管理工具不應開始載入內容。STAGE_SOURCE_PREPARED
:預先載入管理工具應準備內容來源。舉例來說,如果內容的中繼資料位於獨立的資訊清單檔案,預先載入管理工具可能會擷取並剖析該資訊清單。null
:預先載入管理工具不應載入該媒體項目的任何內容或中繼資料。
您需要制定策略,決定每個媒體項目要載入多少內容。在這個範例中,系統會為最接近目前播放項目的項目載入更多內容。如果使用者正在播放索引 n 的內容,控制器會傳回下列程式碼:
- 索引 n+1 (下一個媒體項目):從預設開始位置載入 3000 毫秒 (3 秒)
- 索引 n-1 (上一個媒體項目):從預設開始位置載入 1000 毫秒 (1 秒)
- 範圍 n-2 到 n+2 中的其他媒體項目:Return
PreloadStatus.TRACKS_SELECTED
- 範圍 n-4 到 n+4 中的其他媒體項目:傳回
PreloadStatus.SOURCE_PREPARED
- 如果是其他媒體項目,請傳回
null
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
}
}
程式碼重點
- 建立預先載入管理工具建構函式時,您會將
MyTargetPreloadStatusControl
的例項傳遞至該建構函式。 currentPlayingIndex
包含目前播放的媒體項目索引。應用程式的職責是確保該值為最新狀態。- 預先載入管理工具準備好載入內容時,會呼叫
getTargetPreloadStatus
,並傳遞您為相應媒體項目指定的排名資訊。如果是DefaultPreloadManager
,排名資訊是整數,指定項目在輪轉介面中的位置。這個方法會比較該索引與目前所選項目的索引,藉此選擇要傳回的程式碼。
建立預先載入管理工具
如要建立預先載入管理員,您需要 DefaultPreloadManager.Builder
。
該建構工具已設定目前的內容,以及應用程式的目標預先載入狀態控制項。建立工具也提供設定器方法,可用於設定預先載入管理工具的自訂元件。
除了使用建構工具建立預先載入管理工具,您也會使用建構工具建立應用程式用來播放內容的 ExoPlayer
物件。
val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()
程式碼重點
MyTargetPreloadStatusControl
是您在「建立目標預先載入狀態控制項」中定義的類別。- 您會使用相同的
DefaultPreloadManager.Builder
建立ExoPlayer
物件,播放由該預先載入管理工具管理的內容。