このページでは、プリロード マネージャーを使用して動画コンテンツを管理する方法について説明します。プリロード マネージャーを使用すると、ユーザー エクスペリエンスを向上させることができます。ユーザーがメディア アイテムを切り替えるときに、マネージャーがすでにコンテンツの一部を読み込んでいるため、再生がより速く開始されます。
このページでは、次のトピックについて説明します。
- プリロード マネージャーにメディア アイテムを追加する
- プリロード マネージャーの優先度を無効にする
- メディアを取得して再生する
- プリロード マネージャーからアイテムを削除する
- プリロード マネージャーの使用が終了したら解放する
プリロード マネージャーにメディア アイテムを追加する
プリロード マネージャーに、追跡する各メディア アイテムを通知する必要があります。たとえば、アプリに動画のカルーセルがある場合は、それらの動画をプリロード マネージャーに追加します。ユースケースに応じて、すべての動画を追加することも、現在再生中の動画の近くにあるすべての動画を追加することもできます。プリロード マネージャーには後で新しいアイテムを追加することもできます。
メディア アイテムを追加しても、それ自体ではプリロード マネージャーがコンテンツの読み込みを開始することはありません。プリロードをトリガーするには、プリロード マネージャーの優先度を無効にする必要があります。
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) } else { // If mediaSource is null, that mediaItem hasn't been added to the preload manager // yet. So, send it directly to the player when it's about to play player.setMediaItem(mediaItem) } 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は、アプリがコンテンツの再生に使用している Media3ExoPlayerです。このプレーヤーは、プリロード マネージャーの作成に使用したのと同じビルダーでDefaultPreloadManager.Builder.buildExoPlayer()を呼び出して作成する必要があります。- ユーザーが新しいメディア アイテムに切り替えると、アプリは
getMediaSource()を呼び出して、プリロード マネージャーからメディアソースを取得します。これは、プリロード マネージャーにすでに追加されているmediaItemである必要があります。プリロード マネージャーがまだコンテンツの読み込みを開始していない場合でも問題ありません。その場合、プリロードされたデータのないMediaSourceが返されます。たとえば、ユーザーがカルーセルを大きく先に進めた場合などに発生することがあります。 - ユーザーが新しいメディア アイテムを再生したら、
setCurrentPlayingIndexを呼び出して、新しいアイテムがカルーセルのどこにあるかをプリロード マネージャーに伝えます。プリロード マネージャーが次のアイテムの読み込みを優先するためには、この情報が必要です。現在のインデックスを更新したら、invalidate()を呼び出して、プリロード マネージャーに各アイテムの優先度を再決定させます。
プリロード マネージャーからアイテムを削除する
プリロード マネージャーの効率を維持するため、プリロード マネージャーが追跡する必要がなくなったアイテムを削除してください。カルーセル内に残っているものの、ユーザーの現在位置から遠く離れているアイテムも削除できます。たとえば、ユーザーが視聴しているアイテムから 15 個以上離れているアイテムはプリロードする必要がないと判断できます。その場合は、アイテムがその距離まで離れたときに削除します。ユーザーが削除したアイテムに再び近づいた場合は、いつでもアイテムを元に戻すことができます。
preloadManager.remove(mediaItem)
コードに関する主なポイント
- プリロード マネージャーからすべてのアイテムを削除する場合は、
remove()の代わりにreset()を呼び出すことができます。この方法は、カルーセル内のすべてのアイテムを変更する必要がある場合に便利です。その場合は、アイテムを削除した後、プリロード マネージャーに新しいアイテムを追加し、プリロード マネージャーの優先度を無効化する必要があります。
プリロード マネージャーの使用が終了したら解放する
プリロード マネージャーが不要になった場合は、リソースを解放するためにリリースする必要があります。特に、アクティビティが破棄されたときに必ず解放してください。
preloadManager.release()
preloadManager.release()
コードに関する主なポイント
- オブジェクトを解放した後は、オブジェクトのメソッドを呼び出すことはできません。
- 別のプリロード マネージャーを作成する必要がある場合は、新しい
DefaultPreloadManager.Builderを作成し、それを使用してDefaultPreloadManagerを作成します。古いビルダーを再利用しようとしないでください。