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 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 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 você usará para criar o gerenciador de pré-carregamento e os objetos ExoPlayer do 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 MyTargetPreloadStatusControl para o builder do gerenciador de pré-carregamento ao criá-lo.
  • currentPlayingIndex conté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 getTargetPreloadStatus e transmitir 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 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