ExoPlayer unterstützt HLS mit mehreren Containerformaten. Die enthaltenen Audio- und Video-Beispielformate müssen ebenfalls unterstützt werden. Weitere Informationen finden Sie im Abschnitt Beispielformate. Wir empfehlen Erstellern von HLS-Inhalten dringend, HLS-Streams hoher Qualität zu generieren, wie hier beschrieben.
Funktion | Unterstützt | Kommentare |
---|---|---|
Container | ||
MPEG-TS | JA | |
FMP4/CMAF | JA | |
ADTS (AAC) | JA | |
MP3 | JA | |
Untertitel | ||
CEA-608 | JA | |
CEA-708 | JA | |
WebVTT | JA | |
Metadaten | ||
ID3 | JA | |
SCTE 35 | NEIN | |
Inhaltsschutz | ||
AES-128 | JA | |
Beispiel AES-128 | NEIN | |
Widevine | JA | API 19+ ("cenc"-Schema) und 25+ ("cbcs"-Schema) |
PlayReady SL2000 | JA | Nur Android TV |
Serversteuerung | ||
Delta-Aktualisierungen | JA | |
Aktualisieren der Playlist wird blockiert | JA | |
Laden von Vorabladehinweisen blockieren | JA | Mit Ausnahme von Bytebereichen mit nicht definierten Längen |
Live-Wiedergabe | ||
Regelmäßige Livewiedergabe | JA | |
HLS mit niedriger Latenz (Apple) | JA | |
HLS mit niedriger Latenz (Community) | NEIN | |
Common Media Client Data (CMCD) | JA | Integrationsleitfaden |
MediaItem verwenden
Damit du einen HLS-Stream abspielen kannst, musst du dich auf das HLS-Modul verlassen.
Kotlin
implementation("androidx.media3:media3-exoplayer-hls:1.3.1")
Groovig
implementation "androidx.media3:media3-exoplayer-hls:1.3.1"
Anschließend kannst du einen MediaItem
für den URI einer HLS-Playlist erstellen und an den Player übergeben.
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();
Wenn der URI nicht mit .m3u8
endet, können Sie MimeTypes.APPLICATION_M3U8
an setMimeType
von MediaItem.Builder
übergeben, um den Inhaltstyp explizit anzugeben.
Der URI des Medienelements kann auf eine Medienplaylist oder eine Playlist mit mehreren Varianten verweisen. Wenn der URI auf eine Playlist mit mehreren Varianten verweist, die mehrere #EXT-X-STREAM-INF
-Tags deklariert, passt ExoPlayer automatisch zwischen den Varianten an und berücksichtigt dabei sowohl die verfügbare Bandbreite als auch die Gerätefunktionen.
HlsMediaSource verwenden
Für weitere Anpassungsoptionen kannst du ein HlsMediaSource
erstellen und es direkt an den Player übergeben, anstatt an eine 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();
Auf das Manifest zugreifen
Sie können das aktuelle Manifest durch Aufrufen von Player.getCurrentManifest
abrufen.
Bei HLS sollten Sie das zurückgegebene Objekt in HlsManifest
umwandeln. Der onTimelineChanged
-Callback von Player.Listener
wird immer dann aufgerufen, wenn das Manifest geladen wird. Das passiert einmal bei On-Demand- und möglicherweise mehrmals bei Liveinhalten. Das folgende Code-Snippet zeigt, was eine App tun kann, wenn das Manifest geladen wird.
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. } } });
Wiedergabe anpassen
ExoPlayer bietet Ihnen mehrere Möglichkeiten, die Wiedergabe an die Anforderungen Ihrer App anzupassen. Beispiele finden Sie auf der Seite „Anpassen“.
Chunkless-Vorbereitung deaktivieren
Standardmäßig verwendet ExoPlayer die Vorbereitung in einem Chunk-Verfahren. ExoPlayer verwendet also nur die Informationen in der Playlist mit mehreren Varianten, um den Stream vorzubereiten. Dies funktioniert, wenn die #EXT-X-STREAM-INF
-Tags das Attribut CODECS
enthalten.
Unter Umständen müssen Sie diese Funktion deaktivieren, wenn Ihre Mediasegmente gemuxte Untertiteltracks enthalten, die in der Playlist mit mehreren Varianten nicht mit einem #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS
-Tag deklariert sind. Andernfalls werden diese Untertiteltracks weder erkannt noch abgespielt. Sie können die Vorbereitung ohne Chunk-Methode im HlsMediaSource.Factory
deaktivieren, wie im folgenden Snippet gezeigt. Dadurch verlängert sich die Startzeit, da ExoPlayer ein Mediensegment herunterladen muss, um diese zusätzlichen Titel zu erkennen. Außerdem sollten die Titel mit Untertiteln stattdessen in der Playlist mit mehreren Varianten deklariert werden.
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));
Hochwertige HLS-Inhalte erstellen
Damit Sie ExoPlayer optimal nutzen können, sollten Sie sich an bestimmte Richtlinien zur Verbesserung Ihrer HLS-Inhalte halten. Eine ausführliche Erläuterung findest du in unserem Medium-Beitrag zur HLS-Wiedergabe in ExoPlayer. Die wichtigsten Punkte sind:
- Verwenden Sie die genaue Segmentdauer.
- Verwenden Sie einen kontinuierlichen Medienstream. Vermeiden Sie segmentübergreifende Änderungen an der Medienstruktur.
- Verwende das Tag
#EXT-X-INDEPENDENT-SEGMENTS
. - Ich bevorzuge gemischte Streams statt Dateien, die sowohl Video- als auch Audioinhalte enthalten.
- Füge der Playlist mit mehreren Varianten alle möglichen Informationen hinzu.
Die folgenden Richtlinien gelten speziell für Livestreams:
- Verwende das Tag
#EXT-X-PROGRAM-DATE-TIME
. - Verwende das Tag
#EXT-X-DISCONTINUITY-SEQUENCE
. - Stellen Sie eine lange Live-Anzeige bereit. Eine Minute oder länger ist hervorragend.