HLS (HTTP Live Streaming) — это коммуникационный протокол для потоковой передачи медиа на основе HTTP, разработанный компанией Apple как часть программного обеспечения QuickTime, Safari, OS X и iOS. В основе работы лежит принцип разбиения цельного потока на небольшие фрагменты, последовательно скачиваемые по HTTP. В начале сессии скачивается плей-лист в формате M3U, содержащий метаданные об имеющихся вложенных потоках.
Одним из преимуществ HLS является то, что все подключенные к Интернету устройства поддерживают протокол HTTP, что упрощает его реализацию, чем протоколы потоковой передачи, требующие использования специализированных серверов. Еще одно преимущество состоит в том, что поток HLS может повышать или понижать качество видео в зависимости от состояния сети без прерывания воспроизведения. Вот почему качество видео может улучшаться или ухудшаться в середине видео, когда пользователь его смотрит. Эта функция известна как «доставка видео с адаптивной скоростью передачи» или «адаптивный стриминг», и без нее медленные сетевые условия могут полностью остановить воспроизведение видео.
Основная информация
HTTP Live Streaming состоит из трех частей: серверного компонента, компонента распространения и клиентского программного обеспечения.
Вначале кодер принимает аудио-видео и кодирует видео в HEVC, а аудио в AC-3. Всё это вкладывается в транспортный поток MPEG-2 для последующей доставки. Затем разделитель (software stream segmenter) разбивает контент в MPEG-2 TS на фрагменты одинаковой длины (с разрешением .ts), которые размещаются на веб-сервере. Разделитель также создает индексный файл, называемый manifest file (с разрешением .m3u8), который содержит список самих медиафайлов. URL-адрес индексного файла публикуется на веб-сервере. Клиентское программное обеспечение считывает индекс, затем запрашивает перечисленные медиафайлы по порядку и отображает их без каких-либо пауз или промежутков между сегментами.

