DASH

ExoPlayer obsługuje DASH z wieloma formatami kontenerów. Strumienie multimediów muszą być zdemulowane, co oznacza, że film, dźwięk i tekst muszą być zdefiniowane w osobnych elementach AdaptationSet w pliku manifestu DASH (wyjątek CEA-608 jest opisany w tabeli poniżej). Zawarte w zestawie przykładowe formaty audio i wideo muszą być też obsługiwane (szczegóły znajdziesz w sekcji Przykładowe formaty).

Cecha Obsługiwane Komentarze
Kontenery
protokół FMP4 TAK Tylko strumienie zdemonstrowane
WebM TAK Tylko strumienie zdemonstrowane
Matroska TAK Tylko strumienie zdemonstrowane
MPEG-TS NIE Pomoc nie jest planowana
Napisy
TTML, TAK Nieprzetworzone lub umieszczone w FMP4 zgodnie z normą ISO/IEC 14496-30
WebVTT TAK Nieprzetworzone lub umieszczone w FMP4 zgodnie z normą ISO/IEC 14496-30
CEA-608 TAK Umieszczony w FMP4 po sygnalizowaniu za pomocą deskryptorów ułatwień dostępu SCTE
CEA-708 TAK Umieszczony w FMP4 po sygnalizowaniu za pomocą deskryptorów ułatwień dostępu SCTE
Metadane
Metadane EMSG TAK Umieszczone w FMP4
Ochrona treści
Widevine TAK Schemat „cenc”: API 19 lub nowszy; schemat „cbcs”: API 25 lub nowszy
PlayReady SL2000 TAK Android TV, tylko schemat „cenc”
Wyczyść klucz TAK API 21 lub nowszy, tylko schemat „cenc”
Odtwarzanie na żywo
Standardowe odtwarzanie na żywo TAK
Odtwarzanie na żywo w CMAF z bardzo małym opóźnieniem TAK
Common Media Client Data (CMCD). TAK Przewodnik po integracji

Korzystanie z elementu MediaItem

Aby odtworzyć strumień DASH, musisz skorzystać z modułu DASH.

Kotlin

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

Odlotowe

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

Następnie możesz utworzyć identyfikator MediaItem dla identyfikatora URI MPD DASH 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(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();

Jeśli identyfikator URI nie kończy się na .mpd, możesz przekazać MimeTypes.APPLICATION_MPD do setMimeType funkcji MediaItem.Builder, by wyraźnie wskazać typ treści.

ExoPlayer automatycznie dostosuje reprezentacje zdefiniowane w pliku manifestu, biorąc pod uwagę zarówno dostępną przepustowość, jak i możliwości urządzenia.

Korzystanie z DashMediaSource

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

Dostęp do pliku manifestu

Bieżący plik manifestu możesz pobrać, wywołując funkcję Player.getCurrentManifest. W przypadku DASH należy rzutować zwrócony obiekt na platformę DashManifest. Wywołanie zwrotne onTimelineChanged dla Player.Listener jest też wywoływane przy każdym wczytaniu pliku manifestu. Ma to miejsce raz w przypadku treści na żądanie i często wiele razy w przypadku treści na żywo. Ten fragment kodu pokazuje, jak aplikacja może wykonać określone 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 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.
        }
      }
    });

Dostosowywanie odtwarzania

ExoPlayer daje wiele możliwości dostosowania odtwarzania do potrzeb aplikacji. Przykłady znajdziesz na stronie Dostosowywanie.