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

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

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

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

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

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

val initialMediaItems = pullMediaItemsFromService(/* count= */ 20);
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems.get(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)
}
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 . Не пытайтесь повторно использовать старый менеджер.