HLS

ExoPlayer obsługuje HLS z wieloma formatami kontenerów. Zawarte w nim materiały audio Muszą być też obsługiwane przykładowe formaty wideo (zobacz przykładowe formaty). Śr zdecydowanie zachęcamy producentów treści HLS do generowania wysokiej jakości strumieni HLS, zgodnie z opisem tutaj.

Funkcja Obsługiwane Komentarze
Kontenery
MPEG-TS TAK
FMP4/CMAF TAK
ADTS (AAC) TAK
MP3 TAK
Napisy
CEA-608 TAK
CEA-708 TAK
WebVTT TAK
Metadane
Identyfikator 3 TAK
SCTE-35 NIE
Ochrona treści
AES-128, TAK
Przykład AES-128 NIE
Widevine TAK API 19+ (schemat „cenc”) i 25+ (schemat „cbcs”)
PlayReady SL2000 TAK Tylko Android TV
Kontrola serwera
Aktualizacje delta TAK
Blokuję ponowne ładowanie playlisty TAK
Blokuję ładowanie wskazówek dotyczących wstępnego wczytywania TAK Z wyjątkiem zakresów bajtów o nieokreślonej długości
Odtwarzanie na żywo
Standardowe odtwarzanie na żywo TAK
HLS z krótkim czasem oczekiwania (Apple) TAK
HLS z krótkim czasem oczekiwania (społeczność) NIE
Common Media Client Data (CMCD). TAK Przewodnik po integracji

Korzystanie z elementu MediaItem

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

Kotlin

implementation("androidx.media3:media3-exoplayer-hls:1.4.0")

Odlotowe

implementation "androidx.media3:media3-exoplayer-hls:1.4.0"

Następnie możesz utworzyć identyfikator MediaItem dla identyfikatora URI playlisty HLS i przekazać go do .

Kotlin

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(hlsUri))
// 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(hlsUri));
// Prepare the player.
player.prepare();

Jeśli identyfikator URI nie kończy się na .m3u8, możesz przekazać MimeTypes.APPLICATION_M3U8 do setMimeType z MediaItem.Builder, aby jednoznacznie wskazać typ treści.

Identyfikator URI elementu multimedialnego może wskazywać playlistę multimediów lub wiele wariantów na playliście. Jeśli identyfikator URI wskazuje playlistę z wieloma wariantami, która deklaruje wiele #EXT-X-STREAM-INF, wówczas ExoPlayer automatycznie dostosuje się między z uwzględnieniem dostępnej przepustowości i możliwości urządzenia.

Korzystanie z HlsMediaSource

Aby uzyskać więcej opcji dostosowywania, możesz utworzyć HlsMediaSource i przekazać go prosto do odtwarzacza, a nie MediaItem.

Kotlin

// Create a data source factory.
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a HLS media source pointing to a playlist uri.
val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource)
// Prepare the player.
player.prepare()

Java

// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a HLS media source pointing to a playlist uri.
HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource);
// 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 HLS należy rzutować zwrócony obiekt na HlsManifest. Wywołanie zwrotne funkcji onTimelineChanged z Player.Listener jest również wywoływane, gdy plik manifestu został wczytany. Nastąpi to jednorazowo w przypadku treści na żądanie i być może przy treściach na żywo. Ten fragment kodu pokazuje, jak aplikacja może wykonać jakąś czynność po załadowaniu pliku manifestu.

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is HlsManifest) {
        // 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) {
          HlsManifest hlsManifest = (HlsManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

Dostosowywanie odtwarzania

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

Wyłączam przygotowywanie bez fragmentów

Domyślnie ExoPlayer używa przygotowywania bez fragmentów. Oznacza to, że aplikacja ExoPlayer wyłącznie na podstawie informacji z playlisty z wieloma wariantami , które działa, jeśli tagi #EXT-X-STREAM-INF zawierają tag CODECS .

Być może trzeba będzie wyłączyć tę funkcję, jeśli Twoje segmenty multimediów zawierają treści multimedialne ścieżek z napisami, które nie są zadeklarowane na playliście z wieloma wariantami, a parametr #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS. Poza tym te ścieżki napisów nie zostaną wykryte ani odtwarzane. Przygotowywanie bez fragmentów możesz wyłączyć w HlsMediaSource.Factory jak w tym fragmencie. Pamiętaj, że to Wydłuży to czas uruchamiania, ponieważ ExoPlayer musi pobrać segment multimediów odkryć te dodatkowe ścieżki. Lepiej zadeklarować ścieżek z napisami na playliście z wieloma wariantami.

Kotlin

val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory)
    .setAllowChunklessPreparation(false)
    .createMediaSource(MediaItem.fromUri(hlsUri))

Java

HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory)
        .setAllowChunklessPreparation(false)
        .createMediaSource(MediaItem.fromUri(hlsUri));

Tworzenie wysokiej jakości treści HLS

Aby w pełni wykorzystać możliwości ExoPlayer, zapoznaj się z pewnymi wytycznymi, , aby ulepszyć swoje treści HLS. Przeczytaj nasz post na temat HLS dotyczący odtwarzania HLS w ExoPlayer, gdzie znajdziesz pełne wyjaśnienie. Najważniejsze punkty:

  • Używaj dokładnych czasów trwania segmentów.
  • Używaj ciągłego strumienia multimediów. uniknąć zmian w strukturze multimediów segmentów niestandardowych.
  • Używaj tagu #EXT-X-INDEPENDENT-SEGMENTS.
  • Preferuj strumienie zdemultipleksowane zamiast plików zawierających zarówno wideo, jak i audio.
  • Umieść wszystkie informacje, które możesz umieścić na playliście z wieloma wariantami.

W przypadku transmisji na żywo obowiązują te wytyczne:

  • Używaj tagu #EXT-X-PROGRAM-DATE-TIME.
  • Używaj tagu #EXT-X-DISCONTINUITY-SEQUENCE.
  • Dodaj długi okres ważności. Wystarczy minuta lub dłużej.