No ExoPlayer, cada mídia é representada por um MediaItem. No entanto,
internamente, o player precisa de instâncias de 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 MediaSource de conteúdo:
DashMediaSourcepara DASH.SsMediaSourcepara SmoothStreaming.HlsMediaSourcepara HLS.ProgressiveMediaSourcepara arquivos de mídia comuns.RtspMediaSourcepara RTSP.
O 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 fonte de mídia não compatí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 atender
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 DefaultMediaSourceFactory
descreve as opções disponíveis em mais detalhes.
Também é possível injetar uma implementação personalizada de MediaSource.Factory, por
exemplo, para oferecer suporte à criação de um tipo de fonte de mídia personalizada. O createMediaSource(MediaItem) da fábrica será chamado 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 possibilita 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 nos casos em que 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 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, 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. Na maioria dos casos, é recomendável chamar o construtor comadjustPeriodTimeOffsetseclipDurationsdefinidos como verdadeiros para garantir que todas as fontes comecem e terminem ao mesmo tempo. Se essa modificação for feita para adicionar legendas de sideload, é 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, o que significa que ele se parece com um único item. Se essa modificação for feita para reproduzir vários itens que não devem parecer um único, é 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.