Создайте и настройте DefaultPreloadManager

На этой странице описывается, как создать 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 . Этот конструктор настроен на основе текущего контекста и целевого элемента управления состоянием предварительной загрузки приложения. Конструктор также предоставляет методы-сеттеры, которые можно использовать для настройки пользовательских компонентов менеджера предварительной загрузки.

Помимо использования конструктора для создания менеджера предварительной загрузки, вы также будете использовать его для создания объектов ExoPlayer , которые ваше приложение использует для воспроизведения контента.

val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()

Ключевые моменты кода