管理和播放内容

本页介绍了如何使用预加载管理器来管理视频内容。通过使用预加载管理器,您可以为用户提供更好的体验;当用户从一个媒体项切换到另一个媒体项时,播放会更快开始,因为管理器已加载部分内容。

本页包含以下主题:

将媒体内容添加到预加载管理器

您必须告知预加载管理器它将跟踪的每个媒体项。 例如,如果您的应用包含视频轮播界面,您需要将这些视频添加到预加载管理器。根据您的使用情形,您可以添加所有视频,也可以只添加当前正在播放的视频附近的视频。您也可以稍后向预加载管理器添加新商品。

为此,请使用批量添加方法,例如 addMediaItems。或者,您也可以调用 add(或 addMediaSource)来逐个添加媒体项。不过,单独添加媒体项不会自动触发预加载。使用各个方法时,您必须在添加完项后显式调用 invalidate,以告知预加载管理器更新优先级并开始预加载。

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

代码要点

  • 此代码段展示了如何在创建预加载管理器后以批量模式初始填充该管理器。您可以调用 addMediaItems 将项添加到已填充的现有预加载管理器。
  • 在此代码段中,pullMediaItemsFromService() 是用于获取要播放的内容列表的应用逻辑。该代码会调用相应方法来提取最多 20 项的列表。
  • preloadManager 是在创建 DefaultPreloadManager 中创建的 DefaultPreloadManager
  • rankingData 是预加载管理器用于确定每个媒体项优先级的数值。对于 DefaultPreloadManagerrankingData 是一个整数,表示相应媒体项在轮播界面中的位置。预加载管理器会根据每个媒体项与当前正在播放的媒体项之间的距离来确定优先级。

提取和播放媒体

当用户前进到新的媒体项时,您需要从预加载管理器中获取该媒体项。如果预加载管理器已加载任何内容,则内容播放速度会比您未使用预加载管理器时更快。如果预加载管理器尚未从相应项加载内容,则内容会正常播放。

您还需要通过调用 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()。如果您需要更改轮播界面中的所有商品,此方法非常有用。在这种情况下,移除项后,您需要向预加载管理器添加新项

在不再需要预加载管理器时释放它

如果您不再需要预加载管理器,则必须释放它以释放其资源。尤其要确保在 activity 被销毁时释放该对象。

preloadManager.release()

代码要点

  • 释放对象后,您不得调用该对象的任何方法。
  • 如果您需要创建其他预加载管理器,请创建一个新的 DefaultPreloadManager.Builder,并使用该 DefaultPreloadManager.Builder 创建 DefaultPreloadManager。请勿尝试重复使用旧的构建器。