Nesta página, descrevemos como usar um gerenciador de pré-carregamento para gerenciar conteúdo de vídeo. Ao usar um gerenciador de pré-carregamento, você oferece uma experiência melhor ao usuário. Quando ele muda de um item de mídia para outro, a reprodução começa mais rápido porque o gerenciador já carregou parte do conteúdo.
Nesta página, abordamos os seguintes tópicos:
- Adicionar itens de mídia ao gerenciador de pré-carregamento
- Invalidar as prioridades no gerenciador de pré-carregamento
- Buscar e reproduzir mídia
- Remover itens do gerenciador de pré-carregamento
- Libere o gerenciador de pré-carga quando terminar de usá-lo
Adicionar itens de mídia ao gerenciador de pré-carregamento
Você precisa informar ao gerenciador de pré-carregamento sobre cada item de mídia que ele vai rastrear. Por exemplo, se o app tiver um carrossel de vídeos, adicione esses vídeos ao gerenciador de pré-carregamento. Dependendo do seu caso de uso, você pode adicionar todos os vídeos ou apenas os que estão perto do vídeo em reprodução. Você também pode adicionar novos itens ao gerenciador de pré-carregamento depois.
A adição dos itens de mídia não faz com que o gerenciador de pré-carregamento comece a carregar o conteúdo. Para acionar o pré-carregamento, invalide as prioridades no gerenciador de pré-carregamento.
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
Pontos principais sobre o código
- Este snippet mostra como preencher inicialmente o gerenciador de pré-carregamento depois de
criá-lo. Você também pode chamar
add()
para adicionar itens a um gerenciador de pré-carregamento preenchido. - Neste snippet,
pullMediaItemsFromService()
é a lógica do app para buscar a lista de conteúdo a ser reproduzido. O código chama esse método para buscar uma lista de até 20 itens. preloadManager
é oDefaultPreloadManager
criado em Criar umDefaultPreloadManager
. O código chama o métodoadd()
desse gerenciador para adicionar cada item no carrossel.rankingData
é um valor usado pelo gerenciador de pré-carregamento para determinar a prioridade de cada item de mídia. ParaDefaultPreloadManager
,rankingData
é um número inteiro que representa a posição do item no carrossel. O gerenciador de pré-carregamento determina a prioridade com base na distância de cada item em relação ao que está sendo reproduzido no momento.
Invalidar as prioridades no gerenciador de pré-carregamento
Para acionar o gerenciador de pré-carregamento e iniciar o pré-carregamento de conteúdo, chame
invalidate()
para informar ao gerenciador que as prioridades dos itens estão desatualizadas. Faça isso nas seguintes situações:
- Quando você adiciona ou remove itens de mídia do gerenciador de pré-carregamento.
Se você estiver adicionando ou removendo vários itens, adicione todos eles e depois chame
invalidate()
. - Quando o usuário muda de um item de mídia para outro. Nesse caso, atualize o índice de reprodução atual antes de chamar
invalidate()
, conforme descrito em Buscar e reproduzir conteúdo.
Quando você invalida o gerenciador de pré-carregamento, ele chama o
TargetPreloadStatusControl
que você criou para descobrir quanto conteúdo
ele precisa carregar de cada item. Em seguida, ele carrega o conteúdo de cada item na ordem de prioridade, de alta para baixa.
preloadManager.invalidate()
Pontos principais sobre o código
- Chamar
invalidate()
faz com que o gerenciador de pré-carregamento reavalie a prioridade de cada item de mídia que ele conhece. Por isso, se você estiver fazendo muitas mudanças no gerenciador de pré-carregamento, termine de fazer as alterações antes de chamarinvalidate()
.
Buscar e abrir mídia
Quando o usuário avança para um novo item de mídia, é necessário extrair o item do gerenciador de pré-carregamento. Se o gerenciador de pré-carregamento tiver carregado algum conteúdo, ele será reproduzido mais rápido do que se você não tivesse usado o gerenciador. Se o gerenciador de pré-carregamento ainda não tiver carregado o conteúdo desse item, ele será reproduzido normalmente.
// 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()
Pontos principais sobre o código
player
é oExoPlayer
do Media3 que o app está usando para reproduzir o conteúdo. Você precisa criar esse player chamandoDefaultPreloadManager.Builder.buildExoPlayer()
no mesmo builder usado para criar o gerenciador de pré-carregamento.- Quando o usuário muda para um novo item de mídia, o app chama
getMediaSource()
para receber a origem da mídia do gerenciador de pré-carregamento. Precisa ser ummediaItem
que você já adicionou ao gerenciador de pré-carregamento. Não há problema se o gerenciador de pré-carregamento ainda não tiver começado a carregar o conteúdo. Nesse caso, ele retorna umMediaSource
sem dados pré-carregados. Por exemplo, isso pode acontecer se o usuário pular de repente para muito à frente no carrossel. - Depois que o usuário reproduzir o novo item de mídia, chame
setCurrentPlayingIndex
para informar ao gerenciador de pré-carregamento em que parte do carrossel o novo item está. O gerenciador de pré-carregamento precisa dessas informações para priorizar o carregamento do próximo item. Depois de atualizar o índice atual, chameinvalidate()
para que o gerenciador de pré-carregamento determine novamente a prioridade de cada item.
Remover itens do gerenciador de pré-carregamento
Para manter a eficiência do gerenciador de pré-carregamento, remova os itens que ele não precisa mais rastrear. Você também pode remover itens que ainda estão no carrossel, mas estão muito longe da posição atual do usuário. Por exemplo, você pode decidir que, se um item estiver a mais de 15 itens de distância do que o usuário está assistindo, ele não precisa ser pré-carregado. Nesse caso, você removeria os itens quando eles ficassem muito distantes. Se o usuário voltar a se aproximar dos itens removidos, você sempre poderá adicioná-los novamente.
preloadManager.remove(mediaItem)
Pontos principais sobre o código
- Se você quiser remover todos os itens do gerenciador de pré-carregamento, chame
reset()
em vez deremove()
. Essa abordagem é útil se você precisar mudar todos os itens do carrossel. Nesse caso, depois de remover os itens, adicione novos itens ao gerenciador de pré-carregamento e invalide as prioridades no gerenciador de pré-carregamento.
Libere o gerenciador de pré-carregamento quando terminar de usá-lo
Quando você não precisar mais do gerenciador de pré-carregamento, libere-o para liberar os recursos. Em particular, libere-o quando a atividade for destruída.
preloadManager.release()
Pontos principais sobre o código
- Você não pode chamar nenhum dos métodos do objeto depois de liberá-lo.
- Se você precisar criar outro gerenciador de pré-carregamento, crie um novo
DefaultPreloadManager.Builder
e use-o para criar oDefaultPreloadManager
. Não tente reutilizar o builder antigo.