Wprowadzenie do przesyłania strumieniowego HTTP na żywo: HLS na Androida i nie tylko

Opublikowany: 2022-03-11

Strumieniowe przesyłanie wideo jest integralną częścią współczesnego Internetu. Jest wszędzie: na telefonach komórkowych, komputerach stacjonarnych, telewizorach, a nawet urządzeniach do noszenia. Musi działać bezbłędnie na każdym urządzeniu i typie sieci, czy to na wolnych połączeniach mobilnych, Wi-Fi, za zaporami ogniowymi itp. Apple HTTP Live Streaming (HLS) został stworzony właśnie z myślą o tych wyzwaniach.

Prawie wszystkie nowoczesne urządzenia są wyposażone w nowoczesny sprzęt, który jest wystarczająco szybki, aby odtwarzać wideo, więc szybkość i niezawodność sieci stanowią największy problem. Dlaczego? Jeszcze kilka lat temu kanonicznym sposobem przechowywania i publikowania wideo były protokoły oparte na UDP, takie jak RTP. Okazało się to problematyczne pod wieloma względami, aby wymienić tylko kilka:

  1. Potrzebujesz usługi serwera (demon), aby przesyłać strumieniowo zawartość.
  2. Większość zapór jest skonfigurowana tak, aby zezwalać tylko na standardowe porty i typy ruchu sieciowego, takie jak http, e-mail itp.
  3. Jeśli twoja publiczność jest globalna, potrzebujesz kopii usługi demona przesyłania strumieniowego działającej we wszystkich głównych regionach.

Oczywiście możesz pomyśleć, że wszystkie te problemy są łatwe do rozwiązania. Po prostu przechowuj pliki wideo (na przykład pliki mp4) na swoim serwerze http i korzystaj z ulubionej usługi CDN, aby udostępniać je w dowolnym miejscu na świecie.

Gdzie starsze strumieniowanie wideo nie wystarcza

Nie jest to najlepsze rozwiązanie z kilku powodów, jednym z nich jest wydajność. Jeśli przechowujesz oryginalne pliki wideo w pełnej rozdzielczości, użytkownicy na obszarach wiejskich lub w częściach świata o słabej łączności będą mieli trudności z korzystaniem z nich. Ich odtwarzacze wideo będą miały trudności z pobraniem wystarczającej ilości danych, aby odtworzyć je w czasie wykonywania.

Dlatego potrzebujesz specjalnej wersji pliku, aby ilość pobranego wideo była w przybliżeniu taka sama, jaka może zostać odtworzona. Na przykład, jeśli rozdzielczość i jakość wideo są takie, że w ciągu pięciu sekund może pobrać kolejne pięć sekund wideo, jest to optymalne. Jeśli jednak pobranie tylko trzech sekund wideo zajmie pięć sekund, odtwarzacz zatrzyma się i poczeka na pobranie następnego fragmentu strumienia.

Z drugiej strony dalsze zmniejszanie jakości i rozdzielczości tylko pogorszyłoby wrażenia użytkownika na szybszych połączeniach, ponieważ niepotrzebnie oszczędzasz przepustowość. Jest jednak trzeci sposób.

Adaptacyjne przesyłanie strumieniowe z szybkością transmisji bitów

Chociaż możesz przesyłać różne wersje wideo dla różnych użytkowników, musisz mieć możliwość kontrolowania ich odtwarzaczy i obliczania, jaki jest najlepszy strumień dla ich połączenia i urządzenia. Następnie gracz musi się między nimi przełączać (na przykład, gdy użytkownik przełącza się z 3G na WiFi). A nawet wtedy, co jeśli klient zmieni typ sieci? Następnie odtwarzacz musi przełączyć się na inny film, ale musi zacząć grać nie od początku, ale gdzieś w środku filmu. Jak więc obliczyć żądany zakres bajtów?

Fajną rzeczą byłoby, gdyby odtwarzacze wideo mogły wykrywać zmiany w typie sieci i dostępnej przepustowości, a następnie przełączać się między różnymi strumieniami (tego samego wideo przygotowanego dla różnych prędkości), dopóki nie znajdą najlepszego.

