O ExoPlayer oferece suporte a HLS em vários formatos de contêiner. Os formatos de amostra de áudio e vídeo contidos nele também precisam ser compatíveis. Consulte a seção formatos de amostra para mais detalhes. Incentivamos os produtores de conteúdo HLS a gerar streams HLS de alta qualidade, conforme descrito neste link.
Recurso | Compatível | Comentários |
---|---|---|
Contêineres | ||
MPEG-TS | SIM | |
FMP4/CMAF | SIM | |
ADTS (AAC) | SIM | |
MP3 | SIM | |
Legendas/legendas | ||
CEA-608 | SIM | |
CEA 708 | SIM | |
WebVTT | SIM | |
Metadados | ||
ID3 | SIM | |
SCTE-35 | NO | |
Proteção de conteúdo | ||
AES-128 | SIM | |
Amostra do AES-128 | NO | |
Widevine | SIM | API 19+ ("esquema" cenc) e 25+ ("esquema" cbcs) |
PlayReady SL2000 | SIM | Somente no Android TV |
Controle do servidor | ||
Atualizações da Delta | SIM | |
Bloqueando a atualização da playlist | SIM | |
Bloqueando o carregamento de dicas de pré-carregamento | SIM | Exceto para intervalos de bytes com comprimentos indefinidos |
Reprodução ao vivo | ||
Reprodução ao vivo normal | SIM | |
HLS de baixa latência (Apple) | SIM | |
HLS de baixa latência (Comunidade) | NO | |
Dados comuns do cliente de mídia (CMCD, na sigla em inglês) | SIM | Guia de integração |
Como usar MediaItem
Para abrir uma transmissão HLS, você precisa usar o módulo HLS.
Kotlin
implementation("androidx.media3:media3-exoplayer-hls:1.3.1")
Groovy
implementation "androidx.media3:media3-exoplayer-hls:1.3.1"
Você pode criar um MediaItem
para um URI de playlist HLS e transmiti-lo ao
player.
Kotlin
// Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(hlsUri)) // Prepare the player. player.prepare()
Java
// Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(hlsUri)); // Prepare the player. player.prepare();
Se o URI não terminar com .m3u8
, transmita MimeTypes.APPLICATION_M3U8
para setMimeType
de MediaItem.Builder
para indicar explicitamente o tipo do
conteúdo.
O URI do item de mídia pode apontar para uma playlist de mídia ou para uma playlist
multivariante. Se o URI apontar para uma playlist multivariante que declare várias
tags #EXT-X-STREAM-INF
, o ExoPlayer vai se adaptar automaticamente entre
as variantes, considerando a largura de banda disponível e os recursos do dispositivo.
Como usar HlsMediaSource
Para mais opções de personalização, você pode criar um HlsMediaSource
e transmiti-lo
diretamente ao player em vez de MediaItem
.
Kotlin
// Create a data source factory. val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory() // Create a HLS media source pointing to a playlist uri. val hlsMediaSource = HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri)) // Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the HLS media source as the playlist with a single media item. player.setMediaSource(hlsMediaSource) // Prepare the player. player.prepare()
Java
// Create a data source factory. DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); // Create a HLS media source pointing to a playlist uri. HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri)); // Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the HLS media source as the playlist with a single media item. player.setMediaSource(hlsMediaSource); // Prepare the player. player.prepare();
Como acessar o manifesto
Chame Player.getCurrentManifest
para recuperar o manifesto atual.
Para HLS, transmita o objeto retornado para HlsManifest
. O
callback onTimelineChanged
de Player.Listener
também é chamado sempre que
o manifesto é carregado. Isso acontecerá uma vez para conteúdo sob demanda e
possivelmente muitas vezes para conteúdo ao vivo. O snippet de código abaixo mostra como um app
pode fazer algo sempre que o manifesto é carregado.
Kotlin
player.addListener( object : Player.Listener { override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) { val manifest = player.currentManifest if (manifest is HlsManifest) { // Do something with the manifest. } } } )
Java
player.addListener( new Player.Listener() { @Override public void onTimelineChanged( Timeline timeline, @Player.TimelineChangeReason int reason) { Object manifest = player.getCurrentManifest(); if (manifest != null) { HlsManifest hlsManifest = (HlsManifest) manifest; // Do something with the manifest. } } });
Como personalizar a reprodução
O ExoPlayer oferece várias maneiras de personalizar a experiência de reprodução de acordo com as necessidades do seu app. Consulte a página "Personalização" para ver exemplos.
Como desativar a preparação sem partes
Por padrão, o ExoPlayer usa a preparação sem partes. Isso significa que o ExoPlayer
vai usar apenas as informações na playlist multivariante para preparar o
stream, o que funciona se as tags #EXT-X-STREAM-INF
contiverem o atributo
CODECS
.
Talvez seja necessário desativar esse recurso se os segmentos de mídia tiverem faixas
com legendas multiplexadas que não foram declaradas na playlist multivariante com uma
tag #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS
. Caso contrário, essas faixas
de legenda não serão detectadas e tocadas. É possível desativar a preparação sem separações em blocos no
HlsMediaSource.Factory
, conforme mostrado no snippet a seguir. Isso
vai aumentar o tempo de inicialização, já que o ExoPlayer precisa fazer o download de um segmento de mídia para
descobrir essas outras faixas. Em vez disso, é preferível declarar as
faixas de closed captions na playlist multivariante.
Kotlin
val hlsMediaSource = HlsMediaSource.Factory(dataSourceFactory) .setAllowChunklessPreparation(false) .createMediaSource(MediaItem.fromUri(hlsUri))
Java
HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory) .setAllowChunklessPreparation(false) .createMediaSource(MediaItem.fromUri(hlsUri));
Como criar conteúdo HLS de alta qualidade
Para aproveitar ao máximo o ExoPlayer, há determinadas diretrizes que você pode seguir para melhorar seu conteúdo HLS. Leia nossa postagem do Medium sobre a reprodução de HLS no ExoPlayer (em inglês) para uma explicação completa. Os pontos principais são:
- Use durações de segmento precisas.
- Use um fluxo de mídia contínuo. Evite mudanças na estrutura da mídia entre segmentos.
- Use a tag
#EXT-X-INDEPENDENT-SEGMENTS
. - Prefira streams com multiplexação múltipla, em vez de arquivos que incluem vídeo e áudio.
- Inclua todas as informações possíveis na playlist multivariante.
As diretrizes a seguir são válidas para transmissões ao vivo:
- Use a tag
#EXT-X-PROGRAM-DATE-TIME
. - Use a tag
#EXT-X-DISCONTINUITY-SEQUENCE
. - Forneça uma janela de transmissão longa. Um minuto ou mais é ótimo.