Готовим адаптивное видео для HTTP Live Streaming. HTTP Live Streaming: лучшие рецепты Hls протокол


Как показала практика, лучшим транспортом для видео по сравнению с RTMP, является HLS. Причины этого:

    Очень простое проксирование, с кэшированием через nginx. На первое месте, потому что, камера, как устройство не может обслуживать, как правило, одновременно более 10 подключений. В этом смысле гарантированное проксирование RTMP потоков, возможно только через платные решения, и требует больших мощностей. Не нужно специального серверного программного обеспечения.

    Упрощение всей серверной инфраструктуры. В силу идеи видео отдается по кусочкам, через 80 порт по http. За отдачу статики может отвечать сам nginx. Отдача статики (видео кусочки по 50кБ) задача для nginx очень легкая.

    Поскольку количество кусочков постоянно, старые удаляются, новые добавляются, жесткий диск никогда не переполнится.

    Распространенность больше, чем у RTMP. HLS с кодировкой видео H.264 поддерживается iOS и работает без лишних действий. По данным на 1 июля 2014 с хабры подключений потокового видео с транспортом HLS - 55%, RTMP - 26%, RTSP - 15% и MPEG-DASH менее 1%.

    Поддержка большинством мобильных устройств, дестктопов, планшетных компьютеров прямо из браузера.

    Гораздо проще, чем вещание в RTSP в принципе. Так как нет таких процедур, как push (публикация потока) или pull (получение потока).

    Гораздо более http friendly формат.

Недостатки следующие:

    Все таки не все устройства поддреживают этот формат. Android версий меньше 4.2 официально не поддерживает кодек H.264 и транспорт, но на Android вместо браузера для просмотра можно использовать стороннее приложение - например MX Player

    Все зависит от камеры. Если камера глючная, например Dlink DCS-3010, то вся система будет работать из рук вон плохо (ffmpeg постоянно отваливается). Например камеры AXIS M1011-W, HIKVISION DS-2CD2412F-IW работают в такой связке хорошо (до месяца без нареканий (дольше просто не тестировал)). Так же большое значение имеет прокладка кабеля. В этом смысле будем рассматривать идеальный вариант.

Что такое транспорт HLS

Видео поток в кодировке h.264 (Кстати: profile baseline понимают Android устройства), делится на кусочки с расширением *.ts , например по 5 секунд, создается плэйлист в live.m3u8 , с последовательным описанием этих кусочков. Предварительно определется длина плэйлиста например 10 кусков. Когда появляется 11 кусочек видео, 1 кусок видео удаляется, плейлист пересоздается. Более подробно можно посмотреть на сайте разработчика .

Для работы системы настроим изображение с камер так, как мы хотим видеть на сайте, формат картинки и качество изображения. На сервере перекодировать не будем. Камера для того и придумана чтобы отдавать такое изображение какое нужно. В камерах обычно есть несколько профилей. Можно настроить один профиль для H.264, для HLS, а второй c MPEG4 для MPEG-DASH. Так же можно настроить различное качество, для широкого и узкого канала интернет. Думайте сами - решайте сами.

Важно! Камера должна на выходе иметь изображение, которое не нужно перекодировать.

Структурная схема для высокой нагрузки

Камера(rtsp) ----->

-----> одно подключение FFmpeg(rtsp->hls) -> Nginx(nginx-rtmp-module) ----->

-----> одно подключение к промежуточному proxy nginx c большим кэшем =====>

=====> много клиентов JWPlayer(hls)

Наш сервер подключается с помощью ffmpeg к камере и регистрируется в приложении nginx hls. nginx создает кусочки и плэйлист в определенной директории. Далее отдает эти кусочки на прокси сервер. Клиенты подключаются к прокси серверу с помощью JWPlayer .

Настройка nginx application

Соберем nginx с nginx-rtmp-module. Эта процедура детально описывается в статье .

Допустим у нас несколько камер, разделим их по порядковому номеру. Опишу конфигурацию nginx для 2 камер. Статические изображения кэшируем на 5 минут в локальном кэше, если картинка не грузится в течении 5 секунд отдаем статическую заставку.

