Fontes de mídia

No ExoPlayer, cada mídia é representada por uma MediaItem. No entanto, Internamente, o player precisa de instâncias de MediaSource para reproduzir o conteúdo. A o player cria esses itens a partir de 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:

A DefaultMediaSourceFactory também pode criar fontes de mídia mais complexas, dependendo nas propriedades dos itens de mídia correspondentes. Isso é descrito em mais detalhes sobre Página de itens de mídia.

Para apps que precisam de configurações de origem de mídia que não têm suporte das configuração padrão do player, há várias opções para e 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 a armazenamento em cache, uma instância de DefaultMediaSourceFactory pode ser configurada para corresponder esses requisitos e injetados 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();

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

Também é possível injetar uma implementação de MediaSource.Factory personalizada, para exemplo para oferecer suporte à criação de um tipo de origem de mídia personalizada. A fábrica createMediaSource(MediaItem) será chamado para criar uma fonte de mídia para cada que é um 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. Com isso, é possível ignorar MediaSource.Factory interno do player e transmitir instâncias de origem de mídia para o player de vídeo diretamente:

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 fornece várias implementações de MediaSource para modificar e compor outras instâncias MediaSource. Eles são mais úteis nos casos em que há vários personalizações precisam ser combinadas, e nenhum dos caminhos de configuração mais simples é suficientes.

  • ClippingMediaSource: permite cortar a 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, expor a faixa de vídeo de um arquivo que contém 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 reproduzir em paralelo. Em em quase todos os casos, é aconselhável chamar o construtor com adjustPeriodTimeOffsets e clipDurations definidos como verdadeiros para garantir que todos as fontes começam e terminam ao mesmo tempo. Se a modificação for feita para adicionar e legendas com sideload, é preferível usar MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2: mescla várias fontes de mídia para reproduzir. consecutivamente. A estrutura de mídia visível ao usuário expõe um único Timeline.Window, o que significa que ele parece um único item. Se esse a modificação é realizada para reproduzir vários itens que não deveriam parecer é preferível usar os métodos da API Playlist, como Player.addMediaItem.
  • SilenceMediaSource: gera silêncio por uma duração especificada que é úteis para preencher lacunas.
  • AdsMediaSource: estende uma origem de mídia com a inserção de anúncios do lado do cliente recursos. Consulte o guia de inserção de anúncios para mais detalhes.
  • ServerSideAdInsertionMediaSource: estende uma fonte de mídia com um anúncio do lado do servidor recursos de inserção. Consulte o guia de inserção de anúncios para mais detalhes.