HLS

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.