На этой странице описано, как создать 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.PRELOAD_STATUS_TRACKS_SELECTED } else if (abs(index - currentPlayingIndex) <= 4) { // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED } return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED } }
Основные моменты, касающиеся кода.
- При создании объекта
MyTargetPreloadStatusControlв построитель менеджера предварительной загрузки будет передан экземпляр этого объекта. -
currentPlayingIndexсодержит индекс текущего воспроизводимого медиафайла. Задача приложения — поддерживать это значение в актуальном состоянии. - Когда менеджер предварительной загрузки готов к загрузке контента, он вызывает метод
getTargetPreloadStatusи передает информацию о ранжировании, указанную вами для соответствующего медиафайла. В случаеDefaultPreloadManagerэта информация о ранжировании представляет собой целое число, указывающее позицию элемента в карусели. Метод выбирает, какой код вернуть, сравнивая этот индекс с индексом элемента, который в данный момент выбран.
Создайте менеджер предварительной загрузки.
Для создания менеджера предварительной загрузки вам потребуется DefaultPreloadManager.Builder . Этот построитель настраивается с учетом текущего контекста и целевого состояния предварительной загрузки приложения. Построитель также предоставляет методы-сеттеры, которые можно использовать для установки пользовательских компонентов менеджера предварительной загрузки.
Помимо использования конструктора для создания менеджера предварительной загрузки, вы также будете использовать его для создания объектов ExoPlayer , которые ваше приложение использует для воспроизведения контента.
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) val preloadManager = preloadManagerBuilder.build()
Основные моменты, касающиеся кода.
-
MyTargetPreloadStatusControl— это класс, который вы определили в разделе «Создание элемента управления состоянием предварительной загрузки целевого объекта» . - Для создания объектов
ExoPlayer, которые будут воспроизводить контент, управляемый этим менеджером предварительной загрузки, вы будете использовать тот жеDefaultPreloadManager.Builder