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