このページでは、プリロード マネージャーを使用して動画コンテンツを管理する方法について説明します。プリロード マネージャーを使用すると、ユーザー エクスペリエンスを向上させることができます。ユーザーがメディア アイテムを切り替えたときに、マネージャーがすでにコンテンツの一部を読み込んでいるため、再生がより速く開始されます。
このページでは、次のトピックについて説明します。
プリロード マネージャーにメディア アイテムを追加する
プリロード マネージャーに、追跡する各メディア アイテムを伝える必要があります。たとえば、アプリに動画のカルーセルがある場合は、それらをプリロード マネージャーに追加します。ユースケースに応じて、すべての動画を追加することも、現在再生中の動画の近くにあるすべての動画のみを追加することもできます。後でプリロード マネージャーに新しいアイテムを追加することもできます。
これを行うには、addMediaItems(または addMediaSources)などのバッチ追加メソッドを使用します。または、add(または addMediaSource)を呼び出して、メディア アイテムを個別に追加することもできます。ただし、メディア アイテムを個別に追加しても、プリロードは自動的にトリガーされません。個別のメソッドを使用する場合は、アイテムの追加が完了したら、invalidate を明示的に呼び出して、プリロード マネージャーに優先度を更新してプリロードを開始するよう指示する必要があります。
val initialMediaItems = pullMediaItemsFromService(count = 20) val rankingDataList = initialMediaItems.indices.toList() preloadManager.addMediaItems(initialMediaItems, rankingDataList)
コードに関する主なポイント
- 次のスニペットは、プリロード マネージャーを作成した後に、バッチモードで初期データを入力する方法を示しています。
addMediaItemsを呼び出すと、既存の事前読み込みマネージャーにアイテムを追加できます。 - このスニペットでは、
pullMediaItemsFromService()は再生するコンテンツのリストを取得するアプリのロジックです。このコードは、そのメソッドを呼び出して、最大 20 個のアイテムのリストを取得します。 preloadManagerは、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は、アプリがコンテンツの再生に使用している Media3ExoPlayerです。このプレーヤーは、プリロード マネージャーの作成に使用したビルダーでDefaultPreloadManager.Builder.buildExoPlayer()を呼び出して作成する必要があります。- ユーザーが新しいメディア アイテムに切り替えると、アプリは
getMediaSource()を呼び出して、プリロード マネージャーからメディアソースを取得します。これは、プリロード マネージャーにすでに追加されているmediaItemである必要があります。プリロード マネージャーがコンテンツの読み込みをまだ開始していない場合は、プリロードされたデータがないMediaSourceが返されます。たとえば、ユーザーがカルーセルを突然大きくジャンプした場合に発生することがあります。 - ユーザーが新しいメディア アイテムを再生したら、
setCurrentPlayingIndexを呼び出して、新しいアイテムがカルーセルのどこにあるかをプリロード マネージャーに伝えます。プリロード マネージャーが次のアイテムの読み込みを優先するためには、この情報が必要です。
プリロード マネージャーからアイテムを削除する
プリロード マネージャーの効率を維持するため、プリロード マネージャーが追跡する必要がなくなったアイテムを削除してください。カルーセル内に残っているものの、ユーザーの現在位置から遠く離れているアイテムも削除できます。たとえば、ユーザーが視聴しているアイテムから 15 個以上離れているアイテムはプリロードする必要がないと判断できます。その場合は、アイテムがその距離まで離れたときに削除します。ユーザーが削除したアイテムに再び近づいた場合は、いつでもアイテムを元に戻すことができます。
削除するメディア アイテムのリストがある場合は、removeMediaItems(または removeMediaSources)を使用できます。または、remove(または removeMediaSource)を呼び出して、メディア アイテムを個別に削除することもできます。
preloadManager.removeMediaItems(mediaItemsToRemove)
コードに関する主なポイント
- プリロード マネージャーからすべてのアイテムを削除する場合は、
remove()の代わりにreset()を呼び出します。この方法は、カルーセル内のすべてのアイテムを変更する必要がある場合に便利です。その場合、アイテムを削除した後、プリロード マネージャーに新しいアイテムを追加する必要があります。
プリロード マネージャーの使用が終了したら解放する
プリロード マネージャーが不要になったら、プリロード マネージャーを解放してリソースを解放する必要があります。特に、アクティビティが破棄されたときに、必ず解放するようにしてください。
preloadManager.release()
コードに関する主なポイント
- オブジェクトを解放した後は、オブジェクトのメソッドを呼び出してはなりません。
- 別のプリロード マネージャーを作成する必要がある場合は、新しい
DefaultPreloadManager.Builderを作成し、それを使用してDefaultPreloadManagerを作成します。古いビルダーを再利用しようとしないでください。