На этой странице рассказывается, как управлять видеоконтентом с помощью менеджера предзагрузки. Менеджер предварительной загрузки позволяет повысить удобство использования: когда пользователь переключается с одного медиаконтента на другой, воспроизведение начинается быстрее, поскольку менеджер уже загрузил часть контента.
На этой странице рассказывается следующее:
- Как добавить медиаобъекты в менеджер предзагрузки
- Как получать и воспроизводить медиаконтент
- Как удалить объекты из менеджера предзагрузки
- Как закрыть менеджер предзагрузки
Как добавить медиаконтент в менеджер предзагрузки
Вам нужно сообщить менеджеру предзагрузки о каждом медиаобъекте, который он будет отслеживать. Например, если в приложении есть карусель видео, добавьте их в менеджер предварительной загрузки. В зависимости от того, как вы хотите использовать функцию, вы можете добавить все видео или только те, которые находятся рядом с текущим. Вы также можете добавить новые объекты в менеджер предзагрузки позже.
Для этого используйте пакетный метод добавления, например 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– это Media3ExoPlayer, которое приложение использует для воспроизведения контента. Вы должны создать этот проигрыватель, вызвавDefaultPreloadManager.Builder.buildExoPlayer()в том же конструкторе, который использовали для создания менеджера предзагрузки.- Когда пользователь переключается на новый медиаконтент, приложение вызывает
getMediaSource(), чтобы получить источник медиаконтента от менеджера предварительной загрузки. Это должен бытьmediaItem, который вы уже добавили в менеджер предзагрузки. Если менеджер предзагрузки ещё не начал загружать контент, это не страшно. В таком случае он возвращаетMediaSourceбез предзагруженных данных. Например, это может произойти, если пользователь быстро прокрутит карусель. - После того как пользователь воспроизведет новый медиаобъект, вызовите функцию
setCurrentPlayingIndex, чтобы сообщить менеджеру предзагрузки, где в карусели находится новый объект. Менеджеру предзагрузки нужна эта информация, чтобы определить приоритет загрузки следующего объекта.
Как удалить объекты из менеджера предзагрузки
Чтобы менеджер предзагрузки работал эффективно, удалите из него объекты, которые больше не нужно отслеживать. Вы также можете удалить объекты, которые находятся в карусели, но далеко от текущего местоположения пользователя. Например, вы можете решить, что если элемент находится дальше 15 позиций от того, что смотрит пользователь, его не нужно предварительно загружать. В этом случае объекты будут удаляться, когда они окажутся на таком расстоянии. Если пользователь вернется к удаленным элементам, вы всегда сможете добавить их обратно.
Если у вас есть список медиафайлов, которые нужно удалить, вы можете использовать
removeMediaItems. Вы также можете удалить отдельные медиафайлы, позвонив по номеру remove (или removeMediaSource).
preloadManager.removeMediaItems(mediaItemsToRemove)
Ключевые моменты
- Если вы хотите удалить все объекты из менеджера предварительной загрузки, вызовите
reset()вместоremove(). Этот подход полезен, если вам нужно изменить все элементы в карусели. В этом случае после удаления объектов вам нужно будет добавить новые объекты в менеджер предзагрузки.
Как закрыть менеджер предзагрузки
Когда менеджер предварительной загрузки больше не нужен, его необходимо освободить, чтобы освободить его ресурсы. Особенно важно освободить его, когда активность будет уничтожена.
preloadManager.release()
Ключевые моменты
- После этого нельзя вызывать методы объекта.
- Если вам нужно создать ещё один менеджер предзагрузки, создайте новый элемент
DefaultPreloadManager.Builderи используйте его для создания элементаDefaultPreloadManager. Не пытайтесь использовать старый конструктор.