Właśnie to rozwiązuje adaptacyjne przesyłanie strumieniowe z szybkością transmisji bitów.

Uwaga: ten samouczek HLS nie obejmuje szyfrowania, zsynchronizowanych odtwarzania i IMSC1.

Co to jest HLS?

HTTP Live Streaming to protokół przesyłania strumieniowego z adaptacyjną szybkością transmisji bitów wprowadzony przez firmę Apple w 2009 roku. Używa plików m3u8 do opisywania strumieni multimedialnych oraz protokołu HTTP do komunikacji między serwerem a klientem. Jest to domyślny protokół przesyłania strumieniowego multimediów dla wszystkich urządzeń z systemem iOS, ale może być używany w przeglądarkach Android i przeglądarkach internetowych.

Ilustracja okładki HTTP Live Streaming

Podstawowe elementy składowe strumieni HLS to:

  1. Listy odtwarzania M3U8
  2. Pliki multimedialne dla różnych strumieni

Listy odtwarzania M3U8

Zacznijmy od odpowiedzi na podstawowe pytanie: Czym są pliki M3U8 ?

M3U (lub M3U8) to format pliku tekstowego pierwotnie stworzony do organizowania kolekcji plików MP3. Format jest rozszerzony dla HLS, gdzie jest używany do definiowania strumieni mediów. W HLS istnieją dwa rodzaje plików m3u8:

  • Lista odtwarzania multimediów: zawierająca adresy URL plików potrzebnych do przesyłania strumieniowego (tj. fragmenty oryginalnego wideo do odtworzenia).
  • Główna playlista: zawiera adresy URL do playlist multimedialnych, które z kolei zawierają warianty tego samego wideo przygotowane dla różnych przepustowości.

Tak zwany adres URL transmisji na żywo M3U8 to nic innego jak adresy URL do plików M3U8, takie jak: https://s3-us-west-2.amazonaws.com/hls-playground/hls.m3u8.

Przykładowy plik M3U8 dla strumienia HLS

Plik M3U8 zawiera listę adresów URL lub lokalnych ścieżek plików z dodatkowymi metadanymi. Wiersze metadanych zaczynają się od #.

Ten przykład ilustruje, jak wygląda plik M3U8 dla prostego strumienia HLS:

 #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
  • Pierwsze cztery wiersze to globalne (nagłówkowe) metadane dla tej listy odtwarzania M3U8.
  • EXT-X-VERSION to wersja formatu M3U8 (musi być co najmniej 3, jeśli chcemy korzystać z wpisów EXTINF ).
  • Tag EXT-X-TARGETDURATION zawiera maksymalny czas trwania każdego „fragmentu” wideo. Zazwyczaj ta wartość wynosi około 10s.
  • Pozostała część dokumentu zawiera pary wierszy, takie jak:
 #EXTINF:10.344822, 00001.ts

To jest „kawałek” wideo. Ten reprezentuje fragment 00001.ts , który ma dokładnie 10,344822 sekund. Gdy klient odtwarzacza wideo musi uruchomić wideo od określonego punktu we wspomnianym filmie, może łatwo obliczyć, który plik .ts musi zażądać, sumując czas trwania poprzednio oglądanych fragmentów. Drugi wiersz może być lokalną nazwą pliku lub adresem URL tego pliku.

Plik M3U8 z plikami .ts reprezentuje najprostszą formę strumienia HLS – listę odtwarzania multimediów.

Pamiętaj, że nie każda przeglądarka może domyślnie odtwarzać strumienie HLS.

Główna lista odtwarzania lub indeks pliku M3U8

Poprzedni przykład M3U8 wskazuje na serię porcji .ts . Są one tworzone z oryginalnego pliku wideo, którego rozmiar jest zakodowany i dzielony na kawałki.

Oznacza to, że nadal mamy problem przedstawiony we wstępie – co z klientami w bardzo wolnych (lub niezwykle szybkich) sieciach? A może klienci w szybkich sieciach z bardzo małymi ekranami? Nie ma sensu przesyłać strumieniowo pliku w maksymalnej rozdzielczości, jeśli nie można go pokazać w całej okazałości na nowym, błyszczącym telefonie.