# nano /etc/nginx/nginx.conf

Отредактируем конфигурацию nginx

user www - data ; worker_processes auto ; pid / run / nginx . pid ; error_log / var / log / nginx / nginx_error . log debug ; env PATH ; events { # multi_accept on ; } http { access_log / var / log / nginx / access . log ; error_log / var / log / nginx / error . log ; include mime . types ; default_type application / octet - stream ; sendfile on ; keepalive_timeout 65 ; proxy_cache_path / var / www / cache / local levels = 1 : 2 keys_zone = nginx_local_cache : 1 m inactive = 30 m max_size = 512 M ; proxy_temp_path / var / www / cache / local / tmp ; server { listen 80 ; # rtmp stat location / stat { rtmp_stat all ; rtmp_stat_stylesheet stat . xsl ; } location / stat . xsl { # you can move stat . xsl to a different location root / etc / nginx ; } location / { rtmp_control all ; } error_page 500 502 503 504 / 50 x . html ; location = / 50 x . html { root html ; } include cameras_http_locations . conf ; } } rtmp { access_log / var / log / nginx / rtmp_access . log ; server { listen 1935 ; ping 30 s ; notify_method get ; include cameras_rtmp_applications . conf ; } }

Создадим путь для кэш # mkdir /var/www/cache/local Поправим права для кэш:

# chmod -R 755 /var/www/cache/local # chown -R www-data:www-data /var/www/cache/local`

Создадим http locations для камер:

# nano cameras_http_locations.conf

types { application / vnd . apple . mpegurl m3u8 ; video / mp2t ts ; } # отдаем изображение с камеры 1 - /1/img/ # для всех камер разные, т.к. ip адреса камер разные "http://192.168.0.2/GetImage.cgi?CH=1" # отдаем изображение с камеры 2 - /2/img/ location / 1 / img / { proxy_cache nginx_local_cache ; proxy_cache_key $ request_uri ; expires 1 m ; # кэшируем на 1 минуту add_header Cache - Control public ; # для кэширования на проксе proxy_ignore_headers Cache - Control ; # для удаления заголовков с камеры proxy_pass "http://192.168.0.3/GetImage.cgi?CH=1" ; proxy_set_header Authorization "Basic " ; error_page 502 504 404 @ fallback_img ; } # отдаем плэйлист - /1/hls/live.m3u8 или /3/hls/live.m3u8 # плэйлист кэшируется 10 секунд на проксе location ~* / hls / . * \ . m3u8 $ { rewrite "/(.*)/hls/(.*)$" / hls - $ 1 / $ 2 break ; # переделываем запрос / 1 / hls / в / hls - 1 / root / tmp / ; expires 10 s ; add_header Cache - Control public ; } # отдаем кусочек видео с камер - /1/hls/live-12345678.ts или /2/hls/live-12345678.ts # кэширование на локальном компьютере не требуется # кусочек кэшируется 3 минуты на проксе location ~* / hls / . * \ . ts $ { rewrite "/(.*)/hls/(.*)$" / hls - $ 1 / $ 2 break ; root / tmp / ; expires 3 m ; add_header Cache - Control public ; } # именованный location если картинки нет location @ fallback_img { rewrite (. + ) / fallback . jpg break ; root / etc / nginx / ; }

Создадим файл hls конфигурации сервера rtmp с applications для наших камер:

# nano cameras_rtmp_applications.conf

chunk_size 4000 ; application hls_1 { live on ; sync 10 ms ; exec_static ffmpeg - i rtsp : //admin:[email protected]:554/live1.sdp -c copy -f flv -an rtmp://localhost:1935/hls_1/live 2>>/var/log/nginx/ffmpeg_1.log; hls on ; hls_path / tmp / hls - 1 / ; # путь хранения кусочков на сервере hls_fragment_naming timestamp ; # использовать timestamp для именования кусочков } application hls_2 { live on ; sync 10 ms ; exec_static ffmpeg - i rtsp : //admin:[email protected]:554/live1.sdp -c copy -f flv -an rtmp://localhost:1935/hls_2/live 2>>/var/log/nginx/ffmpeg_2.log; hls on ; hls_path / tmp / hls - 2 / ; hls_fragment_naming timestamp ; }

Содержимое директории /tmp/hls-1/

$ ls / tmp / hls - 1 / live - 10458360. ts live - 13292010. ts live - 16129440. ts live - 18963270. ts live - 10930050. ts live - 13767390. ts live - 16602660. ts live - 19435050. ts live - 11405250. ts live - 14239260. ts live - 17072820. ts live . m3u8 live - 11878560. ts live - 14710860. ts live - 17544960. ts live - 12348630. ts live - 15182550. ts live - 18020160. ts live - 12821760. ts live - 15658740. ts live - 18492750. ts

Пример файла live.m3u8

#EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:35 #EXT-X-TARGETDURATION:5 #EXTINF:5.224, live - 16602660. ts #EXTINF:5.246, live - 17072820. ts #EXTINF:5.280, live - 17544960. ts #EXTINF:5.251, live - 18020160. ts #EXTINF:5.228, live - 18492750. ts #EXTINF:5.242, live - 18963270. ts

Решение проблемы с отваливающимися камерами

Самое правильное решение, поменять глючную камеру. Это помогает в 90% случаев. Если нет возможности и нужно как то жить дальше, то поможет следующее решение.

Это решение состоит из двух - взаимодополняющих:

    Запускать отдельный процесс nginx на каждую камеру и общий процесс по отдаче статики. То есть для двух камер написать отдельные конфиги с rtmp серверами и один общий с http. Тогда глючная камера не будет влиять на общий процесс.

    Если поток с камеры нарушается в результате ее глючности (перегрева, плохой прокладки витухи, недостаточное питание по PoE и т.п.), то камера отвалится, дочерний процесс ffmpeg будет отбраковывать пакеты и nginx перестанет писать кусочки видео. А когда процесс ffmpeg завершится, nginx удалит все файлы из директории с кусочками. Этот момент очистки папки мы вычисляем по cron и рестартим необходимый процесс nginx.

В для каждой камеры создается в /etc/init.d/ создается исполняемый скрипт, копия nginx , c именем camera_1 и camera_2

# cp /etc/init.d/nginx /etc/init.d/camera_1 # cp /etc/init.d/nginx /etc/init.d/camera_2 # chmod +x /etc/init.d/camera_1 # chmod +x /etc/init.d/camera_2

Редактируем скрипт запуска nginx.

nano / etc / init . d / nginx

Меняем переменную DAEMON_OPTS . Основной демон nginx будет отдавать всю статику. А так же будет запускать и останавливать демоны отвечающие за камеры./ init . d / camera_1 stop fi if [ - f "/etc/init.d/camera_2" ]; then / etc / init . d / camera_2 stop fi

Добавляем в функцию do_reload:

# reload cameras if [ - f "/etc/init.d/camera_1" ]; then / etc / init . d / camera_1 reload fi if [ - f "/etc/init.d/camera_2" ]; then / etc / init . d / camera_2 reload fi

Редактируем скрипт запуска nginx для камеры 1 camera_1 и для камеры 2 camera_2 по примеру.

# nano /etc/init.d/camera_1

Меняем переменные DAEMON_OPTS и DESC

DESC = "camera_1 for CAMERA-1" DAEMON_OPTS = "-c /etc/nginx/nginx_1.conf"

Редактируем скрипт запуска nginx для камеры 2 camera_2 по примеру.

В /etc/nginx/nginx_0.conf с http locations я пишу волшебные строки:

# DIR-PROCESS-NAME /tmp/hls-1/ camera_1 # DIR-PROCESS-NAME /tmp/hls-2/ camera_2

В них указано через пробел искомое слово DIR-PROCESS-NAME директория и наименование процесса который нужно перезагрузить.

Проверка:

# service nginx start # service camera_1 restart * Restarting camera_1 for CAMERA - 1 configuration nginx # service camera_2 restart * Restarting camera_2 for CAMERA - 2 configuration nginx

Скрипт который перезагружает камеры. Он проходится по папкам с кусочками, ищет, где нет файлов *.m3u8 . Если в папке нет файлов, ищет соответствующий демон по конфигу основного демона, по строчке DIR-PROCESS-NAME . Перезагружает его.

# nano /script/cameras_reloader.sh

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

#!/bin/bash PATH = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin mask = "*.m3u8" dir = "/tmp/hls-*" function find_process(){ process_str = $(cat /etc/nginx/nginx_0.conf | grep "# DIR-PROCESS-NAME" | grep $1 | cut -d" " -f4) echo $process_str } for hls_dir in $dir ; do find_result = $(find $hls_dir -name $mask -type f) if [ -z $find_result ] ; then process = $(find_process $hls_dir ) service $process restart fi done sleep 15s

Сравнение HLS с MPEG-DASH

MPEG-DASH это аналог HLS созданный компанией Google, в качестве транспорта для MPEG-4. Этот транспорт малораспространен и практически не поддерживается. Его идеалогия такая же, разбить поток на кусочки, только кусочков больше, отдельные куски для видео, отдельные для аудио. В nginx-rtmp-module этот формат настраивается аналогично HLS.

Пробуйте, копируйте, дерзайте!

Если статья была вам полезна просьба щелкнуть по рекламе. Спасибо!

Flussonic Media Server поддерживает раздачу видео по протоколу HLS.

Многие из доступных возможностей нестандартны для HLS, но мы поддерживаем их для вашего удобства.

Поддерживаемые кодеки: H264, H265, MPEG2 video, AAC, MP3, MPEG2 audio, AC-3.

Flussonic Media Server позволяет получать по HLS прямой эфир, видео по запросу, видео из архива (catchup и timeshift).

Простое воспроизведение HLS

Если у вас есть простой live поток или файл (одно видео, один звук), то URL для воспроизведения через HLS очень простой:

http://flussonic-ip/STREAMNAME/index.m3u8

где flussonic-ip - это пример адреса + порта вашего Flussonic Media Server.

Flussonic Media Server также принимает playlist.m3u8 в конце URL для обратной совместимости с другими серверами.

Когда вы начинаете работать с мультиязычными или мультибитрейтными контентом, все становится сложнее.

Мультиязычный HLS

Если вы хотите воспроизвести ваш мультиязычный поток на iPhone, вам нужно использовать тот же http://192.168.2.3:8080/STREAMNAME/index.m3u8

Но если вы хотите посмотреть мультиязычный поток используя VLC или приставку, нужно включать video.m3u8.

URL для плеера: http://flussonic-ip/STREAMNAME/video.m3u8

Это связано с тем, что, согласно требованиям Apple HLS, для каждого отдельного языка нужно указывать отдельный плейлист с audio only вариантом. В MPEG-TS другой механизм: рядом с видео укладываются все аудиодорожки, и плеер сам выбирает, что будет проигрывать. Чтобы видео можно было посмотреть на iPhone, оно должно соответствовать требованиям Apple. Но VLC и приставки, в нарушение стандарта HLS, ожидают старый вариант MPEG-TS, преобразованный в HLS. Поэтому нужно включать video.m3u8 .

Добавление «Audio only» для Apple

Apple требует, чтобы у всех ваших потоков был вариант без видео, только звук.

Они считают, что если пользователь смотрит видео по 3G и, оказавшись в зоне неуверенного приема, лучше у него будет только звук, чем буфферизация.

Вы можете включить эту опцию в Flussonic Media Server:

stream ort { url udp: // 239.0.0.1 : 1234 ; add_audio_only ; }

Помните, что это может сделать ваш index.m3u8 адрес невоспроизводимым в VLC или приставке. В таком случае используйте video.m3u8 .

Отдельные битрейты для приставок

Когда у вас есть мультибитрейтный мультиязычный контент и вы хотите проиграть его на приставке, которая не поддерживает мультибитрейтный HLS плейлисты, вы можете запросить с Flussonic Media Server отдельные плейлисты с одним видео и всеми звуковыми дорожками, как с опцией mono:

http: // flussonic - ip / STREAMNAME / video1 . m3u8

Этот плейлист не мультибитрейтный, в нем URL до сегментов, в которых первая видео дорожка и все доступные звуковые дорожки.

Если вы хотите доставлять мультиязычные мультибитрейтные потоки на приставки, не понимающие стандарт Apple для мультиязычности, используйте video.m3u8:

http: // flussonic - ip / STREAMNAME / video . m3u8

Это мультибитрейтный плейлист, который отдает список плейлистов с разными качествами: video1.m3u8, video2.m3u8 и т.д.

DVR catchup playback

Когда ваш поток уже записан на сервере нашим DVR , вы можете воспроизвести видео через HLS, используя время начала и конца передачи (например, из EPG).

http: // flussonic - ip / STREAMNAME / archive -1508403742-3600 . m3u8

Этот плейлист будет т.н. variant, если в потоке будет больше одной звуковой дорожки или больше одного битрейта. Он будет давать список сегментов начиная с UTC 1362504585 (2013, Март, 5, 17:29:45 GMT) и один час вперед.

Mono URL даст список сегментов содержащих все дорожки в mpeg-ts:

http: // flussonic - ip / STREAMNAME / mono -1362504585-3600 . m3u8

Более конкретный videoN плейлист даст список сегментов с N видео дорожкой и всеми звуковыми дорожками:

http: // flussonic - ip / STREAMNAME / video1 -1362504585-3600 . m3u8

и variant видео плейлист со списком videoN плейлистов:

http: // flussonic - ip / STREAMNAME / video -1362504585-3600 . m3u8

Rewind playlist

Есть специальный плейлист "rewind-N.m3u8" с большим «скользящим» окном, позволяющий перематывать и ставить на паузу HLS потоки на долгие часы.

http: // flussonic - ip / STREAMNAME / rewind -7200 . m3u8

7200 - длина HLS плейлиста в секундах. Это означает, что ваши клиенты могут поставить эфир на паузу на 2 часа или перемотать на начало футбольного матча без обращения по специальными архивным ссылкам.

Для организации онлайн трансляций в реальном режиме времени, видео по запросу (vod), а также для осуществления записи видео-потоков можно использовать nginx вместе с модулем nginx-rtmp-module.

Медиа серверы

На сегодняшний день существуют несколько популярных медиа серверов, о которых вы можете подробнее почитать в одной из . Медиа серверы необходимы для создания онлайн трансляций в реальном режиме времени.

Существуют как платные, так и бесплатные медиа серверы, включающие в себя разные функции. Сегодня мы поговорим об одном бесплатном и довольно неплохом решении.

Ngnix-rtmp

Базовый функционал медиа сервера, также можно реализовать с помощью бесплатного программного обеспечения — модуля Ngnix-rtmp-module, который на данный момент поддерживает такие потоковые протоколы как RTMP и HLS.

Таким образом, с помощью Ngnix-rtmp (веб сервер Ngnix + модуль Ngnix-rtmp-module), можно организовать вещание по RTMP и HLS на устройства пользователей. Сводную таблицу протоколов и устройств, которые их поддерживают, можно посмотреть в статье . Также в одной из будущих своих статей я планирую сделать сравнительную таблицу функционала модуля Ngnix-rtmp-module и других медиа серверов.

Онлайн трансляция по протоколу HLS

Сегодня мы рассмотрим, как с помощью модуля Nginx-rtmp-module организовать простейшую трансляцию с адаптивным битрейтом по протоколу HLS. В первую очередь нам необходимо скачать исходные коды веб-сервера Nginx с официального сайта. Все команды, представленные ниже исполнялись в Linux.

  • wget http://nginx.org/download/nginx-1.4.1.tar.gz

Извлечь файлы из архива.

  • tar -zxvf nginx-1.4.1.tar.gz

Скачать zip архив с исходными файлами модуля nginx-rtmp-module и извлечь файлы из архива.

  • wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

Теперь нам необходимо скомпилировать nginx с модулем nginx-rtmp-module , для этого при конфигурации nginx нужно указать в опции —add-module расположение исходных файлов nginx-rtmp-module , а также необходимо указать дополнительную опцию with-http_ssl_module .

./configure —add-module=/home/nginx/nginx-rtmp-module-master —with-http_ssl_module

make install

  • Если все прошло без ошибок, можно приступать к настройке сервера. По умолчанию сервер устанавливается в директорию /usr/local/nginx . Конфигурационный файл сервера nginx.conf, находится в директории /usr/local/nginx/conf . Рассмотрим подробнее секцию rtmp:server конфигурационного файла. Параметр listen указывает порт на котором сервер будет принимать rtmp запросы.
  • Далее мы открываем секцию для настройки приложения testlive. Здесь мы указываем, что у нас live-поток - параметр live on, включаем поддержку протокола hls для этого приложения – параметр hls on.
  • С помощью параметра hls_path мы задаем директорию в которой буду располагаться чанки (кусочки) потока. Для того чтобы чанки (кусочки) для каждого видео потока располагались в отдельной директории необходимо подключить директиву hls_nested on .
  • Далее с помощью параметра allow publish мы разрешаем публиковать потоки с своего компьютера, а с помощью параметра deny publish all запрещаем всем остальным публиковать видео.
  • Теперь рассмотрим секцию http:server . В параметре listen необходимо указать на коком порту сервер будет принимать http запросы. Мы указываем порт 8080. И из примера конфигурационного файла перенести секцию http:server:location /hls . Посмотреть более подробную информацию по всем директивам конфигурационного файла можно по адресу: https://github.com/arut/nginx-rtmp-module/wiki/Directives.
  • Настало время запустить сервер. Для этого необходимо перейти в директорию /usr/local/nginx/bin и выполнить команду ./nginx .

Теперь рассмотрим один пример. Мы отправляем на сервер три видео-потока:

  • test1 с битрейтом 256 кбит/с,
  • test2 с битрейтом 512 кбит/с,
  • test3 с битрейтом 1024 кбит/с.

Наша задача, чтобы клиент, использующий протокол HLS (устройства: Mac, iPad, iPhone) мог динамически переключаться между потоками, в зависимости от качества Интернет соединения. Для этого нам необходимо в директории /usr/local/nginx/html создать файл с расширением m3u8 , например playlist.m3u8 , со следующим содержимым:

#EXTM3U

#EXT-X-VERSION:3

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=256000,RESOLUTION=640×480

hls/test1/index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=512000,RESOLUTION=640×480

hls/test2/index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1024000,RESOLUTION=640×480

hls/test3/index.m3u8

Просмотр трансляции

Для просмотра видео-потоков необходимо в веб-страницу сайта встроить следующий код.

- ip-адрес вашего nginx сервера.

[название плейлиста] - название файла, созданного в предыдущем пункте (playlist.m3u8).

Ниже, приведен пример простейшего конфигурационного файла nginx.conf.

worker_processes 1;

server {

listen 1935;

application testlive {

live on;

hls on;

hls_path /tmp/hls;

hls_nested on;

allow publish 10.10.146.148;

deny publish all;

server {

listen 8080;

server_name rtmp_test;

charset utf-8;

location / {

root html;

index index.html index.htm;

location /hls {

types {

application/vnd.apple.mpegurl m3u8;

alias /tmp/hls;

Заключение

Эта статья была написана и опубликована совместно c моим коллегой Евгением Петровым. Мы используем данный модуль (Ngnix-rtmp) в разных проектах. Если у кого-то появятся вопросы по Ngnix-rtmp, Wowza серверу, пишите. Если вам нужно что-то настроить или получить консультацию по медиа-серверам и мультимедийным системам, также можете обращаться ко мне и нашей команде через .

В последние несколько лет в мире цифрового вещания произошли большие изменения. Flash - технология доставки контента через интернет, разработанная Adobe, стремительно сокращает свое присутствие. А ее место занимают протоколы подобные HLS.

HTML5 и HLS созданы на открытом коде, их можно изменять как угодно и использовать бесплатно. Также они более безопасные, надежные и быстрые чем предшественники. В статье постараемся раскрыть понятия онлайн вещания, дадим описание стриминговым протоколам и рекомендации по использованию HLS.

Что такое HLS

HLS расшифровывается как HTTP Live Streaming – протокол для потоковой передачи медиа данных через интернет. HLS нарезает видео контент в формате MP4 на короткие 10-секундные блоки, чанки. Эти короткие фрагменты доставляются по HTTP, что делает протокол совместимым с большинством устройств и файерволов.

HLS обеспечивает в первую очередь отменное качество онлайн трансляций. Но, нужно учитывать, что задержка при онлайн вещании составляет 15-30 секунд. На серверной части создатель трансляции может назначить кодирование потока в несколько качеств. Плеер затем динамически запрашивает оптимальное качество, исходя из ширины интернет канала в конкретный момент. Соответственно качество фрагментов может отличаться.

Например, мобильный телефон проигрывает видео в HD качестве, а минутой позже зритель попадает в зону плохого приема. Когда плеер обнаруживает снижение качества связи, он запрашивает видео чанки меньшего качества. Таким образом снижается буферизация, зависание и другие проблемы.

История создания HLS

Изначально HLS был запущен компанией Apple летом 2009 года вместе с IРhone 3. Предыдущие модели IРhone испытывали проблемы с онлайн вещанием, из-за того, что иногда переключались между Wi-Fi сетями и мобильной передачей данных.

Перед выходом HLS, главным стриминговым медиа протоколом Apple был Quicktime Streaming Server. Хороший сервис, но так как он использовал нестандартные порты для передачи данных, его RTSP протокол периодически блокировался файерволами. В купе с медленным интернетом это привело к отказу от данного протокола. Но уроки, полученные при его реализации, очень пригодились в разработке HLS. Техническая сторона

HLS поток создается на лету и хранится на HTTP сервере. Видео файлы, как упомянули выше, делятся на короткие фрагменты с расширением.ts – MPEG2 Transport Stream.

HTTP сервер также создает плейлист файл с расширением.M3U8 (также называемый манифестом), который служит для индексирования всех видео чанков. Этот плейлист файл указывает на дополнительные индексные файлы для каждого из существующих качеств вещания. Даже если вы решите вещать, используя одно качество, «манифест» все равно будет создан.

Плеер пользователя должен распознать ухудшение или улучшение скорости передачи данных в сети интернет. Когда такое событие происходит, плеер обращается к файлу-манифесту, для определения на какое качество видео переключиться. После этого плеер запрашивает индексный файл для конкретного качества, чтобы загрузить фрагмент видео, на котором остановился зритель. Весь этот процесс незаметен для пользователя. Протокол HLS также поддерживает скрытые субтитры,

Обзор стриминговых протоколов

Каждый из созданных ранее протоколов являл собой реализацию какой-либо инновации в медиа стриминге. Были и «войны форматов», как HD-DVD с Blu-Ray и противостояние Betamax с VHS. HLS лидер онлайн вещания, но так было не всегда и не факт, что сохранится в будущем.

RTMP или Real-Time Messaging Protocol, протокол потоковой передачи данных в реальном времени. Был создан Macromedia в середине 2000 для доставки аудио и видео контента. Часто его называют просто Flash. Позже Macromedia объединилось с Adobe Inc, который продолжает развивать RTMP как полуоткрытый протокол.

В течение прошедшего десятилетия RTMP был основным способом вещания через интернет. Только с появлением HLS его доля стала уменьшаться. На сегодняшний день большинство онлайн видео платформ работают с входящим RTMP потоком. Другими словами, вы вещаете в RTMP, который, затем, онлайн видео платформа кодирует в HLS и доставляет конечным зрителям. Правда, многие операторы CDN начинают отказываться от поддержки RTMP - пруф

Протокол для стриминга следующего поколения, разработанный Adobe называется HDS - HTTP Dynamic Streaming. Он совместим с плагином для проигрывания Flash, но частота его использования сильно уступает распространенному HLS.

Для устройств и браузеров, которые поддерживают Flash, HDS будет лучшим выбором. Он дает минимальную задержку при вещании, как и HLS разделяет медиа файлы небольшие фрагменты, поддерживает шифрование и DRM.

Microsoft Smooth Streaming

Microsoft создал свой протокол онлайн вещания, Microsoft Smooth Streaming. MSS также использует адаптивный битрейт, чтобы доставлять контент в наилучшем возможном качестве. Вещание с адаптивным битрейтом было представлено в 2008 году. С помощью MSS вещали Летние Олимпийские Игры 2008 года. Основным пользователем данного типа вещания является платформа XBox One. При этом, MSS один из наименее популярных протоколов сегодня.

MPEG-DASH

Одним из последних значимых решений в сфере стриминговых протоколов является MPEG-DASH, где DASH означает Dynamic Adaptive Streaming over HTTP, Динамическое Адаптивное Вещание через HTTP. Преимущество MPEG-DASH в том, что он признан единым международным стандартом вещания медиа через НТТР. На данный момент, он еще не широко распространен и далеко не все компании вещания поддерживают его. Но, по общему мнению, через несколько лет именно этот стандарт станет самым популярным протоколом вещания.

MPEG-DASH не зависит от вида кодека, вы можете использовать любой из них для пересылки медиа с помощью этого протокола – Н.264, HEVC/H.265, VP10

Когда же использовать HLS для онлайн вещания

Мы рекомендуем использовать HLS все время. Это самый современный и широко поддерживаемый протокол медиа стриминга. Без него не обойтись, если вы хотите вещать на мобильные устройства. Нативная поддержка HTML5 плеера и конечно же адаптивный битрейт обеспечивают оптимальное качество просмотров.

Предоставление услуг IP-телевидения через сеть Интернет и локальные компьютерные сети приобретает всё более массовые формы. На территории стран СНГ почти не осталось крупных провайдеров не транслирующих видео через multicast в свои локальные сети, то-есть предоставляющие услугу IPTV . Но предоставление услуги тв за пределами своей локальной сети связанно с некоторыми аппаратными издержками и сложностью обеспечения необходимого качества вещания.

HTTP Live Streaming также известный как HLS , является протоколом связи реализованным компанией Apple. Его особенность в том, что общий поток разбивается на последовательность малых загрузочных файлов, каждая загрузка загружает один небольшой фрагмент транспортного потока. Когда поток воспроизводится, клиент может выбрать один из нескольких различных альтернативных потоков, содержащих тот же материал, записанных для различных скоростей передачи данных, что позволяет адаптироваться к доступной скорости передачи данных. В начале сеанса потоковой передачи, загружается расширенный M3U (m3u8) плэйлист, содержащий метаданные для различных подпотоков, которые доступны. Так как при запросах используются только стандартные операции HTTP, HTTP Live Streaming способен обходить любой брандмауэр или прокси-сервер, который пропускает стандартный HTTP-трафик, в отличие от UDP-протоколов, таких как RTP.

HLS основан на HTTP. HLS также определяет стандартный механизм шифрования с использованием AES и способ распределения ключа безопасности с использованием HTTPS или HTTP-куки, которые вместе обеспечивают простую систему защиты авторских прав.

Принцип работы HLS

Теперь выясним в чём же преимущества и недостатки этой технологии. Преимущества несомненны и очевидны. Это, в первую очередь, адаптивность скорости передачи данных к свойствам линии и принимающего устройства, во-вторых, встроенные механизмы защиты авторских прав. В-третьих, не требуется роутер с ограничением ширины multicast-потока по WI_FI, что помогало бы избежать поглащения всей ширины канала multicast-потоками, в случае вещания IP-телевидения c помощью multicast. Также не требуется дополнительное устройство с функцией UDP-proxy для конвертации multicast-потока в HTTP, что часто требуется для мобильных устройств, хотя сказывается на аппаратной нагрузке на роутера или другое устройство осуществляющее функцию UDP-proxy в локальной сети абонента. Стандарт HLS стал довольно распространён и поддерживается почти всеми современными видео плэерами и приставками для IPTV.

IPTV приставка

Существенным минусом является наличие у абонентов мультимедийных приставок и smart-tv приставок с устаревшими прошивками или устаревших конструкций, которые не поддерживают стандарты HLS или же поддерживают их некорректно. Также одной из проблем является невозможность правильно выбрать качество для стабильной трансляции в условиях изменения характеристик линии в интервалах времени меньших, чем длительность запрашиваемого видеофрагмента.