Клиент
Клиент запрашивает и скачивает все файлы, собирая их воедино так, чтобы предоставить пользователю непрерывный поток видео. Клиентское ПО скачивает первый индексный файл через URL и далее несколько доступных файлов медиа. ПО для проигрывания собирает всё в последовательность для воспроизведения. Существует два режима работы HLS — «по запросу» и живая трансляция. В режиме «по запросу» плей-лист содержит ссылки на все фрагменты от первого до последнего. В режиме живой трансляции плей-лист содержит только ссылки на последние несколько фрагментов, кроме того при последующих обращениях к плей-листу, фрагменты будут меняться, отражая текущее состояние трансляции.
HLS предусматривает поддержку адаптивного битрейта, эта техника предусматривает наличие нескольких одновременно доступных потоков, каждый из которых может содержать одинаковый контент, закодированный в разных битрейтах, а также имеющий другие отличающиеся характеристики. По мере проигрывания клиент может выбирать из числа нескольких доступных потоков, что позволяет адаптировать сессию к внешним условиям передачи по сети.
HLS Playlist
Манифесты (индексные файлы) HLS бывают двух типов – основные и дочерние. Чтобы понять, как они связаны, возьмем простой пример. Предположим, что вы закодировали фильм в 3 разных разрешениях – 1080p, 720p, 480p. После того, как вы упакуете пакет с использованием протокола HLS, вы получите один основной и 3 дочерних манифеста.
В главном манифесте будут описаны версии и их спецификации (кодеки, языки, битрейты), которые будут транслироваться как часть этого видео. В дочерних манифестах будут перечислены все сегменты (местоположение, имена, последовательность) для соответствующих разрешений. В этом случае у вас будет 3 дочерних манифеста – по одному для 1080p, 720p, 480p соответственно.
Посмотрим на пример основного манифеста:
#EXTM3U
#EXT-X-MEDIA:URI="subtitle/lang_en/subtitle_index.m3u8",TYPE=SUBTITLES,GROUP-ID="subtitles",LANGUAGE="en",NAME="English",DEFAULT=YES,AUTOSELECT=YES
#EXT-X-STREAM-INF:BANDWIDTH=893752,AVERAGE-BANDWIDTH=560289,RESOLUTION=854x480,CODECS="avc1.4D401F,mp4a.40.2",SUBTITLES="subtitles"
media-4/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1494976,AVERAGE-BANDWIDTH=891779,RESOLUTION=1280x720,CODECS="avc1.640028,mp4a.40.2",SUBTITLES="subtitles"
media-5/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3262928,AVERAGE-BANDWIDTH=1894009,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2",SUBTITLES="subtitles"
media-6/index.m3u8
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=161304,RESOLUTION=854x480,CODECS="avc1.4D401F",URI="media-4/iframes.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=241392,RESOLUTION=1280x720,CODECS="avc1.640028",URI="media-5/iframes.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=532416,RESOLUTION=1920x1080,CODECS="avc1.640028",URI="media-6/iframes.m3u8"
- #EXTM3U – это обязательный тег, который указывает, что это файл для хранения плейлистов M3U8;
- #EXT-X-STREAM-INF – определяет три разных видеопотока с разным качеством, здесь содержится информация о пропускной способности, средней пропускной способности, разрешении, кодеках и расположении медиафайлов.
Видео по запросу
В таком режиме, как видео по запросу (VOD) медиафайлы доступны в течение всей сессии. В данном случае сеанс предоставляет клиенту полный доступ ко всей программе.
Посмотрим на пример плейлиста для видео по запросу:
#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
http://example.com/movie1/fileSequenceA.ts
#EXTINF:10.0,
http://example.com/movie1/fileSequenceB.ts
#EXTINF:10.0,
http://example.com/movie1/fileSequenceC.ts
#EXTINF:9.0,
http://example.com/movie1/fileSequenceD.ts
#EXT-X-ENDLIST
Каждому URL-адресу медиафайла должен предшествовать тег EXTINF. Этот тег описывает число, которое определяет продолжительность медиасегмента в секундах. Это значение должно быть меньше или равно EXT-X-TARGETDURATION.
Трансляция
В онлайн-трансляциях индексный файл обновляется путем удаления URL-адресов из файла по мере создания новых медиафайлов.
Посмотрим на пример плейлиста для онлайн-трансляции:
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10.0,
fileSequence1.ts
#EXTINF:10.0,
fileSequence2.ts
#EXTINF:10.0,
fileSequence3.ts
#EXTINF:10.0,
fileSequence4.ts
#EXTINF:10.0,
fileSequence5.ts
Список воспроизведения продолжает обновляться по мере добавления новых мультимедиа-данных:
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:4
#EXTINF:10.00,
fileSequence4.ts
#EXTINF:10.00,
fileSequence5.ts
#EXTINF:10.0,
fileSequence6.ts,
#EXTINF:10.0,
fileSequence7.ts,
#EXTINF:10.0,
fileSequence8.ts,
#EXTINF:10.0,
fileSequence9.ts
#EXT-X-MEDIA-SEQUENCE: указывает порядковый номер первого URL-адреса, который появляется в плейлисте. Каждый URL-адрес медиафайла в списке воспроизведения имеет уникальный целочисленный порядковый номер. Порядковый номер URL-адреса на 1 больше порядкового номера предшествующего ему URL-адреса. Порядковые номера носителей не имеют никакого отношения к названиям файлов.
Вложения
- image-10-2.png
- image-10.png
- image-11-2.png
- image-11.png
- image-12-2.png
- image-12.png
- image-13.png
- image-14.png
- image-15.png
- image-2-2.png
- image-2-3.png
- image-2-4.png
- image-2-5.png
- image-2.png
- image-3-2.png
- image-3-3.png
- image-3-4.png
- image-3.png
- image-4-2.png
- image-4-3.png
- image-4.png
- image-5-2.png
- image-5.png
- image-6-2.png
- image-6.png
- image-7-2.png
- image-7.png
- image-8-2.png
- image-8.png
- image-9-2.png
- image-9.png
- image.png