コンテンツの管理と再生

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

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

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

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

これを行うには、addMediaItems などのバッチ追加メソッドを使用します。または、add(または addMediaSource)を呼び出して、メディア アイテムを個別に追加することもできます。ただし、メディア アイテムを個別に追加しても、プリロードは自動的にトリガーされません。個別の メソッドを使用する場合は、アイテムの追加が完了したら invalidate を明示的に呼び出して、プリロード マネージャーに優先度を更新してプリロードを開始するように指示する必要があります。

val initialMediaItems = pullMediaItemsFromService(count = 20)
val rankingDataList = initialMediaItems.indices.toList()
preloadManager.addMediaItems(initialMediaItems, rankingDataList)

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

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

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

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

また、setCurrentPlayingIndex を呼び出して、プリロード マネージャーの現在の再生インデックスを更新する必要があります。これにより、プリロード マネージャーは今後のプリロード オペレーションの優先度を決定できます。

// When a media item is about to be displayed on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
  player.setMediaSource(mediaSource)
} else {
  // If the mediaSource is null, its mediaItem hasn't been added to the preload
  // manager yet. Send it directly to the player when it's about to play.
  player.setMediaItem(mediaItem)
}
player.prepare()

// When the media item is being displayed at the center of the screen ("in focus")
player.play()
// Update the current playing index to let the preload manager know where the user
// is in the carousel/pagination/list.
preloadManager.setCurrentPlayingIndex(currentIndex)

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

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

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

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

削除するメディア アイテムのリストがある場合は、 removeMediaItems を使用できます。または、 remove(または removeMediaSource)を呼び出して、メディア アイテムを 個別に削除することもできます。

preloadManager.removeMediaItems(mediaItemsToRemove)

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

  • プリロード マネージャーからすべてのアイテムを削除する場合は、 reset()ではなくremove()を呼び出すことができます。この方法は、カルーセル内のすべてのアイテムを変更する必要がある場合に便利です。その場合は、アイテムを削除した後、プリロード マネージャーに新しいアイテムを追加する必要があります。

プリロード マネージャーの使用が終了したら解放する

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

preloadManager.release()

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

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