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:
DashMediaSource
para DASH.SsMediaSource
para SmoothStreaming.HlsMediaSource
para HLS.ProgressiveMediaSource
para arquivos de mídia normais.RtspMediaSource
para 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 "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 usarMediaItem.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 comadjustPeriodTimeOffsets
eclipDurations
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 usarMediaItem.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 únicaTimeline.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, comoPlayer.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.