SmoothStreaming

O ExoPlayer é compatível com SmoothStreaming usando o formato de contêiner FMP4. Os fluxos de mídia precisam ser demuxados, ou seja, vídeo, áudio e texto precisam ser definidos em elementos StreamIndex distintos no manifesto do SmoothStreaming. 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
Legendas
TTML SIM Incorporado em FMP4
Proteção de conteúdo
PlayReady SL2000 SIM Somente no Android TV
Reprodução ao vivo
Reprodução regular ao vivo SIM
Dados comuns do cliente de mídia (CMCD) SIM Guia de integração

Usar MediaItem

Para reproduzir um stream do SmoothStreaming, é necessário depender do módulo SmoothStreaming.

Kotlin

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

Groovy

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

Em seguida, crie um MediaItem para um URI de manifesto do SmoothStreaming 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(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();

Se o URI não terminar com .ism/Manifest, transmita MimeTypes.APPLICATION_SS para setMimeType de MediaItem.Builder para indicar explicitamente o tipo de 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 SsMediaSource

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

Para recuperar o manifesto atual, chame Player.getCurrentManifest. Para o SmoothStreaming, transmita o objeto retornado para SsManifest. O callback onTimelineChanged de Player.Listener também é chamado sempre que o manifesto é carregado. Isso vai acontecer uma vez para 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 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.
        }
      }
    });

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.