M3U8 w HSL

HLS rozwiązuje ten problem, wprowadzając kolejną „warstwę” M3U8. Ten plik M3U8 nie będzie zawierał wskaźników do plików .ts , ale ma wskaźniki do innych plików M3U8, które z kolei zawierają pliki wideo przygotowane wcześniej dla określonych przepływności i rozdzielczości.

Oto przykład takiego pliku M3U8:

 #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

Odtwarzacz wideo wybierze pary linii, takie jak:

 #EXT-X-STREAM-INF:BANDWIDTH=1296,RESOLUTION=640x360 https://.../640x360_1200.m3u8

Są to tak zwane warianty tego samego wideo przygotowane dla różnych prędkości sieci i rozdzielczości ekranu. Ten konkretny plik M3U8 ( 640x360_1200.m3u8 ) zawiera fragmenty plików wideo przeskalowanych do 640x360 pikseli i przygotowanych do bitrate 1296kbps . Zwróć uwagę, że raportowana szybkość transmisji bitów musi uwzględniać zarówno strumienie wideo, jak i audio w wideo.

Odtwarzacz wideo zwykle rozpocznie odtwarzanie od pierwszego wariantu strumienia (w poprzednim przykładzie jest to 640x360_1200.m3u8). Z tego powodu musisz szczególnie uważać, aby zdecydować, który wariant będzie pierwszy na liście. Kolejność pozostałych wariantów nie jest istotna.

Jeśli pobranie pierwszego pliku .ts trwa zbyt długo (powoduje „buforowanie”, tj. oczekiwanie na następny fragment), odtwarzacz wideo przełączy się na strumień o mniejszej przepływności. I oczywiście, jeśli ładuje się wystarczająco szybko, oznacza to, że może przełączyć się na wariant lepszej jakości, ale tylko wtedy, gdy ma to sens dla rozdzielczości wyświetlacza.

Jeśli pierwszy strumień na liście indeksu M3U8 nie jest najlepszy, klient będzie potrzebował jednego lub dwóch cykli, aż rozwiąże się z właściwym wariantem.

Tak więc teraz mamy trzy warstwy HLS:

  1. Plik indeksu M3U8 (główna lista odtwarzania) zawierający wskaźniki (adresy URL) do wariantów.
  2. Warianty plików M3U8 (lista odtwarzania multimediów) dla różnych strumieni dla różnych rozmiarów ekranu i prędkości sieci. Zawierają wskaźniki (adresy URL) do plików .ts.
  3. Pliki .ts (fragmenty) , które są plikami binarnymi z częściami filmu.

Przykładowy plik indeksu M3U8 można obejrzeć tutaj (ponownie, zależy to od przeglądarki/systemu operacyjnego).

Czasami wiesz z góry, że klient jest w wolnej lub szybkiej sieci. W takim przypadku możesz pomóc klientowi wybrać odpowiedni wariant, dostarczając plik indeksu M3U8 z innym pierwszym wariantem. Można to zrobić na dwa sposoby.

  • Pierwszym z nich jest przygotowanie wielu plików indeksowych dla różnych typów sieci i wcześniejsze przygotowanie klienta do żądania właściwego. Klient będzie musiał sprawdzić typ sieci, a następnie zażądać na przykład http://.../index_wifi.m3u8 lub http://.../index_mobile.m3u8 .
  • Możesz również upewnić się, że klient wysyła typ sieci jako część żądania http (na przykład jeśli jest podłączony do Wi-Fi lub mobilnego 2G/3G/…), a następnie dynamicznie przygotować plik indeksu M3U8 dla każdego żądania. Tylko plik indeksu M3U8 wymaga wersji dynamicznej, pojedyncze strumienie (pliki wariantów M3U8) nadal mogą być przechowywane jako pliki statyczne.

Przygotowywanie plików wideo do HLS

Istnieją dwa ważne elementy składowe HTTP Live Streaming firmy Apple. Jednym z nich jest sposób przechowywania plików wideo (które mają być później obsługiwane przez HTTP), a drugim są pliki indeksu M3U8 , które informują odtwarzacz (aplikację klienta przesyłania strumieniowego), gdzie pobrać plik wideo.

