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

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

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

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

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

Для этого используйте метод пакетного добавления, например 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 — это значение, которое менеджер предварительной загрузки использует для определения приоритета каждого медиафайла. Для DefaultPreloadManager rankingData представляет собой целое число, обозначающее позицию элемента в карусели. Менеджер предварительной загрузки определяет приоритет в зависимости от того, насколько далеко каждый элемент находится от элемента, который воспроизводится в данный момент.

Загрузка и воспроизведение медиафайлов

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

Также необходимо обновить текущий индекс воспроизведения в менеджере предварительной загрузки, вызвав 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)

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

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

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

preloadManager.release()

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

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