このページでは、選択した戦略に基づいてアプリのメディア コンテンツをプリロードする DefaultPreloadManager を作成する方法について説明します。
BasePreloadManager 抽象クラスに基づくプリロード マネージャーを使用すると、選択した条件でコンテンツの優先順位を付けることができます。このドキュメントでは、派生クラス DefaultPreloadManager の使用方法について説明します。このクラスでは、各メディア アイテムがリスト内の位置(動画カルーセルの位置など)を表す整数でランク付けされます。プリロード マネージャーは、ユーザーが現在再生しているアイテムに近いアイテムを優先して読み込みます。これにより、ユーザーが別のアイテムに移動した場合、新しいアイテムをすぐに再生できます。
DefaultPreloadManager のインスタンスを作成する 3 つの手順は次のとおりです。
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-2~n+2 の他のメディア アイテム:
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オブジェクトを作成します。