Zacznijmy od plików wideo. Protokół HLS oczekuje, że pliki wideo będą przechowywane w mniejszych fragmentach o równej długości, zwykle po 10 sekund. Pierwotnie pliki te musiały być przechowywane w plikach MPEG-2 TS ( .ts ) i zakodowane w formacie H.264 z dźwiękiem w formacie MP3, HE-AAC lub AC-3.

Wideo HLS

Oznacza to, że 30-sekundowy film zostanie podzielony na 3 mniejsze pliki .ts , każdy o długości około 10 sekund.

Uwaga, najnowsza wersja HLS pozwala również na pofragmentowane pliki .mp4. Ponieważ jest to wciąż nowa rzecz, a niektóre odtwarzacze wideo nadal muszą ją zaimplementować, przykłady w tym artykule będą używać plików .ts .

Klatki kluczowe

Fragmenty muszą być zakodowane z klatką kluczową na początku każdego pliku. Każdy film zawiera klatki. Ramki to obrazy, ale formaty wideo nie przechowują pełnych obrazów, które zajęłyby zbyt dużo miejsca na dysku. Kodują tylko różnicę z poprzedniej klatki. Kiedy przechodzisz do środkowego punktu wideo, odtwarzacz potrzebuje „punktu wyjścia”, z którego zastosować wszystkie te różnice, aby pokazać początkowy obraz, a następnie rozpocząć odtwarzanie wideo.

Dlatego fragmenty .ts muszą mieć na początku klatkę kluczową. Czasami gracze muszą zacząć od środka. Gracz zawsze może obliczyć bieżący obraz, dodając wszystkie „różnice” z pierwszej klatki kluczowej. Ale jeśli zaczyna się 9 sekund od początku, musi obliczyć 9 sekund „różnic”. Aby przyspieszyć obliczenia, najlepiej jest tworzyć klatki kluczowe co kilka sekund (najlepiej około 3 s).

Punkty przerwania HLS

Zdarzają się sytuacje, gdy chcesz odtwarzać wiele klipów wideo po kolei. Jednym ze sposobów, aby to zrobić, jest połączenie oryginalnych plików wideo, a następnie utworzenie strumieni HLS z tym plikiem, ale jest to problematyczne z wielu powodów. Co zrobić, jeśli chcesz wyświetlić reklamę przed filmem lub po nim? Może nie chcesz tego robić dla wszystkich użytkowników i prawdopodobnie chcesz różnych reklam dla różnych użytkowników. I oczywiście nie chcesz wcześniej przygotowywać plików HLS z różnymi reklamami.

Aby rozwiązać ten problem, istnieje tag #EXT-X-DISCONTINUITY , którego można użyć na liście odtwarzania m3u8. Ten wiersz w zasadzie mówi odtwarzaczowi wideo, aby przygotował się z wyprzedzeniem na to, że od tego momentu pliki .ts mogą być tworzone z inną konfiguracją (na przykład rozdzielczość może ulec zmianie). Gracz będzie musiał wszystko przekalkulować i ewentualnie przejść na inny wariant i musi być przygotowany na takie punkty „nieciągłości”.

Transmisja na żywo z HLS

Zasadniczo istnieją dwa rodzaje „strumieniowego przesyłania wideo”. Jednym z nich jest wideo na żądanie ( VOD ) dla filmów nagranych z wyprzedzeniem i przesyłanych strumieniowo do użytkownika, gdy zdecyduje się na to. I jest transmisja na żywo . Mimo że HLS to skrót od HTTP Live Streaming, wszystko wyjaśnione do tej pory koncentrowało się wokół VOD, ale istnieje również sposób na transmisję na żywo za pomocą HLS.

W plikach M3U8 jest kilka zmian. Po pierwsze, w pliku wariantu M3U8 musi znajdować się tag #EXT-X-MEDIA-SEQUENCE:1 . Wtedy plik M3U8 nie może kończyć się #EXT-X-ENDLIST (w przeciwnym razie zawsze musi być umieszczony na końcu).

