建立及設定 DefaultPreloadManager

本頁說明如何建立 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-2n+2 中的其他媒體項目:Return PreloadStatus.TRACKS_SELECTED
  • 範圍 n-4n+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 物件,播放由該預先載入管理工具管理的內容。