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

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

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

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

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

To do this, use a batch addition method like addMediaItems . Alternatively, you can call add (or addMediaSource ) to add media items individually. However, adding media items individually does not automatically trigger preloading. When using individual methods, you must explicitly call invalidate once you're done adding items to tell the preload manager to update priorities and start preloading.

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() в том же построителе, который вы использовали для создания менеджера предварительной загрузки.
  • When the user switches to a new media item, the app calls getMediaSource() to get the media source from the preload manager. This must be a mediaItem you have already added to the preload manager . It's okay if the preload manager hasn't already started loading the content; in that case, it returns a MediaSource that doesn't have preloaded data. For example, this might happen if the user suddenly jumps far ahead in the carousel.
  • После того, как пользователь воспроизведет новый медиафайл, вызовите setCurrentPlayingIndex , чтобы сообщить менеджеру предварительной загрузки, где в карусели находится новый элемент. Менеджеру предварительной загрузки эта информация необходима для определения приоритета загрузки следующего элемента.

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

To keep the preload manager efficient, you should remove items the preload manager no longer needs to track. You might also remove items that are still in the carousel, but are far away from the user's current position. For example, you might decide that if an item is more than 15 items away from what the user is watching, it doesn't need to be preloaded. In that case, you'd remove items when they got that far away. If the user moves back towards those removed items, you can always add them back .

Если у вас есть список медиафайлов для удаления, вы можете использовать removeMediaItems . В качестве альтернативы вы можете вызвать remove (или removeMediaSource ), чтобы удалить медиафайлы по отдельности.

preloadManager.removeMediaItems(mediaItemsToRemove)

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

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

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

preloadManager.release()

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

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