ExoPlayer obsługuje HLS z wieloma formatami kontenerów. Muszą być też obsługiwane dołączone do tego formaty dźwiękowe 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+ (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.3.1")
Odlotowe
implementation "androidx.media3:media3-exoplayer-hls:1.3.1"
Następnie możesz utworzyć identyfikator 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
funkcji MediaItem.Builder
, by wyraźnie wskazać typ treści.
Identyfikator URI elementu multimedialnego może wskazywać playlistę multimediów lub wiele wariantów. Jeśli identyfikator URI wskazuje playlistę z wieloma wariantami, na której zadeklarowano kilka tagów #EXT-X-STREAM-INF
, ExoPlayer automatycznie dostosowuje się między wariantami, biorąc pod uwagę dostępną przepustowość i możliwości urządzenia.
Korzystanie z HlsMediaSource
Aby uzyskać więcej opcji dostosowywania, możesz utworzyć element HlsMediaSource
i przekazać go bezpośrednio do odtwarzacza zamiast do 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 onTimelineChanged
dla Player.Listener
jest też wywoływane przy każdym wczytaniu pliku manifestu. Nastąpi to 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 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 potrzeb 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 do przygotowania strumienia ExoPlayer wykorzysta tylko informacje z playlisty z wieloma wariantami. Działa to wtedy, gdy tagi #EXT-X-STREAM-INF
zawierają atrybut CODECS
.
Może być konieczne wyłączenie tej funkcji, jeśli segmenty multimediów zawierają ścieżki z wieloma wariantami, które nie są zadeklarowane na playliście z wieloma wariantami za pomocą tagu #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS
. W przeciwnym razie takie ścieżki napisów nie będą wykrywane ani odtwarzane. Możesz wyłączyć przygotowanie bez fragmentów w HlsMediaSource.Factory
, jak pokazano w tym fragmencie kodu. Pamiętaj, że wydłuży to czas uruchamiania, ponieważ ExoPlayer musi pobrać segment multimediów, aby wykryć te dodatkowe utwory. Lepiej jest 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
Jeśli chcesz w pełni wykorzystać możliwości ExoPlayer, możesz dostosować treści HLS do tych wytycznych. Pełne informacje znajdziesz w poście na stronie Medium o odtwarzaniu HLS w odtwarzaczu ExoPlayer. Najważniejsze punkty:
- Używaj dokładnych czasów trwania segmentów.
- Używaj ciągłego strumienia multimediów. Unikaj zmian w strukturze multimediów w różnych segmentach.
- 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.