Fontes de mídia

No ExoPlayer, cada mídia é representada por um MediaItem. No entanto, internamente, o player precisa de instâncias de MediaSource para abrir o conteúdo. O reprodutor cria esses 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 conteúdo MediaSource:

A 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 origem de mídia que não são compatíveis com a configuração padrão do player, há várias opções de personalização.

Personalizar a criação de fontes 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 poderá ser configurada para corresponder a esses requisitos e ser injetada durante a construção do player:

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 DefaultMediaSourceFactory JavaDoc descreve as opções disponíveis com mais detalhes.

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

API de playlist baseada na 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 permite ignorar o MediaSource.Factory interno do player e transmitir instâncias de fonte de mídia diretamente para o 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, é preferível usar parâmetros de seleção de faixa.
  • MergingMediaSource: mescla várias origens de mídia para reprodução em paralelo. Em quase todos os casos, é recomendá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 para o usuário expõe um único Timeline.Window, ou seja, parece um único item. Se essa modificação for feita para reproduzir vários itens que não deveriam parecer apenas um, é preferível usar os métodos da API de playlist, como Player.addMediaItem.
  • SilenceMediaSource: gera silêncio por um período especificado, o que é útil para preencher lacunas.
  • AdsMediaSource: estende uma origem 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 no servidor. Consulte o guia de inserção de anúncios para mais detalhes.