本页介绍了如何创建 DefaultPreloadManager
,该对象会根据您选择的策略预加载应用中的媒体内容。
基于 BasePreloadManager
抽象类的预加载管理器可让您根据所选条件对内容进行排名。本文档介绍了如何使用派生类 DefaultPreloadManager
,其中每个媒体项都按整数进行排名,该整数表示相应媒体项在列表中的位置(例如,在视频轮播界面中的位置)。预加载管理器会根据用户当前播放的内容与待加载内容的接近程度,确定加载待加载内容的优先级。这样,如果用户移至另一项内容,新内容可以立即开始播放。
创建 DefaultPreloadManager
实例需要执行以下三个步骤:
- 定义一个预加载管理器可以查询的
TargetPreloadStatusControl
,以了解媒体项是否已准备好加载以及要加载多少。 - 创建构建器,您将使用该构建器创建预加载管理器,并创建应用的
ExoPlayer
对象。 - 使用构建器通过调用构建器的
build()
方法来创建预加载管理器。
创建目标预加载状态控制
创建 DefaultPreloadManager.Builder
时,您将向其传递您定义的目标预加载状态控制对象。此对象实现了 TargetPreloadStatusControl
接口。当预加载管理器准备预加载媒体时,它会调用状态控制器的 getTargetPreloadStatus()
方法来确定要加载多少内容。状态控制可以回复以下状态代码之一:
STAGE_SPECIFIED_RANGE_LOADED
:预加载管理器应从指定的开始位置加载内容,并持续指定时长(以毫秒为单位)。STAGE_TRACKS_SELECTED
:预加载管理器应加载并处理内容轨道的信息,然后选择轨道。预加载管理器不应开始加载内容。STAGE_SOURCE_PREPARED
:预加载管理器应准备内容源。例如,如果内容的元数据位于单独的清单文件中,预加载管理器可能会提取并解析该清单。null
:预加载管理器不应加载相应媒体项的任何内容或元数据。
您需要制定策略来决定为每个媒体项加载多少内容。在此示例中,系统会为最接近当前播放项的项加载更多内容。如果用户正在播放索引为 n 的内容,控制器会返回以下代码:
- 索引 n+1(下一个媒体项):从默认起始位置加载 3000 毫秒(3 秒)
- 索引 n-1(上一个媒体项):从默认起始位置加载 1000 毫秒(1 秒)
- 范围为 n-2 到 n+2 的其他媒体项:返回
PreloadStatus.TRACKS_SELECTED
- 范围 n-4 到 n+4 中的其他媒体项:返回
PreloadStatus.SOURCE_PREPARED
- 对于所有其他媒体项,返回
null
class MyTargetPreloadStatusControl(
currentPlayingIndex: Int = C.INDEX_UNSET
): TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> {
override fun getTargetPreloadStatus(index: Int):
DefaultPreloadManager.PreloadStatus? {
if (index - currentPlayingIndex == 1) { // next track
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED
// and suggest loading 3000ms from the default start position
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
} else if (index - currentPlayingIndex == -1) { // previous track
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED
// and suggest loading 3000ms from the default start position
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
} else if (abs(index - currentPlayingIndex) == 2) {
// return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED
return DefaultPreloadManager.PreloadStatus.TRACKS_SELECTED
} else if (abs(index - currentPlayingIndex) <= 4) {
// return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
}
return null
}
}
代码要点
- 创建预加载管理器构建器时,您将向其传递
MyTargetPreloadStatusControl
的实例。 currentPlayingIndex
用于存储当前正在播放的媒体内容的索引。应用的职责是确保该值保持最新状态。- 当预加载管理器准备好加载内容时,它会调用
getTargetPreloadStatus
并传递您为相应媒体项指定的排名信息。对于DefaultPreloadManager
,相应排名信息是一个整数,用于指定商品在轮播界面中的位置。该方法通过将该索引与当前所选商品的索引进行比较,来选择要返回的代码。
创建预加载管理器
如需创建预加载管理器,您需要 DefaultPreloadManager.Builder
。
该构建器配置了当前上下文和应用的目标预加载状态控制。构建工具还提供 setter 方法,您可以使用这些方法来设置预加载管理器的自定义组件。
除了使用构建器创建预加载管理器之外,您还可以使用它来创建应用用于播放内容的 ExoPlayer
对象。
val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()
代码要点
MyTargetPreloadStatusControl
是您在创建目标预加载状态控制中定义的类。- 您将使用相同的
DefaultPreloadManager.Builder
来创建ExoPlayer
对象,这些对象将播放由该预加载管理器管理的内容。