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
:
DashMediaSource
para DASH.SsMediaSource
para SmoothStreaming.HlsMediaSource
para HLS.ProgressiveMediaSource
para arquivos de mídia comuns.RtspMediaSource
para RTSP.
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 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, é 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 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 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 deveriam parecer apenas um, é preferível usar os métodos da API de playlist, comoPlayer.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.