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 | ||
ID3 | 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.1")
Odlotowe
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 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żywać ciągłego strumienia multimediów, uniknąć zmian w strukturze multimediów segmentów niestandardowych.
- Używaj tagu
#EXT-X-INDEPENDENT-SEGMENTS
. - Preferuj strumienie zdemonstrowane 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.