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:
DashMediaSourcepara DASH.SsMediaSourcepara SmoothStreaming.HlsMediaSourcepara HLS.ProgressiveMediaSourcepara arquivos de mídia comuns.RtspMediaSourcepara RTSP.
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 usarMediaItem.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 comadjustPeriodTimeOffsetseclipDurationsdefinidos 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 usarMediaItem.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 únicoTimeline.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, comoPlayer.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.