Esta página descreve como usar um gerenciador de pré-carregamento para gerenciar conteúdo de vídeo. Ao usar um gerenciador de pré-carregamento, você pode oferecer 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
- Liberar o gerenciador de pré-carregamento 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 vídeos próximos ao que está sendo reproduzido. Também é possível adicionar novos itens ao gerenciador de pré-carregamento mais tarde.
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, é necessário invalidar as prioridades no gerenciador de pré-carregamento.
val initialMediaItems = pullMediaItemsFromService(count = 20) for (index in 0 until initialMediaItems.size) { preloadManager.add(initialMediaItems[index], /* rankingData= */ index) } // items aren't actually loaded yet! need to call invalidate() after this
Principais pontos 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 já 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é oDefaultPreloadManagercriado em Criar umDefaultPreloadManager. O código chama o métodoadd()desse gerenciador para adicionar cada item no carrossel.rankingDataé um valor que o gerenciador de pré-carregamento usa 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 pela distância de cada item do item que está sendo reproduzido.
Invalidar as prioridades no gerenciador de pré-carregamento
Para acionar o gerenciador de pré-carregamento para começar a pré-carregar o conteúdo, chame invalidate() para informar ao gerenciador de pré-carregamento que as prioridades dos itens estão desatualizadas. Faça isso nas seguintes situações:
- Ao adicionar novos itens de mídia ao gerenciador de pré-carregamento ou remover itens de mídia.
Se você estiver adicionando ou removendo vários itens, adicione todos eles e chame
invalidate(). - Quando o usuário muda de um item de mídia para outro. Nesse caso, você
deve atualizar 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 criado 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()
Principais pontos sobre o código
- Chamar
invalidate()aciona o gerenciador de pré-carregamento para reavaliar a prioridade de cada item de mídia que ele conhece. Por esse motivo, se você estiver fazendo muitas mudanças no gerenciador de pré-carregamento, termine de fazer as mudanças antes de chamarinvalidate().
Buscar e reproduzir mídia
Quando o usuário avança para um novo item de mídia, é necessário receber o item de mídia do gerenciador de pré-carregamento. Se o gerenciador de pré-carregamento tiver carregado parte do conteúdo, o conteúdo será reproduzido mais rápido do que se você não tivesse usado o gerenciador de pré-carregamento. Se o gerenciador de pré-carregamento ainda não tiver carregado o conteúdo desse item, o conteúdo 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) } else { // If mediaSource is null, that mediaItem hasn't been added to the preload manager // yet. So, send it directly to the player when it's about to play player.setMediaItem(mediaItem) } 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()
Principais pontos sobre o código
playeré o Media3ExoPlayerque o app está usando para reproduzir o conteúdo. É necessário 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 de mídia do gerenciador de pré-carregamento. Esse precisa ser ummediaItemque 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 umMediaSourceque não tem dados pré-carregados. Por exemplo, isso pode acontecer se o usuário pular repentinamente muito à frente no carrossel. - Depois que o usuário reproduzir o novo item de mídia, chame
setCurrentPlayingIndexpara informar ao gerenciador de pré-carregamento onde o novo item está no carrossel. 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 o gerenciador de pré-carregamento eficiente, 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 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 precisará ser pré-carregado. Nesse caso, remova os itens quando eles ficarem tão distantes. Se o usuário voltar para esses itens removidos, você sempre poderá adicioná-los novamente.
preloadManager.remove(mediaItem)
Principais pontos 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 no 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.
Liberar 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 sua atividade for destruída.
preloadManager.release()
Principais pontos 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.Buildere use-o para criar oDefaultPreloadManager. Não tente reutilizar o builder antigo.