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). Gorąco zachęcamy twórców treści HLS do generowania strumieni HLS wysokiej jakości, jak opisano 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 | Interfejs API 19+ (schemat „cenc”) i 25+ (schemat „cbcs”) |
PlayReady SL2000 | TAK | Tylko Android TV |
Kontrola serwera | ||
Aktualizacje delta | TAK | |
Blokowanie ponownego wczytywania 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 | ||
Odtwarzanie na żywo | TAK | |
HLS o niskim opóźnieniu (Apple) | TAK | |
HLS z małym opóźnieniem (społeczność) | NIE | |
Common Media Client Data (CMCD). | TAK | Przewodnik integracji |
Korzystanie z MediaItem
Aby odtworzyć strumień HLS, musisz polegać na module HLS.
Kotlin
implementation("androidx.media3:media3-exoplayer-hls:1.4.1")
Groovy
implementation "androidx.media3:media3-exoplayer-hls:1.4.1"
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 adres URI nie kończy się na .m3u8
, możesz przekazać parametr MimeTypes.APPLICATION_M3U8
do metody setMimeType
obiektu MediaItem.Builder
, aby wyraźnie 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();
Otwieranie 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 personalizacji.
Wyłączam przygotowywanie bez fragmentów
Domyślnie ExoPlayer używa przygotowania 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
.
Jeśli segmenty multimediów zawierają zmiksowane ścieżki z napisami, które nie są zadeklarowane w multiwariantowej playliście za pomocą tagu #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS
, konieczne może być wyłączenie tej funkcji. Poza tym te ścieżki napisów
urządzenia nie zostaną wykryte ani odtwarzane. Możesz wyłączyć przygotowanie bez segmentów w HlsMediaSource.Factory
, jak pokazano w tym fragmencie kodu. 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 ExoPlayera, możesz postępować zgodnie z pewnymi wytycznymi, które pomogą Ci ulepszyć treści HLS. Aby uzyskać więcej informacji, przeczytaj post na Medium na temat odtwarzania HLS w ExoPlayerze. Najważniejsze kwestie:
- Używaj dokładnych długości 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.
- Uwzględnij wszystkie możliwe informacje na playlistzie z wieloma wariantami.
W przypadku transmisji na żywo obowiązują te wytyczne:
- Użyj tagu
#EXT-X-PROGRAM-DATE-TIME
. - Używaj tagu
#EXT-X-DISCONTINUITY-SEQUENCE
. - Długi czas trwania transmisji na żywo. Co najmniej 1 minuta.