DASH

O ExoPlayer oferece suporte ao DASH com vários formatos de contêiner. Os streams de mídia precisam ser com multiplexação, ou seja, vídeo, áudio e texto precisam ser definidos de maneira AdaptationSet no manifesto DASH (o CEA-608 é uma exceção, descritos na tabela abaixo). Os formatos de amostra de áudio e vídeo contidos devem tenham suporte (consulte a exemplos de formatos para mais detalhes).

Recurso Compatível Comentários
Contêineres
FMP4 SIM Somente streams duplicados
WebM SIM Somente streams duplicados
Matroska SIM Somente transmissões desmultiplexadas
MPEG-TS NÃO Nenhum suporte planejado
Legendas legendas
TTML SIM Raw ou incorporado em FMP4 de acordo com a ISO/IEC 14496-30
WebVTT SIM Bruto ou incorporado em FMP4 de acordo com a norma ISO/IEC 14496-30
Certificado CEA-608 SIM Incorporado no FMP4 quando sinalizado usando descritores de acessibilidade SCTE
Certificado CEA 708 SIM Incorporado no FMP4 quando sinalizado usando descritores de acessibilidade SCTE
Metadados
Metadados EMSG SIM Incorporado ao FMP4
Proteção de conteúdo
Widevine SIM "cenc" schema: API 19+; "cbcs" esquema: API 25 ou mais recente
PlayReady SL2000 SIM Android TV, esquema "cenc"
ClearKey SIM API 21+, esquema "cenc"
Reprodução ao vivo
Reprodução ao vivo normal SIM
Reprodução ao vivo do CMAF de latência ultrabaixa SIM
Dados comuns do cliente de mídia (CMCD, na sigla em inglês) SIM Guia de integração

Como usar o MediaItem

Para reproduzir uma transmissão DASH, você precisa depender do módulo DASH.

Kotlin

implementation("androidx.media3:media3-exoplayer-dash:1.4.1")

Groovy

implementation "androidx.media3:media3-exoplayer-dash:1.4.1"

Em seguida, você pode criar um MediaItem para um URI de MPD DASH 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(dashUri))
// 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(dashUri));
// Prepare the player.
player.prepare();

Caso o URI não termine com .mpd, transmita MimeTypes.APPLICATION_MPD. setMimeType de MediaItem.Builder para indicar explicitamente o tipo de conteúdo.

O ExoPlayer se adaptará automaticamente entre as representações definidas no da Web, considerando a largura de banda disponível e as capacidades do dispositivo.

Como usar a DashMediaSource

Para mais opções de personalização, você pode criar um DashMediaSource e transmiti-lo diretamente ao player em vez de um MediaItem.

Kotlin

val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a dash media source pointing to a dash manifest uri.
val mediaSource: MediaSource =
  DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri))
// Create a player instance which gets an adaptive track selector by default.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Java

DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a dash media source pointing to a dash manifest uri.
MediaSource mediaSource =
    new DashMediaSource.Factory(dataSourceFactory)
        .createMediaSource(MediaItem.fromUri(dashUri));
// Create a player instance which gets an adaptive track selector by default.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

Como acessar o manifesto

É possível extrair o manifesto atual chamando Player.getCurrentManifest. Para o DASH, você precisa transmitir o objeto retornado para DashManifest. O O callback onTimelineChanged de Player.Listener também é chamado sempre que o manifesto é carregado. Isso acontecerá uma vez para um conteúdo sob demanda, e possivelmente várias vezes em conteúdo ao vivo. O snippet de código a seguir 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 DashManifest) {
        // 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) {
          DashManifest dashManifest = (DashManifest) 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 app. Consulte a página de personalização para conferir exemplos.