Podczas nagrywania strumienia będziesz stale mieć nowe pliki .ts . Musisz dołączyć je do listy odtwarzania M3U8 i za każdym razem, gdy dodasz nowy licznik w #EXT-X-MEDIA-SEQUENCE:<counter> musi być zwiększony o 1.

Odtwarzacz wideo sprawdzi licznik. Jeśli zmieniono od ostatniego razu, wie, czy są nowe fragmenty do pobrania i odtworzenia. Upewnij się, że plik M3U8 jest obsługiwany z nagłówkami bez pamięci podręcznej, ponieważ klienci będą nadal ładować pliki M3U8, czekając na odtworzenie nowych fragmentów.

VTT

Inną interesującą funkcją strumieni HLS jest możliwość osadzania w nich plików Web Video Text Track (VTT). Pliki VTT mogą być używane do różnych zastosowań. Na przykład w przypadku odtwarzacza internetowego HLS można określić zrzuty obrazu dla różnych części wideo. Gdy użytkownik najedzie myszą na obszar licznika czasu wideo (pod odtwarzaczem wideo), odtwarzacz może wyświetlić migawki z tego miejsca w filmie.

Innym oczywistym zastosowaniem plików VTT są napisy. Strumień HLS może określić wiele napisów dla wielu języków:

 #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"

Wtedy theprog_index.m3u8 wygląda tak:

 #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 ...

Rzeczywisty VTT (na przykład 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>

Oprócz plików VTT firma Apple ogłosiła niedawno, że HLS będzie obsługiwał IMSC1, nowy format napisów zoptymalizowany pod kątem dostarczania strumieniowego. Jego najważniejszą zaletą jest to, że można go stylizować za pomocą CSS.

Narzędzia do transmisji na żywo HTTP i potencjalne problemy

Apple wprowadziło szereg przydatnych narzędzi HSL, które zostały szczegółowo opisane w oficjalnym przewodniku po HLS.

  • W przypadku transmisji na żywo firma Apple przygotowała narzędzie o nazwie mediastreamsegmenter do tworzenia plików segmentowych w locie z trwającego strumienia wideo.
  • Kolejnym ważnym narzędziem jest mediastreamvalidator . Sprawdzi twoje listy odtwarzania M3U8, pobierze pliki wideo i zgłosi różne problemy. Na przykład, gdy zgłoszona szybkość transmisji bitów nie jest taka sama, jak obliczona z plików .ts.
  • Oczywiście, gdy musisz kodować/dekodować/mux/demux/chunk/strip/merge/join/… pliki wideo/audio, jest ffmpeg. Przygotuj się do skompilowania własnych, niestandardowych wersji ffmpeg dla określonych przypadków użycia.

Jednym z najczęstszych problemów napotykanych w wideo jest synchronizacja dźwięku. Jeśli zauważysz, że dźwięk w niektórych strumieniach HLS nie jest zsynchronizowany z filmem (tj. aktor otwiera usta, ale zauważysz, że głos jest o kilka milisekund za wczesny lub spóźniony), możliwe, że oryginalny plik wideo został nagrany używając zmiennej liczby klatek na sekundę. Pamiętaj, aby przekonwertować go na stałą szybkość transmisji bitów.

Jeśli to możliwe, jeszcze lepiej jest upewnić się, że oprogramowanie jest ustawione na nagrywanie wideo ze stałą liczbą klatek na sekundę.

Przykład przesyłania strumieniowego HTTP na żywo

Przygotowałem aplikację HLS na Androida, która przesyła strumieniowo predefiniowany HLS za pomocą odtwarzacza Google ExoPlayer. Wyświetli wideo i listę „zdarzeń” HLS poniżej. Zdarzenia te obejmują: każdy pobrany plik .ts lub za każdym razem, gdy gracz zdecyduje się przełączyć na strumień o wyższej lub niższej przepływności.

Przejdźmy przez główne części inicjalizacji przeglądarki. W pierwszym kroku pobierzemy bieżący typ połączenia urządzenia i użyjemy tych informacji, aby zdecydować, który plik m3u8 pobrać.

 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;

Zauważ, że nie jest to absolutnie konieczne. Odtwarzacz HLS zawsze dostosuje się do właściwego wariantu HLS po kilku porcjach, ale oznacza to, że w ciągu pierwszych 5-20 sekund użytkownik może nie oglądać idealnego wariantu strumienia.

Pamiętaj, że pierwszy wariant w pliku m3u8 to ten, od którego zacznie przeglądarka. Ponieważ jesteśmy po stronie klienta i możemy wykryć typ połączenia, możemy przynajmniej spróbować uniknąć przełączania się między wariantami przez początkowego gracza, żądając pliku m3u8 , który jest wcześniej przygotowany dla tego typu połączenia.

W następnym kroku inicjujemy i uruchamiamy nasz odtwarzacz HLS:

 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);

