Einführung in das HTTP-Live-Streaming: HLS auf Android und mehr
Veröffentlicht: 2022-03-11Videostreaming ist ein wesentlicher Bestandteil des modernen Interneterlebnisses. Es ist überall: auf Mobiltelefonen, Desktop-Computern, Fernsehern und sogar Wearables. Es muss auf jedem Gerät und Netzwerktyp einwandfrei funktionieren, sei es bei langsamen Mobilfunkverbindungen, WLAN, hinter Firewalls usw. Apples HTTP Live Streaming (HLS) wurde genau für diese Herausforderungen entwickelt.
Fast alle modernen Geräte sind mit moderner Hardware ausgestattet, die schnell genug ist, um Videos abzuspielen, sodass sich die Netzwerkgeschwindigkeit und -zuverlässigkeit als größtes Problem herausstellt. Warum ist das so? Bis vor einigen Jahren waren UDP-basierte Protokolle wie RTP die kanonische Methode zum Speichern und Veröffentlichen von Videos. Dies erwies sich in vielerlei Hinsicht als problematisch, um nur einige aufzuzählen:
- Sie benötigen einen Serverdienst (Daemon), um Inhalte zu streamen.
- Die meisten Firewalls sind so konfiguriert, dass sie nur Standardports und Netzwerkverkehrstypen wie http, E-Mail usw. zulassen.
- Wenn Ihr Publikum global ist, benötigen Sie eine Kopie Ihres Streaming-Daemon-Dienstes, der in allen wichtigen Regionen ausgeführt wird.
Natürlich denken Sie vielleicht, dass all diese Probleme einfach zu lösen sind. Speichern Sie einfach Videodateien (z. B. mp4-Dateien) auf Ihrem HTTP-Server und verwenden Sie Ihren bevorzugten CDN-Dienst, um sie überall auf der Welt bereitzustellen.
Wo herkömmliches Video-Streaming zu kurz kommt
Dies ist aus mehreren Gründen bei weitem nicht die beste Lösung, Effizienz ist einer davon. Wenn Sie Original-Videodateien in voller Auflösung speichern, werden Benutzer in ländlichen Gebieten oder Teilen der Welt mit schlechter Konnektivität Schwierigkeiten haben, sie zu genießen. Ihre Videoplayer werden Schwierigkeiten haben, genügend Daten herunterzuladen, um sie zur Laufzeit abzuspielen.
Daher benötigen Sie eine spezielle Version der Datei, damit die heruntergeladene Videomenge ungefähr der abspielbaren entspricht. Wenn beispielsweise die Videoauflösung und -qualität so sind, dass in fünf Sekunden weitere fünf Sekunden Video heruntergeladen werden können, ist das optimal. Wenn es jedoch fünf Sekunden dauert, um nur ein Video im Wert von drei Sekunden herunterzuladen, stoppt der Player und wartet darauf, dass der nächste Teil des Streams heruntergeladen wird.
Andererseits würde eine weitere Verringerung der Qualität und Auflösung die Benutzererfahrung bei schnelleren Verbindungen nur verschlechtern, da Sie unnötig Bandbreite sparen würden. Es gibt jedoch noch einen dritten Weg.
Adaptives Bitraten-Streaming
Während Sie verschiedene Videoversionen für verschiedene Benutzer hochladen könnten, müssten Sie dann die Möglichkeit haben, ihre Player zu steuern und zu berechnen, was der beste Stream für ihre Verbindung und ihr Gerät ist. Dann muss der Player zwischen ihnen wechseln (z. B. wenn ein Benutzer von 3G zu WiFi wechselt). Und selbst dann, was ist, wenn der Client den Netzwerktyp ändert? Dann muss der Player auf ein anderes Video umschalten, aber die Wiedergabe muss nicht von Anfang an beginnen, sondern irgendwo in der Mitte des Videos. Wie berechnen Sie also den anzufordernden Bytebereich?
Eine coole Sache wäre, wenn Videoplayer Änderungen des Netzwerktyps und der verfügbaren Bandbreite erkennen und dann transparent zwischen verschiedenen Streams wechseln könnten (des gleichen Videos, das für unterschiedliche Geschwindigkeiten vorbereitet ist), bis es den besten findet.
Genau das löst Adaptive Bitrate Streaming.
Hinweis: In diesem HLS-Tutorial werden Verschlüsselung, synchronisierte Wiedergaben und IMSC1 nicht behandelt.
Was ist HLS?
HTTP Live Streaming ist ein Streaming-Protokoll mit adaptiver Bitrate, das 2009 von Apple eingeführt wurde. Es verwendet m3u8-Dateien zur Beschreibung von Medienströmen und HTTP für die Kommunikation zwischen dem Server und dem Client. Es ist das Standard-Medien-Streaming-Protokoll für alle iOS-Geräte, kann aber auf Android- und Webbrowsern verwendet werden.
Die grundlegenden Bausteine eines HLS-Streams sind:
- M3U8-Wiedergabelisten
- Mediendateien für verschiedene Streams
M3U8-Wiedergabelisten
Beginnen wir mit der Beantwortung einer grundlegenden Frage: Was sind M3U8-Dateien ?
M3U (oder M3U8) ist ein Nur-Text-Dateiformat, das ursprünglich zum Organisieren von Sammlungen von MP3-Dateien erstellt wurde. Das Format wird für HLS erweitert, wo es zum Definieren von Medienstreams verwendet wird. In HLS gibt es zwei Arten von m3u8-Dateien:
- Medienwiedergabeliste: Enthält URLs der Dateien, die für das Streaming benötigt werden (dh Teile des Originalvideos, die abgespielt werden sollen).
- Master-Playlist: Enthält URLs zu Media-Playlists, die wiederum Varianten desselben Videos enthalten, die für unterschiedliche Bandbreiten vorbereitet wurden.
Eine sogenannte M3U8-Livestream-URL ist nichts anderes als URLs zu M3U8-Dateien, wie zum Beispiel: https://s3-us-west-2.amazonaws.com/hls-playground/hls.m3u8.
M3U8-Beispieldatei für HLS-Stream
Eine M3U8-Datei enthält eine Liste von URLs oder lokalen Dateipfaden mit einigen zusätzlichen Metadaten. Metadatenzeilen beginnen mit #.
Dieses Beispiel zeigt, wie eine M3U8-Datei für einen einfachen HLS-Stream aussieht:
#EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-ALLOW-CACHE:YES #EXT-X-TARGETDURATION:11 #EXTINF:5.215111, 00000.ts #EXTINF:10.344822, 00001.ts #EXTINF:10.344822, 00002.ts #EXTINF:9.310344, 00003.ts #EXTINF:10.344822, 00004.ts ... #EXT-X-ENDLIST
- Die ersten vier Zeilen sind globale (Header-)Metadaten für diese M3U8-Wiedergabeliste.
- Die
EXT-X-VERSION
ist die Version des M3U8-Formats (muss mindestens 3 sein, wenn wirEXTINF
Einträge verwenden wollen). - Das
EXT-X-TARGETDURATION
Tag enthält die maximale Dauer jedes Video-„Blöckes“. Typischerweise liegt dieser Wert bei etwa 10 s. - Der Rest des Dokuments enthält Zeilenpaare wie:
#EXTINF:10.344822, 00001.ts
Dies ist ein Video-„Stück“. Dieser stellt den 00001.ts
Chunk dar, der genau 10,344822 Sekunden lang ist. Wenn ein Client-Videoplayer ein Video an einem bestimmten Punkt in diesem Video starten muss, kann er leicht berechnen, welche .ts
-Datei er anfordern muss, indem er die Dauer der zuvor angesehenen Abschnitte addiert. Die zweite Zeile kann ein lokaler Dateiname oder eine URL zu dieser Datei sein.
Die M3U8-Datei mit ihren .ts
-Dateien stellt die einfachste Form eines HLS-Streams dar – eine Media-Playlist.
Bitte beachten Sie, dass nicht jeder Browser standardmäßig HLS-Streams abspielen kann.
Master-Playlist oder Index-M3U8-Datei
Das vorherige M3U8-Beispiel zeigt auf eine Reihe von .ts
-Chunks. Sie werden aus der ursprünglichen Videodatei erstellt, die in der Größe geändert, kodiert und in Stücke geteilt wird.
Das bedeutet, dass wir immer noch das in der Einleitung beschriebene Problem haben – was ist mit Clients in sehr langsamen (oder ungewöhnlich schnellen) Netzwerken? Oder Clients in schnellen Netzwerken mit sehr kleinen Bildschirmgrößen? Es macht keinen Sinn, eine Datei in maximaler Auflösung zu streamen, wenn sie nicht in ihrer ganzen Pracht auf Ihrem glänzenden neuen Telefon angezeigt werden kann.
HLS löst dieses Problem, indem es eine weitere „Schicht“ von M3U8 einführt. Diese M3U8-Datei enthält keine Verweise auf .ts
-Dateien, aber Verweise auf andere M3U8-Dateien, die wiederum Videodateien enthalten, die im Voraus für bestimmte Bitraten und Auflösungen vorbereitet wurden.
Hier ist ein Beispiel für eine solche M3U8-Datei:
#EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=1296,RESOLUTION=640x360 https://.../640x360_1200.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=264,RESOLUTION=416x234 https://.../416x234_200.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=464,RESOLUTION=480x270 https://.../480x270_400.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1628,RESOLUTION=960x540 https://.../960x540_1500.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2628,RESOLUTION=1280x720 https://.../1280x720_2500.m3u8
Der Videoplayer wählt Zeilenpaare aus, z. B.:
#EXT-X-STREAM-INF:BANDWIDTH=1296,RESOLUTION=640x360 https://.../640x360_1200.m3u8
Diese werden als Varianten desselben Videos bezeichnet, die für unterschiedliche Netzwerkgeschwindigkeiten und Bildschirmauflösungen vorbereitet wurden. Diese spezielle M3U8-Datei ( 640x360_1200.m3u8
) enthält die Videodatei-Blöcke des Videos, die auf 640x360 Pixel skaliert und für Bitraten von 1296kbps vorbereitet wurden. Beachten Sie, dass die gemeldete Bitrate sowohl die Video- als auch die Audiostreams im Video berücksichtigen muss.
Der Videoplayer beginnt normalerweise mit der Wiedergabe ab der ersten Stream- Variante (im vorherigen Beispiel ist dies 640x360_1200.m3u8). Aus diesem Grund müssen Sie besonders sorgfältig entscheiden, welche Variante die erste in der Liste sein wird. Die Reihenfolge der anderen Varianten ist nicht wichtig.
Wenn das Herunterladen der ersten .ts-Datei zu lange dauert (was „Pufferung“ verursacht, dh auf den nächsten Chunk wartet), wechselt der Videoplayer zu einem Stream mit einer kleineren Bitrate. Und natürlich bedeutet es, wenn es schnell genug geladen wird, dass es zu einer qualitativ besseren Variante wechseln kann, aber nur, wenn es für die Auflösung des Displays sinnvoll ist.
Ist der erste Stream in der Index-M3U8-Liste nicht der beste, braucht der Client ein bis zwei Zyklen, bis er sich bei der richtigen Variante einpendelt.
Jetzt haben wir also drei Ebenen von HLS:
- Indizieren Sie die M3U8-Datei (die Master-Wiedergabeliste) , die Verweise (URLs) auf Varianten enthält.
- Varianten von M3U8-Dateien (die Medienwiedergabeliste) für verschiedene Streams für verschiedene Bildschirmgrößen und Netzwerkgeschwindigkeiten. Sie enthalten Verweise (URLs) auf .ts-Dateien.
-
.ts
-Dateien (Chunks) , bei denen es sich um Binärdateien mit Teilen des Videos handelt.
Sie können sich hier eine Beispiel-Index-M3U8-Datei ansehen (auch hier hängt es von Ihrem Browser/Betriebssystem ab).
Manchmal wissen Sie im Voraus, dass sich der Client in einem langsamen oder schnellen Netzwerk befindet. In diesem Fall können Sie dem Kunden helfen, die richtige Variante auszuwählen, indem Sie eine Index-M3U8-Datei mit einer anderen ersten Variante bereitstellen. Dazu gibt es zwei Möglichkeiten.
- Die erste besteht darin, mehrere Indexdateien für verschiedene Netzwerktypen vorzubereiten und den Client im Voraus darauf vorzubereiten, die richtige anzufordern. Der Client muss den Netzwerktyp überprüfen und dann beispielsweise
http://.../index_wifi.m3u8
oderhttp://.../index_mobile.m3u8
. - Sie können auch sicherstellen, dass der Client den Netzwerktyp als Teil der HTTP-Anforderung sendet (z. B. wenn er mit einem WLAN oder einem mobilen 2G/3G/… verbunden ist) und dann die Index-M3U8-Datei dynamisch für jede Anforderung vorbereiten lassen. Nur die Index-M3U8-Datei benötigt eine dynamische Version, die einzelnen Streams (Varianten-M3U8-Dateien) können weiterhin als statische Dateien gespeichert werden.
Vorbereiten von Videodateien für HLS
Es gibt zwei wichtige Bausteine von Apples HTTP Live Streaming. Einer ist die Art und Weise, wie Videodateien gespeichert werden (um später über HTTP bereitgestellt zu werden), und der andere sind die M3U8- Indexdatei(en), die dem Player (der Streaming-Client-App) mitteilt, wo er welche Videodatei erhalten soll.
Beginnen wir mit Videodateien. Das HLS-Protokoll erwartet, dass die Videodateien in kleineren Blöcken gleicher Länge gespeichert werden, typischerweise jeweils 10 Sekunden. Ursprünglich mussten diese Dateien in MPEG-2 TS-Dateien ( .ts
) gespeichert und mit dem H.264-Format mit Audio in MP3, HE-AAC oder AC-3 codiert werden.
Das bedeutet, dass ein 30 Sekunden langes Video in 3 kleinere .ts
-Dateien aufgeteilt wird, die jeweils ungefähr 10 Sekunden lang sind.
Beachten Sie, dass die neueste Version von HLS auch fragmentierte .mp4-Dateien zulässt. Da dies noch eine neue Sache ist und einige Videoplayer sie noch implementieren müssen, verwenden die Beispiele in diesem Artikel .ts
-Dateien.

