Fontes de mídia

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

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 de itens de mídia.

Para apps que precisam de configurações de origem de mídia indisponíveis com a configuração padrão do player, há várias opções de personalização.

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

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

API de playlist baseada em fonte 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 origem 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 avançada de fontes de mídia

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

  • ClippingMediaSource: permite cortar a mídia em um intervalo de carimbos 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, expondo apenas 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 fontes de mídia para reprodução em paralelo. Em quase todos os casos, é recomendável chamar o construtor com adjustPeriodTimeOffsets e clipDurations definidos como "true" para garantir que todas as origens comecem e terminem ao mesmo tempo. Se essa modificação for feita para adicionar legendas transferidas por sideload, é preferível usar MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2: mescla várias fontes de mídia para reproduzir consecutivamente. 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 devem parecer um só, é preferível usar os métodos da API de playlist, como Player.addMediaItem.
  • SilenceMediaSource: gera silêncio por uma duração especificada, 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 do lado do servidor. Consulte o guia de inserção de anúncios para mais detalhes.