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(次のメディア アイテム): デフォルトの開始位置から 3,000 ミリ秒(3 秒)を読み込む
  • インデックス n-1(前のメディア アイテム): デフォルトの開始位置から 1,000 ミリ秒(1 秒)を読み込みます。
  • 範囲 n-2n+2 の他のメディア アイテム: 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()

コードに関する主なポイント