Criar e configurar um DefaultPreloadManager

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 baseados na classe abstrata BasePreloadManager permitem classificar o conteúdo pelos critérios que você escolher. 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 deles ao item que o usuário está reproduzindo. Assim, se um usuário passar para outro item, ele poderá começar a ser reproduzido imediatamente.

Há três etapas para criar uma instância de DefaultPreloadManager:

  • Defina um TargetPreloadStatusControl que 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 será usado para criar o gerenciador de pré-carregamento e os objetos ExoPlayer do 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 objeto controle de status de pré-carregamento de destino que você define. Esse objeto implementa a interface TargetPreloadStatusControl. Quando o gerenciador de pré-carregamento está se preparando para pré-carregar mídia, ele chama 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 deve começar a carregar o conteúdo.
  • STAGE_SOURCE_PREPARED: o gerenciador de pré-carregamento precisa preparar a fonte de 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 deve carregar conteúdo nem metadados 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 os 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): carregue 3.000 ms (3 segundos) da posição inicial padrão.
  • Índice n-1 (o item de mídia anterior): carregue 1.000 ms (1 segundo) da posição inicial padrão.
  • Outros itens de mídia no intervalo n-2 a n+2: retorno PreloadStatus.TRACKS_SELECTED
  • Outros itens de mídia no intervalo n-4 a n+4: Retornar PreloadStatus.SOURCE_PREPARED
  • Para todos os outros itens de mídia, retorne null.
class MyTargetPreloadStatusControl(
  currentPlayingIndex: Int = C.INDEX_UNSET
): 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.TRACKS_SELECTED
    } else if (abs(index - currentPlayingIndex) <= 4) {
      // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
      return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
    }
    return null
  }
}

Pontos principais sobre o código

  • Você vai transmitir uma instância de MyTargetPreloadStatusControl ao builder do gerenciador de pré-carregamento ao criá-lo.
  • currentPlayingIndex contém o índice do item de mídia que está sendo reproduzido no momento. É responsabilidade do app manter esse valor atualizado.
  • Quando o gerenciador de pré-carregamento está pronto para carregar conteúdo, ele chama getTargetPreloadStatus e transmite as informações de classificação especificadas para o item de mídia correspondente. No caso de DefaultPreloadManager, 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 seu 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 objetos ExoPlayer que o 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 que você definiu em Criar um controle de status de pré-carregamento de destino.
  • Você vai usar o mesmo DefaultPreloadManager.Builder para criar os objetos ExoPlayer que vão reproduzir o conteúdo gerenciado por esse gerenciador de pré-carregamento.