コンテンツの管理と再生

このページでは、プリロード マネージャーを使用して動画コンテンツを管理する方法について説明します。プリロード マネージャーを使用すると、ユーザー エクスペリエンスを向上させることができます。ユーザーがメディア アイテムを切り替えるときに、マネージャーがすでにコンテンツの一部を読み込んでいるため、再生がより速く開始されます。

このページでは、次のトピックについて説明します。

プリロード マネージャーにメディア アイテムを追加する

プリロード マネージャーに、追跡する各メディア アイテムについて通知する必要があります。たとえば、アプリに動画のカルーセルがある場合は、それらの動画をプリロード マネージャーに追加します。ユースケースに応じて、すべての動画を追加することも、現在再生中の動画の近くにあるすべての動画を追加することもできます。プリロード マネージャーには後で新しいアイテムを追加することもできます。

メディア アイテムを追加しても、それ自体ではプリロード マネージャーがコンテンツの読み込みを開始することはありません。プリロードをトリガーするには、プリロード マネージャーの優先度を無効にする必要があります。

val initialMediaItems = pullMediaItemsFromService(/* count= */ 20);
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems.get(index), /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this

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

  • このスニペットは、作成後にプリロード マネージャーに初期データを入力する方法を示しています。add() を呼び出して、既存のプリロード マネージャーに項目を追加することもできます。
  • このスニペットでは、pullMediaItemsFromService() は再生するコンテンツのリストを取得するアプリのロジックです。コードはこのメソッドを呼び出して、最大 20 個のアイテムのリストを取得します。
  • preloadManager は、DefaultPreloadManager を作成するで作成した DefaultPreloadManager です。コードは、そのマネージャーの add() メソッドを呼び出して、カルーセルの各アイテムを追加します。
  • rankingData は、プリロード マネージャーが各メディア アイテムの優先度を判断するために使用する値です。DefaultPreloadManager の場合、rankingData はカルーセル内のアイテムの位置を表す整数です。プリロード マネージャーは、各アイテムが現在再生中のアイテムからどれだけ離れているかに基づいて優先度を決定します。

プリロード マネージャーの優先度を無効にする

プリロード マネージャーがコンテンツのプリロードを開始するようにトリガーするには、invalidate() を呼び出して、アイテムの優先度が最新ではないことをプリロード マネージャーに伝える必要があります。この操作は、次のような状況で行う必要があります。

  • プリロード マネージャーに新しいメディア アイテムを追加したり、メディア アイテムを削除したりした場合。複数のアイテムを追加または削除する場合は、すべてのアイテムを追加してから invalidate() を呼び出す必要があります。
  • ユーザーがメディア アイテムを切り替えた場合。この場合、コンテンツの取得と再生で説明されているように、invalidate() を呼び出す前に、現在の再生インデックスを更新する必要があります。

プリロード マネージャーを無効にすると、作成した TargetPreloadStatusControl が呼び出され、各アイテムから読み込むコンテンツの量が確認されます。次に、各アイテムのコンテンツを優先度の高い順に読み込みます。

preloadManager.invalidate()

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

  • invalidate() を呼び出すと、プリロード マネージャーが、認識している各メディア アイテムの優先度を再評価します。そのため、プリロード マネージャーに多くの変更を加える場合は、invalidate() を呼び出す前に変更を完了する必要があります。

メディアを取得して再生する

ユーザーが新しいメディア アイテムに進んだら、プリロード マネージャーからメディア アイテムを取得する必要があります。プリロード マネージャーがコンテンツを読み込んでいる場合、プリロード マネージャーを使用していない場合よりもコンテンツの再生が速くなります。プリロード マネージャーがそのアイテムのコンテンツをまだ読み込んでいない場合は、コンテンツは通常どおり再生されます。

// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
    player.setMediaSource(mediaSource)
}
player.prepare()

// When the media item is displaying at the center of the screen
player.play()
preloadManager.setCurrentPlayingIndex(currentIndex)

// Need to call invalidate() to update the priorities
preloadManager.invalidate()

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

  • player は、アプリがコンテンツの再生に使用している Media3 ExoPlayer です。このプレーヤーは、プリロード マネージャーの作成に使用したのと同じビルダーで DefaultPreloadManager.Builder.buildExoPlayer() を呼び出して作成する必要があります。
  • ユーザーが新しいメディア アイテムに切り替えると、アプリは getMediaSource() を呼び出してプリロード マネージャーからメディアソースを取得します。これは、プリロード マネージャーにすでに追加されている mediaItem である必要があります。プリロード マネージャーがまだコンテンツの読み込みを開始していない場合でも問題ありません。その場合、プリロードされたデータのない MediaSource が返されます。たとえば、ユーザーがカルーセルを大きく先に進めた場合などに発生することがあります。
  • ユーザーが新しいメディア アイテムを再生したら、setCurrentPlayingIndex を呼び出して、新しいアイテムがカルーセルのどこにあるかをプリロード マネージャーに伝えます。プリロード マネージャーは、次のアイテムの読み込みの優先順位付けにこの情報を必要とします。現在のインデックスを更新したら、invalidate() を呼び出して、プリロード マネージャーに各アイテムの優先度を再決定させます。

プリロード マネージャーからアイテムを削除する

プリロード マネージャーの効率を維持するには、プリロード マネージャーが追跡する必要がなくなったアイテムを削除する必要があります。カルーセル内に残っているものの、ユーザーの現在位置から遠く離れているアイテムも削除できます。たとえば、ユーザーが視聴しているアイテムから 15 個以上離れているアイテムはプリロードする必要がないと判断できます。その場合は、アイテムがその距離まで離れたときに削除します。ユーザーが削除したアイテムに戻った場合は、いつでもアイテムを追加し直すことができます。

preloadManager.remove(mediaItem)

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

プリロード マネージャーの使用が完了したらリリースする

プリロード マネージャーが不要になった場合は、リソースを解放するためにリリースする必要があります。特に、アクティビティが破棄されたときに必ずリリースしてください。

preloadManager.release()

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

  • オブジェクトを解放した後は、オブジェクトのメソッドを呼び出すことはできません
  • 別のプリロード マネージャーを作成する必要がある場合は、新しい DefaultPreloadManager.Builder を作成し、それを使用して DefaultPreloadManager を作成します。古いビルダーを再利用しようとしないでください。