Następnie przygotowujemy odtwarzacz i zasilamy go odpowiednim m3u8 dla tego typu połączenia sieciowego:

 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);

A oto wynik:

Przykład przesyłania strumieniowego HLS w systemie Android

Kompatybilność z przeglądarką HLS, przyszłe zmiany

Firma Apple wymaga , aby aplikacje do przesyłania strumieniowego wideo w systemie iOS używały HLS, jeśli filmy są dłuższe niż 10 minut lub większe niż 5 MB. To samo w sobie jest gwarancją, że HLS pozostanie. Pojawiły się pewne obawy dotyczące HLS i MPEG-DASH oraz tego, który z nich będzie zwycięzcą na arenie przeglądarek internetowych. HLS nie jest zaimplementowany we wszystkich nowoczesnych przeglądarkach (prawdopodobnie zauważyłeś, że jeśli kliknąłeś poprzednie przykłady adresów URL m3u8). Na przykład na Androidzie w wersjach niższych niż 4.0 w ogóle nie będzie działać. Od 4.1 do 4.4 działa tylko częściowo (na przykład brak dźwięku lub brak obrazu, ale dźwięk działa).

Ale ta „bitwa” stała się ostatnio nieco prostsza. Apple ogłosił, że nowy protokół HLS pozwoli na fragmentację plików mp4 ( fMP4 ). Wcześniej, jeśli chciałeś mieć obsługę zarówno HLS, jak i MPEG-DASH, musiałeś dwukrotnie kodować swoje filmy. Teraz będziesz mógł ponownie wykorzystać te same pliki wideo i przepakować tylko pliki metadanych ( .m3u8 dla HLS i .mpd dla MPEG-DASH).

Kolejną niedawną zapowiedzią jest obsługa kodeka High Efficiency Video Codec (HEVC). Jeśli jest używany, musi być spakowany w pofragmentowanych plikach mp4. A to prawdopodobnie oznacza, że ​​przyszłością HLS jest fMP4 .

Obecna sytuacja w świecie przeglądarek jest taka, że ​​tylko niektóre implementacje tagu <video> w przeglądarkach będą odtwarzać HLS po wyjęciu z pudełka. Istnieją jednak rozwiązania typu open source i komercyjne, które zapewniają kompatybilność z HLS. Większość z nich oferuje HLS z opcją Flashback, ale istnieje kilka implementacji całkowicie napisanych w JavaScript.

Zawijanie

Ten artykuł koncentruje się w szczególności na przesyłaniu strumieniowym HTTP na żywo, ale koncepcyjnie można go również czytać jako wyjaśnienie działania Adaptive Bitrate Streaming (ABS). Podsumowując, możemy powiedzieć, że HLS to technologia, która rozwiązuje wiele ważnych problemów związanych z przesyłaniem strumieniowym wideo:

  • Upraszcza przechowywanie plików wideo
  • CDN
  • Odtwarzacze klienckie obsługujące różne przepustowości klientów i przełączające się między strumieniami
  • Napisy, szyfrowanie, zsynchronizowane odtwarzanie i inne funkcje nieomówione w tym artykule

Niezależnie od tego, czy używasz HLS, czy MPEG-DASH, oba protokoły powinny oferować podobne funkcje, a wraz z wprowadzeniem pofragmentowanego mp4 (fMP4) w HLS możesz używać tych samych plików wideo. Oznacza to, że w większości przypadków będziesz musiał zrozumieć podstawy obu protokołów. Na szczęście wydają się zmierzać w tym samym kierunku, co powinno ułatwić ich opanowanie.