SmoothStreaming

O ExoPlayer oferece suporte ao SmoothStreaming com o formato de contêiner FMP4. Streams de mídia deve ser desmuxado, ou seja, vídeo, áudio e texto devem ser definidos de forma Elementos StreamIndex no manifesto do SmoothStreaming. O áudio contido e formatos de exemplo de vídeo também devem ser suportados (consulte a exemplos de formatos para mais detalhes).

Recurso Compatível Comentários
Contêineres
FMP4 SIM Somente streams duplicados
Legendas legendas
TTML SIM Incorporado ao FMP4
Proteção de conteúdo
PlayReady SL2000 SIM Somente no Android TV
Reprodução ao vivo
Reprodução ao vivo regular SIM
Dados comuns do cliente de mídia (CMCD, na sigla em inglês) SIM Guia de integração

Como usar o MediaItem

Para abrir uma transmissão do SmoothStreaming, você precisa depender do mais tarde neste módulo.

Kotlin

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

Groovy

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

Você pode criar um MediaItem para um URI de manifesto do SmoothStreaming 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(ssUri))
// 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(ssUri));
// Prepare the player.
player.prepare();

Caso o URI não termine com .ism/Manifest, será possível transmitir. MimeTypes.APPLICATION_SS a setMimeType de MediaItem.Builder para explicitamente indicar 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 SsMediaSource

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

Kotlin

// Create a data source factory.
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a SmoothStreaming media source pointing to a manifest uri.
val mediaSource: MediaSource =
  SsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(ssUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Java

// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a SmoothStreaming media source pointing to a manifest uri.
MediaSource mediaSource =
    new SsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(ssUri));
// Create a player instance.
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 recuperar o manifesto atual chamando Player.getCurrentManifest. Para SmoothStreaming, transmita o objeto retornado para SsManifest. A O callback onTimelineChanged de Player.Listener também é chamado sempre que o manifesto é carregado. Isso acontecerá uma vez para conteúdo on demand 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 for carregado.

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is SsManifest) {
        // 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) {
          SsManifest ssManifest = (SsManifest) 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 seu às necessidades do seu app. Consulte a página "Personalização" para ver exemplos.