Esta página descreve como criar um DefaultPreloadManager, que pré-carrega
conteúdo de mídia para seu app com base na estratégia escolhida.
Os gerenciadores de pré-carregamento com base na classe abstrata BasePreloadManager permitem
classificar o conteúdo pelos critérios escolhidos. Este documento explica como usar a classe derivada DefaultPreloadManager, em que cada item de mídia é classificado com um número inteiro que representa a localização dele em uma lista (por exemplo, a posição em um carrossel de vídeos). O gerenciador de pré-carregamento prioriza o carregamento dos itens com base na proximidade do item que o usuário está reproduzindo. Dessa forma, se um usuário passar para outro item, o novo item poderá começar a ser reproduzido imediatamente.
Há três etapas para criar uma instância de DefaultPreloadManager:
- Defina um
TargetPreloadStatusControlque o gerenciador de pré-carregamento possa consultar para saber se o item de mídia está pronto para ser carregado e quanto carregar. - Crie o builder que você usará para criar o gerenciador de pré-carregamento e
os objetos
ExoPlayerdo seu app. - Use o builder para criar o gerenciador de pré-carregamento chamando o método
build()do builder.
Criar um controle de status de pré-carregamento de destino
Ao criar o DefaultPreloadManager.Builder, você vai transmitir um
controle de status de pré-carregamento de destino objeto que você define. Esse objeto implementa
a TargetPreloadStatusControl interface. Quando o gerenciador de pré-carregamento estiver
se preparando para pré-carregar a mídia, ele vai chamar o método
getTargetPreloadStatus() do controle de status para descobrir quanto conteúdo carregar. O controle de status pode responder com um destes códigos de status:
STAGE_SPECIFIED_RANGE_LOADED: o gerenciador de pré-carregamento precisa carregar o conteúdo da posição inicial especificada e pela duração especificada (em milissegundos).STAGE_TRACKS_SELECTED: o gerenciador de pré-carregamento precisa carregar e processar as informações da faixa de conteúdo e selecionar as faixas. O gerenciador de pré-carregamento ainda não pode começar a carregar o conteúdo.STAGE_SOURCE_PREPARED: o gerenciador de pré-carregamento precisa preparar a origem do conteúdo. Por exemplo, se os metadados do conteúdo estiverem em um arquivo de manifesto separado, o gerenciador de pré-carregamento poderá buscar e analisar esse manifesto.null: o gerenciador de pré-carregamento não pode carregar nenhum conteúdo ou metadado para esse item de mídia.
Você precisa ter uma estratégia para decidir quanto conteúdo carregar para cada item de mídia. Neste exemplo, mais conteúdo é carregado para itens mais próximos do item que está sendo reproduzido. Se o usuário estiver reproduzindo conteúdo com o índice n, o controlador vai retornar os seguintes códigos:
- Índice n+1 (o próximo item de mídia): carregar 3.000 ms (3 segundos) da posição inicial padrão
- Índice n-1 (o item de mídia anterior): carregar 1.000 ms (1 segundo) da posição inicial padrão
- Outros itens de mídia no intervalo n-2 a n+2: retorne
PreloadStatus.TRACKS_SELECTED - Outros itens de mídia no intervalo n-4 a n+4: retorne
PreloadStatus.SOURCE_PREPARED - Para todos os outros itens de mídia, retorne
null
class MyTargetPreloadStatusControl(var currentPlayingIndex: Int = 0) : TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> { override fun getTargetPreloadStatus(index: Int): DefaultPreloadManager.PreloadStatus { if (index - currentPlayingIndex == 1) { // next track // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and // suggest loading 3000ms from the default start position return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L) } else if (index - currentPlayingIndex == -1) { // previous track // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and // suggest loading 3000ms from the default start position return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L) } else if (abs(index - currentPlayingIndex) == 2) { // return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_TRACKS_SELECTED } else if (abs(index - currentPlayingIndex) <= 4) { // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED } return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED } }
Pontos principais sobre o código
- Você vai transmitir uma instância de
MyTargetPreloadStatusControlpara o builder do gerenciador de pré-carregamento ao criá-lo. currentPlayingIndexcontém o índice de qualquer item de mídia que esteja sendo reproduzido. É trabalho do app manter esse valor atualizado.- Quando o gerenciador de pré-carregamento estiver pronto para carregar o conteúdo, ele vai chamar
getTargetPreloadStatuse transmitir as informações de classificação especificadas para o item de mídia correspondente. No caso deDefaultPreloadManager, essas informações de classificação são um número inteiro, especificando a posição do item em um carrossel. O método escolhe qual código retornar comparando esse índice com o índice do item selecionado no momento.
Criar o gerenciador de pré-carregamento
Para criar o gerenciador de pré-carregamento, você precisa de um DefaultPreloadManager.Builder.
Esse builder é configurado com o contexto atual e o controle de status de pré-carregamento de destino do app. O builder também fornece métodos setter que podem ser usados para definir os componentes personalizados do gerenciador de pré-carregamento.
Além de usar o builder para criar o gerenciador de pré-carregamento, você também o usará para
criar os ExoPlayer objetos que seu app usa para reproduzir o conteúdo.
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) val preloadManager = preloadManagerBuilder.build()
Pontos principais sobre o código
MyTargetPreloadStatusControlé a classe definida em Criar um controle de status de pré-carregamento de destino.- Você vai usar o mesmo
DefaultPreloadManager.Builderpara criar os objetosExoPlayerque vão reproduzir o conteúdo gerenciado por esse gerenciador de pré-carregamento.