Fontes de mídia

No ExoPlayer, cada parte da mídia é representada por um MediaItem. No entanto, internamente, o player precisa de instâncias de MediaSource para reproduzir o conteúdo. O player os cria usando itens de mídia usando um MediaSource.Factory.

Por padrão, o player usa um DefaultMediaSourceFactory, que pode criar instâncias das seguintes implementações de MediaSource de conteúdo:

DefaultMediaSourceFactory também pode criar fontes de mídia mais complexas, dependendo das propriedades dos itens de mídia correspondentes. Isso é descrito em mais detalhes na página "Itens de mídia".

Para apps que precisam de configurações de fonte de mídia sem suporte da configuração padrão do player, existem várias opções de personalização.

Como personalizar a criação de origens de mídia

Ao criar o player, um MediaSource.Factory pode ser injetado. Por exemplo, se um app quiser inserir anúncios e usar um CacheDataSource.Factory para oferecer suporte ao armazenamento em cache, uma instância de DefaultMediaSourceFactory pode ser configurada para atender a esses requisitos e injetada durante a construção do jogador:

Kotlin

  val mediaSourceFactory: MediaSource.Factory =
    DefaultMediaSourceFactory(context)
      .setDataSourceFactory(cacheDataSourceFactory)
      .setLocalAdInsertionComponents(adsLoaderProvider, playerView)
  val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()

Java

MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setDataSourceFactory(cacheDataSourceFactory)
        .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);
ExoPlayer player =
    new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();

O JavaDoc DefaultMediaSourceFactory descreve as opções disponíveis em mais detalhes.

Também é possível injetar uma implementação de MediaSource.Factory personalizada, por exemplo, para oferecer suporte à criação de um tipo de origem de mídia personalizada. O createMediaSource(MediaItem) de fábrica vai ser chamado para criar uma fonte de mídia para cada item de mídia adicionado à playlist.

API de playlist baseada em origem de mídia

A interface ExoPlayer define outros métodos de playlist que aceitam fontes de mídia em vez de itens de mídia. Isso possibilita ignorar o MediaSource.Factory interno do player e transmitir as instâncias de origem de mídia diretamente ao player:

Kotlin

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources)
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource)

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))

exoPlayer.prepare()
exoPlayer.play()

Java

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources);
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource);

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));

exoPlayer.prepare();
exoPlayer.play();

Composição da fonte de mídia avançada

O ExoPlayer oferece várias implementações de MediaSource para modificar e compor outras instâncias de MediaSource. Eles são mais úteis nos casos em que várias personalizações precisam ser combinadas e nenhum dos caminhos de configuração mais simples é suficiente.

  • ClippingMediaSource: permite cortar mídia em um intervalo de carimbo de data/hora especificado. Se essa for a única modificação, é preferível usar MediaItem.ClippingConfiguration.
  • FilteringMediaSource: filtra as faixas disponíveis para os tipos especificados, por exemplo, apenas expondo a faixa de vídeo de um arquivo que contém áudio e vídeo. Se essa for a única modificação, é recomendável usar parâmetros de seleção de faixas.
  • MergingMediaSource: mescla várias fontes de mídia para reproduzir em paralelo. Em quase todos os casos, é aconselhável chamar o construtor com adjustPeriodTimeOffsets e clipDurations definidos como verdadeiros para garantir que todas as origens comecem e terminem ao mesmo tempo. Se essa modificação for feita para adicionar legendas carregadas lateralmente, é preferível usar MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2: mescla várias fontes de mídia para reprodução consecutiva. A estrutura de mídia visível ao usuário expõe uma única Timeline.Window, o que significa que ela se parece com um único item. Se essa modificação for feita para reproduzir vários itens que não deveriam se parecer com um único, é preferível usar os métodos da API da playlist, como Player.addMediaItem.
  • SilenceMediaSource: gera silêncio por uma duração especificada que é útil para preencher lacunas.
  • AdsMediaSource: estende uma fonte de mídia com recursos de inserção de anúncios do lado do cliente. Consulte o guia de inserção de anúncios para mais detalhes.
  • ServerSideAdInsertionMediaSource: estende uma fonte de mídia com recursos de inserção de anúncios do lado do servidor. Consulte o guia de inserção de anúncios para mais detalhes.