Płynne strumieniowanie

ExoPlayer obsługuje SmoothStreaming w formacie kontenera FMP4. Strumienie multimediów muszą być rozdzielone, co oznacza, że wideo, audio i tekst muszą być zdefiniowane w odrębnych elementach StreamIndex w manifeście SmoothStreaming. Obsługiwane muszą być też formaty próbek audio i wideo (szczegółowe informacje znajdziesz w sekcji formaty próbek).

Funkcja Obsługiwane Komentarze
Kontenery
FMP4 TAK Tylko strumienie zdemuksowane
Napisy
TTML TAK Umieszczone w FMP4
Ochrona treści
PlayReady SL2000 TAK Tylko Android TV
Odtwarzanie na żywo
Odtwarzanie na żywo TAK
Common Media Client Data (CMCD) TAK Przewodnik po integracji

Używanie elementu MediaItem

Aby odtworzyć strumień SmoothStreaming, musisz użyć modułu SmoothStreaming.

Kotlin

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

Groovy

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

Następnie możesz utworzyć MediaItem dla identyfikatora URI manifestu SmoothStreaming i przekazać go do odtwarzacza.

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();

Jeśli Twój URI nie kończy się znakiem .ism/Manifest, możesz przekazać MimeTypes.APPLICATION_SS do setMimeTypeMediaItem.Builder, aby wyraźnie wskazać typ treści.

ExoPlayer automatycznie dostosowuje się do reprezentacji zdefiniowanych w manifeście, biorąc pod uwagę zarówno dostępną przepustowość, jak i możliwości urządzenia.

Korzystanie z SsMediaSource

Aby uzyskać więcej opcji dostosowywania, możesz utworzyć SsMediaSource i przekazać go bezpośrednio do odtwarzacza zamiast 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();

Dostęp do pliku manifestu

Aby pobrać bieżący plik manifestu, wywołaj funkcję Player.getCurrentManifest. W przypadku SmoothStreaming zwrócony obiekt należy rzutować na SsManifest. Wywołanie zwrotne onTimelineChanged funkcji Player.Listener jest też wywoływane za każdym razem, gdy wczytywany jest plik manifestu. W przypadku treści na żądanie zdarzy się to raz, a w przypadku treści na żywo może się to zdarzyć wiele razy. Ten fragment kodu pokazuje, jak aplikacja może wykonać działanie po wczytaniu pliku manifestu.

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.
        }
      }
    });

Dostosowywanie odtwarzania

ExoPlayer udostępnia wiele sposobów dostosowywania odtwarzania do potrzeb aplikacji. Przykłady znajdziesz na stronie Dostosowywanie.