ExoPlayer obsługuje HLS z wieloma formatami kontenerów. Muszą być też obsługiwane przykładowe formaty audio i wideo (szczegóły znajdziesz w sekcji przykładowe formaty). Zdecydowanie zachęcamy producentów treści HLS do generowania wysokiej jakości strumieni HLS, jak opisano tutaj.
Cecha | 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+ („cbcs”) |
PlayReady SL2000 | TAK | Tylko Android TV |
Kontrola serwera | ||
Aktualizacje delta | TAK | |
Blokowanie ponownego wczytywania playlisty | TAK | |
Blokowanie wczytywania wskazówek dotyczących wstępnego wczytywania | TAK | Oprócz zakresów bajtów o nieokreślonej długości |
Odtwarzanie na żywo | ||
Zwykłe odtwarzanie na żywo | TAK | |
HLS z krótkim czasem oczekiwania (Apple) | TAK | |
HLS z małym opóźnieniem (społeczność) | NIE | |
Dane klienta 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.3.1")
Odlotowy
implementation "androidx.media3:media3-exoplayer-hls:1.3.1"
Następnie możesz utworzyć obiekt MediaItem
dla identyfikatora URI playlisty HLS 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(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 wyraźnie wskazać typ treści.
Identyfikator URI elementu multimedialnego może wskazywać playlistę multimediów lub playlistę z wieloma wariantami. Jeśli identyfikator URI wskazuje playlistę z wieloma wariantami, która deklaruje wiele tagów #EXT-X-STREAM-INF
, komponent ExoPlayer automatycznie dostosowuje się do wariantów, biorąc pod uwagę dostępną przepustowość i możliwości urządzenia.
Korzystanie z HlsMediaSource
Aby uzyskać więcej opcji dostosowywania, utwórz HlsMediaSource
i przekaż go bezpośrednio 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();
Uzyskiwanie dostępu do pliku manifestu
Bieżący plik manifestu możesz pobrać, wywołując Player.getCurrentManifest
.
W przypadku HLS zwrócony obiekt należy rzutować na HlsManifest
. Wywołanie zwrotne onTimelineChanged
dotyczące Player.Listener
jest też wywoływane przy każdym wczytaniu pliku manifestu. Zdarza się to raz w przypadku treści na żądanie,
a często nawet wielokrotnie w przypadku treści na żywo. Ten fragment kodu pokazuje, jak aplikacja może wykonać jakąś czynność przy wczytywaniu 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 oferuje wiele sposobów dostosowania odtwarzania do potrzeb aplikacji. Przykłady znajdziesz na stronie Dostosowywanie.
Wyłączam przygotowywanie bez fragmentów
Domyślnie ExoPlayer użyje przygotowań bez fragmentów. Oznacza to, że do przygotowania strumienia użyto tylko informacji z playlisty z wieloma wariantami. Ta metoda działa, jeśli tagi #EXT-X-STREAM-INF
zawierają atrybut CODECS
.
Może być konieczne wyłączenie tej funkcji, jeśli Twoje segmenty multimediów zawierają ścieżki napisów z różnymi napisami, które nie są zadeklarowane na playliście z wieloma wariantami za pomocą tagu #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS
. W przeciwnym razie ścieżki z napisami
nie zostaną wykryte i odtwarzane. Możesz wyłączyć przygotowywanie bez fragmentu w HlsMediaSource.Factory
, jak pokazano w tym fragmencie. Pamiętaj, że wydłuży to czas uruchamiania, ponieważ ExoPlayer musi pobrać segment multimediów, by wykryć dodatkowe ścieżki. Lepiej zadeklarować ścieżki 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 ExoPlayera, zapoznaj się z naszymi wytycznymi, które pomogą Ci ulepszać treści HLS. Pełne wyjaśnienie znajdziesz w poście na stronie Medium o odtwarzaniu HLS w ExoPlayer. Oto najważniejsze kwestie:
- Używaj dokładnej długości segmentu.
- Używaj ciągłego strumienia multimediów i unikaj zmian w strukturze mediów w poszczególnych segmentach.
- Używaj tagu
#EXT-X-INDEPENDENT-SEGMENTS
. - Wolisz strumienie z decentralizacją w przeciwieństwie do plików, które zawierają zarówno wideo, jak i dźwięk.
- Podaj wszystkie informacje dostępne na playliście z wieloma wariantami.
Te wytyczne dotyczą transmisji na żywo:
- Używaj tagu
#EXT-X-PROGRAM-DATE-TIME
. - Używaj tagu
#EXT-X-DISCONTINUITY-SEQUENCE
. - Zapewnienie długiego okresu transmisji na żywo. Najlepiej poczekać co najmniej minutę.