Управление и воспроизведение контента

На этой странице описано, как использовать менеджер предварительной загрузки для управления видеоконтентом. Использование менеджера предварительной загрузки позволяет обеспечить пользователю более удобное взаимодействие: при переключении с одного медиафайла на другой воспроизведение начинается быстрее, поскольку менеджер уже загрузил часть контента.

На этой странице рассматриваются следующие темы:

Добавьте медиафайлы в менеджер предварительной загрузки.

Необходимо сообщить менеджеру предварительной загрузки о каждом медиафайле, который он будет отслеживать. Например, если в вашем приложении есть карусель видеороликов, вы должны добавить эти видео в менеджер предварительной загрузки. В зависимости от вашего сценария использования, вы можете добавить все видео или только все видео, расположенные рядом с воспроизводимым в данный момент видео. Вы также можете добавлять новые элементы в менеджер предварительной загрузки позже.

Добавление медиафайлов само по себе не приводит к запуску предварительной загрузки контента менеджером. Для запуска предварительной загрузки необходимо изменить приоритеты в менеджере предварительной загрузки .

val initialMediaItems = pullMediaItemsFromService(count = 20)
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems[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 — это Media3 ExoPlayer который приложение использует для воспроизведения контента. Вам необходимо создать этот плеер, вызвав метод DefaultPreloadManager.Builder.buildExoPlayer() в том же построителе, который вы использовали для создания менеджера предварительной загрузки.
  • Когда пользователь переключается на новый медиафайл, приложение вызывает getMediaSource() для получения источника медиафайлов из менеджера предварительной загрузки. Это должен быть mediaItem вы уже добавили в менеджер предварительной загрузки . Ничего страшного, если менеджер предварительной загрузки еще не начал загрузку контента; в этом случае он возвращает MediaSource , в котором отсутствуют предварительно загруженные данные. Например, это может произойти, если пользователь внезапно перескочит далеко вперед в карусели.
  • После того, как пользователь воспроизведет новый медиафайл, вызовите setCurrentPlayingIndex чтобы сообщить менеджеру предварительной загрузки, где в карусели находится новый элемент. Менеджеру предварительной загрузки эта информация необходима для определения приоритета загрузки следующего элемента. После обновления текущего индекса вызовите метод invalidate() , чтобы менеджер предварительной загрузки переопределил приоритет для каждого элемента.

Удалите элементы из менеджера предварительной загрузки.

Для обеспечения эффективности менеджера предварительной загрузки следует удалять элементы, которые ему больше не нужно отслеживать. Также можно удалять элементы, которые всё ещё находятся в карусели, но находятся далеко от текущего положения пользователя. Например, можно решить, что если элемент находится на расстоянии более 15 элементов от того, что просматривает пользователь, его не нужно предварительно загружать. В этом случае следует удалять элементы, когда они окажутся на таком расстоянии. Если пользователь вернётся к удалённым элементам, их всегда можно добавить обратно .

preloadManager.remove(mediaItem)

Основные моменты, касающиеся кода.

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

Когда менеджер предварительной загрузки больше не нужен, необходимо освободить его ресурсы. В частности, обязательно освободите его при уничтожении вашей активности.

preloadManager.release()

Основные моменты, касающиеся кода.

  • После освобождения объекта его нельзя вызывать никакие его методы.
  • Если вам нужно создать ещё один менеджер предварительной загрузки, создайте новый объект DefaultPreloadManager.Builder и используйте его для создания DefaultPreloadManager . Не пытайтесь повторно использовать старый построитель.