Keyframes
Chunks müssen am Anfang jeder Datei mit einem Schlüsselbild codiert werden. Jedes Video enthält Frames. Frames sind Bilder, aber Videoformate speichern keine vollständigen Bilder, das würde zu viel Speicherplatz beanspruchen. Sie codieren nur den Unterschied zum vorherigen Frame. Wenn Sie zu einem Mittelpunkt im Video springen, benötigt der Player einen „Startpunkt“, von dem aus er all diese Unterschiede anwenden kann, um das Anfangsbild anzuzeigen und dann mit der Wiedergabe des Videos zu beginnen.
Aus diesem Grund müssen .ts
-Chunks am Anfang einen Keyframe haben. Manchmal müssen Spieler in der Mitte des Chunks beginnen. Der Spieler kann immer das aktuelle Bild berechnen, indem er alle „Diffs“ vom ersten Keyframe hinzufügt. Aber wenn es 9 Sekunden nach dem Start startet, muss es 9 Sekunden „Unterschiede“ berechnen. Um diese Berechnung zu beschleunigen, erstellen Sie am besten alle paar Sekunden Keyframes (am besten ca. 3 Sekunden).
HLS-Haltepunkte
Es gibt Situationen, in denen Sie möchten, dass mehrere Videoclips nacheinander abgespielt werden. Eine Möglichkeit besteht darin, die ursprünglichen Videodateien zusammenzuführen und dann die HLS-Streams mit dieser Datei zu erstellen, aber das ist aus mehreren Gründen problematisch. Was ist, wenn Sie vor oder nach Ihrem Video eine Anzeige schalten möchten? Vielleicht möchten Sie dies nicht für alle Benutzer tun, und wahrscheinlich möchten Sie unterschiedliche Anzeigen für verschiedene Benutzer. Und natürlich möchten Sie nicht im Voraus HLS-Dateien mit verschiedenen Anzeigen vorbereiten.
Um dieses Problem zu beheben, gibt es einen Tag #EXT-X-DISCONTINUITY
, der in der m3u8-Playlist verwendet werden kann. Diese Zeile weist den Videoplayer im Grunde darauf hin, sich darauf vorzubereiten, dass ab diesem Zeitpunkt die .ts
-Dateien möglicherweise mit einer anderen Konfiguration erstellt werden (z. B. die Auflösung kann sich ändern). Der Spieler muss alles neu berechnen und eventuell auf eine andere Variante umsteigen und er muss auf solche „Abbruchstellen“ vorbereitet sein.
Live-Streaming mit HLS
Grundsätzlich gibt es zwei Arten von „Video-Streaming“. Eine davon ist Video On Demand ( VOD ) für Videos, die im Voraus aufgezeichnet und an den Benutzer gestreamt werden, wenn er sich dafür entscheidet. Und es gibt Live-Streaming . Obwohl HLS eine Abkürzung für HTTP Live Streaming ist, dreht sich alles bisher Erklärte um VOD, aber es gibt auch eine Möglichkeit, Live-Streaming mit HLS zu machen.
Es gibt ein paar Änderungen in Ihren M3U8-Dateien. Erstens muss ein Tag #EXT-X-MEDIA-SEQUENCE:1
in der Variante M3U8-Datei vorhanden sein. Dann darf die M3U8-Datei nicht mit #EXT-X-ENDLIST
(die sonst immer am Ende stehen muss).
Während Sie Ihren Stream aufzeichnen, werden Sie ständig neue .ts
-Dateien haben. Sie müssen sie in der M3U8-Playlist anhängen und jedes Mal, wenn Sie eine neue hinzufügen, muss der Zähler in der #EXT-X-MEDIA-SEQUENCE:<counter>
um 1 erhöht werden.
Der Videoplayer überprüft den Zähler. Wenn es sich seit dem letzten Mal geändert hat, weiß es, ob neue Chunks heruntergeladen und abgespielt werden müssen. Stellen Sie sicher, dass die M3U8-Datei mit No-Cache-Headern bereitgestellt wird, da Clients M3U8-Dateien immer wieder neu laden und darauf warten, dass neue Chunks abgespielt werden.
VTT
Ein weiteres interessantes Feature für HLS-Streams ist, dass Sie Web Video Text Track (VTT)-Dateien darin einbetten können. VTT-Dateien können für verschiedene Zwecke verwendet werden. Für einen Web-HLS-Player können Sie beispielsweise Bildschnappschüsse für verschiedene Teile des Videos angeben. Wenn der Benutzer die Maus über den Videotimerbereich (unter dem Videoplayer) bewegt, kann der Player Schnappschüsse von dieser Position im Video anzeigen.
Eine weitere offensichtliche Verwendung für VTT-Dateien sind Untertitel. Der HLS-Stream kann mehrere Untertitel für mehrere Sprachen angeben:
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-,NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog, public.accessibility.describes-music-and-sound",URI="subtitles/eng/prog_index.m3u8"
Dann sieht theprog_index.m3u8
so aus:
#EXTM3U #EXT-X-TARGETDURATION:30 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:30, 0000.webvtt #EXTINF:30, 0001.webvtt ...
Die eigentliche VTT (zum Beispiel 0000.webvtt
):
WEBVTT X-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000 00:00:01.000 --> 00:00:03.000 Subtitle -Unforced- (00:00:01.000) 00:00:03.000 --> 00:00:05.000 <i>...text here... -Unforced- (00:00:03.000)</i> <i>...text here...</i>
Zusätzlich zu VTT-Dateien hat Apple kürzlich angekündigt, dass HLS Unterstützung für IMSC1 bieten wird, ein neues Untertitelformat, das für die Streaming-Bereitstellung optimiert ist. Sein wichtigster Vorteil ist, dass es mit CSS gestaltet werden kann.
HTTP-Live-Streaming-Tools und potenzielle Probleme
Apple hat eine Reihe nützlicher HSL-Tools eingeführt, die im offiziellen HLS-Leitfaden ausführlicher beschrieben werden.
- Für Live-Streams hat Apple ein Tool namens
mediastreamsegmenter
vorbereitet, um Segmentdateien spontan aus einem laufenden Videostream zu erstellen. - Ein weiteres wichtiges Tool ist
mediastreamvalidator
. Es überprüft Ihre M3U8-Wiedergabelisten, lädt die Videodateien herunter und meldet verschiedene Probleme. Zum Beispiel, wenn die gemeldete Bitrate nicht mit der aus den .ts-Dateien berechneten übereinstimmt. - Wenn Sie Video-/Audiodateien codieren/decodieren/mux/demux/chunk/strip/merge/join/… müssen, gibt es natürlich ffmpeg. Seien Sie bereit, Ihre eigenen benutzerdefinierten Versionen von ffmpeg für bestimmte Anwendungsfälle zu kompilieren.
Eines der häufigsten Probleme bei Videos ist die Audiosynchronisation. Wenn Sie feststellen, dass Audio in einigen Ihrer HLS-Streams nicht mit dem Video synchron ist (z. B. ein Schauspieler öffnet den Mund, aber Sie bemerken, dass die Stimme einige Millisekunden zu früh oder zu spät kommt), ist es möglich, dass die ursprüngliche Videodatei gefilmt wurde mit einer variablen Framerate. Stellen Sie sicher, dass Sie es in eine konstante Bitrate konvertieren.
Wenn möglich, ist es sogar noch besser sicherzustellen, dass Ihre Software so eingestellt ist, dass sie Videos mit einer konstanten Framerate aufzeichnet.
Beispiel für HTTP-Live-Streaming
Ich habe eine HLS-Android-Anwendung vorbereitet, die ein vordefiniertes HLS mit dem ExoPlayer-Player von Google streamt. Es zeigt ein Video und darunter eine Liste von HLS-„Ereignissen“. Zu diesen Ereignissen gehören: jede heruntergeladene .ts
-Datei oder jedes Mal, wenn der Player entscheidet, zu einem Stream mit höherer oder niedrigerer Bitrate zu wechseln.
Lassen Sie uns die Hauptteile der Viewer-Initialisierung durchgehen. Im ersten Schritt rufen wir den aktuellen Verbindungstyp des Geräts ab und verwenden diese Informationen, um zu entscheiden, welche m3u8
-Datei abgerufen werden soll.
String m3u8File = "hls.m3u8"; ConnectivityManager connectivity = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = connectivity.getActiveNetworkInfo(); if (activeNetwork != null && activeNetwork.isConnectedOrConnecting()) { int type = activeNetwork.getType(); int subType = activeNetwork.getSubtype(); if (type == ConnectivityManager.TYPE_MOBILE && subType == TelephonyManager.NETWORK_TYPE_GPRS) { m3u8File = "hls_gprs.m3u8"; } } String m3u8URL = "https://s3-us-west-2.amazonaws.com/hls-playground/" + m3u8File;
Beachten Sie, dass dies nicht unbedingt erforderlich ist. Der HLS-Player stellt sich nach einigen Chunks immer auf die richtige HLS-Variante ein, aber das bedeutet, dass der Benutzer in den ersten 5-20 Sekunden möglicherweise nicht die ideale Variante des Streams sieht.
Denken Sie daran, dass die erste Variante in der m3u8
-Datei diejenige ist, mit der der Betrachter beginnt. Da wir auf der Client-Seite sind und den Verbindungstyp erkennen können, können wir zumindest versuchen, den anfänglichen Variantenwechsel des Spielers zu vermeiden, indem wir die für diesen Verbindungstyp vorab vorbereitete m3u8
-Datei anfordern.
Im nächsten Schritt initialisieren und starten wir unseren HLS-Player:
Handler mainHandler = new Handler(); DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder() .setEventListener(mainHandler, bandwidthMeterEventListener) .build(); TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter); TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); LoadControl loadControl = new DefaultLoadControl(); SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
Dann bereiten wir den Player vor und füttern ihn mit dem richtigen m3u8 für diesen Netzwerkverbindungstyp:
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "example-hls-app"), bandwidthMeter); HlsMediaSource videoSource = new HlsMediaSource(Uri.parse(m3u8URL), dataSourceFactory, 5, mainHandler, eventListener); player.prepare(videoSource);
Und hier ist das Ergebnis:
HLS-Browserkompatibilität, zukünftige Entwicklungen
Es gibt eine Anforderung von Apple für Video-Streaming-Apps unter iOS, dass sie HLS verwenden müssen , wenn die Videos länger als 10 Minuten oder größer als 5 MB sind. Das allein ist eine Garantie dafür, dass HLS hier bleiben wird. Es gab einige Bedenken über HLS und MPEG-DASH und darüber, welcher der Gewinner in der Webbrowser-Arena sein wird. HLS ist nicht in allen modernen Browsern implementiert (das haben Sie wahrscheinlich bemerkt, als Sie auf die vorherigen m3u8-URL-Beispiele geklickt haben). Auf Android zum Beispiel in Versionen kleiner als 4.0 funktioniert es überhaupt nicht. Von 4.1 bis 4.4 funktioniert es nur teilweise (z. B. fehlt der Ton oder das Video fehlt, aber der Ton funktioniert).
Aber dieser „Kampf“ ist in letzter Zeit etwas einfacher geworden. Apple hat angekündigt, dass das neue HLS-Protokoll fragmentierte mp4-Dateien ( fMP4
) zulassen wird. Wenn Sie zuvor sowohl HLS- als auch MPEG-DASH-Unterstützung haben wollten, mussten Sie Ihre Videos zweimal codieren. Jetzt können Sie dieselben Videodateien wiederverwenden und nur die Metadatendateien neu packen ( .m3u8
für HLS und .mpd
für MPEG-DASH).
Eine weitere aktuelle Ankündigung ist die Unterstützung für High Efficiency Video Codec (HEVC). Wenn es verwendet wird, muss es in fragmentierte mp4-Dateien gepackt werden. Und das bedeutet wahrscheinlich, dass die Zukunft von HLS fMP4
ist.
Die aktuelle Situation in der Welt der Browser ist, dass nur einige Browser-Implementierungen des <video>
-Tags HLS standardmäßig abspielen. Es gibt jedoch Open-Source- und kommerzielle Lösungen, die HLS-Kompatibilität bieten. Die meisten von ihnen bieten HLS mit einem Flash-Fallback an, aber es gibt einige Implementierungen, die vollständig in JavaScript geschrieben sind.
Einpacken
Dieser Artikel konzentriert sich speziell auf das HTTP-Live-Streaming, kann aber konzeptionell auch als Erläuterung der Funktionsweise von Adaptive Bitrate Streaming (ABS) gelesen werden. Zusammenfassend können wir sagen, dass HLS eine Technologie ist, die zahlreiche wichtige Probleme beim Videostreaming löst:
- Es vereinfacht die Speicherung von Videodateien
- CDN
- Client-Player, die unterschiedliche Client-Bandbreiten handhaben und zwischen Streams wechseln
- Untertitel, Verschlüsselung, synchronisierte Wiedergaben und andere Funktionen, die in diesem Artikel nicht behandelt werden
Unabhängig davon, ob Sie letztendlich HLS oder MPEG-DASH verwenden, sollten beide Protokolle ähnliche Funktionen bieten, und mit der Einführung von fragmentiertem mp4 (fMP4) in HLS können Sie dieselben Videodateien verwenden. Das bedeutet, dass Sie in den meisten Fällen die Grundlagen beider Protokolle verstehen müssen. Glücklicherweise scheinen sie sich in die gleiche Richtung zu bewegen, was es einfacher machen sollte, sie zu meistern.