Как управлять контентом и воспроизводить его

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

В этой статье рассматриваются следующие темы:

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

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

Для этого используйте метод пакетного добавления, например addMediaItems (или addMediaSources). Вы также можете вызвать 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 – это ExoPlayer Media3, который приложение использует для воспроизведения контента. Для этого вызовите метод DefaultPreloadManager.Builder.buildExoPlayer() в том же построителе, который вы использовали для создания менеджера предзагрузки.
  • Когда пользователь переключается на новый мультимедийный объект, приложение вызывает getMediaSource(), чтобы получить источник мультимедиа от менеджера предварительной загрузки. Это должен быть mediaItem, который вы уже добавили в менеджер предзагрузки. Если менеджер предзагрузки ещё не начал загружать контент, он возвращает объект MediaSource без предзагруженных данных. Например, это может произойти, если пользователь внезапно перейдет далеко вперед по карусели.
  • После того как пользователь воспроизведет новый мультимедийный объект, вызовите setCurrentPlayingIndex, чтобы сообщить менеджеру предварительной загрузки, где в карусели находится новый объект. Менеджеру предварительной загрузки нужна эта информация, чтобы определить приоритет загрузки следующего объекта.

Как удалить объекты из менеджера предзагрузки

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

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

preloadManager.removeMediaItems(mediaItemsToRemove)

Важные сведения о коде

  • Если вы хотите удалить все объекты из менеджера предзагрузки, вызовите reset() вместо remove(). Этот подход полезен, если вам нужно изменить все элементы в карусели. В этом случае после удаления объектов вам нужно будет добавить новые объекты в менеджер предзагрузки.

Освободите менеджер предварительной загрузки, когда он больше не нужен

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

preloadManager.release()

Важные сведения о коде

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