DASH

O ExoPlayer é compatível com DASH em vários formatos de contêiner. Os fluxos de mídia precisam ser demuxados, ou seja, vídeo, áudio e texto precisam ser definidos em elementos AdaptationSet distintos no manifesto DASH. A CEA-608 é uma exceção, conforme descrito na tabela abaixo. Os formatos de amostra de áudio e vídeo contidos também precisam ser compatíveis. Consulte a seção Formatos de amostra para mais detalhes.

Recurso Compatível Comentários
Contêineres
FMP4 SIM Somente streams demuxadas
WebM SIM Somente streams demuxadas
Matroska SIM Somente streams demuxadas
MPEG-TS NÃO Nenhum suporte planejado
Legendas / closed captions
TTML SIM Bruto ou incorporado em FMP4 de acordo com ISO/IEC 14496-30
WebVTT SIM Bruto ou incorporado em FMP4 de acordo com ISO/IEC 14496-30
CEA-608 SIM Incorporado em FMP4 quando sinalizado usando descritores de acessibilidade SCTE
CEA-708 SIM Incorporado em FMP4 quando sinalizado usando descritores de acessibilidade SCTE
Metadados
Metadados EMSG SIM Incorporado em FMP4
Proteção de conteúdo
Widevine SIM Esquema "cenc": API 19 ou mais recente; Esquema "cbcs": API 25 ou mais recente
PlayReady SL2000 SIM Android TV, somente esquema "cenc"
ClearKey SIM API 21+, somente esquema "cenc"
Inserção de anúncios
Reprodução de vários períodos SIM
Inserção de anúncios guiada pelo servidor (xlinks) NÃO
Anúncios do lado do cliente e do servidor da IMA SIM Guia de inserção de anúncios
Reprodução ao vivo
Reprodução regular ao vivo SIM
Reprodução ao vivo de CMAF com latência ultrabaixa SIM
Dados comuns do cliente de mídia (CMCD) SIM Guia de integração do CMCD

Usar MediaItem

Para reproduzir um stream DASH, você precisa depender do módulo DASH.

Kotlin

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

Groovy

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

Em seguida, crie um MediaItem para um URI MPD do DASH e transmita-o 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();

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

O ExoPlayer se adapta automaticamente entre as representações definidas no manifesto, considerando a largura de banda disponível e os recursos do dispositivo.

Como usar DashMediaSource

Para mais opções de personalização, crie um DashMediaSource e transmita-o 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

Para recuperar o manifesto atual, chame Player.getCurrentManifest. Para DASH, transmita o objeto retornado para DashManifest. O callback onTimelineChanged de Player.Listener também é chamado sempre que o manifesto é carregado. Isso vai acontecer uma vez para um conteúdo on demand e possivelmente muitas vezes para 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.
        }
      }
    });

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 de personalização para ver exemplos.