Протокол HLS в видеонаблюдении: как это работает с Viinex

При создании и разработке нашей встраиваемой видеосистемы мы в Viinex ориентировались на веб-технологии и полную совместимость с HTML5, именно поэтому мы в первую очередь добавили поддержку видеостримингового протокола HLS (аббревиатура означает HTTP Live Streaming). Это произошло еще в конце 2016 года, одновременно с разработкой встроенного веб-сервера для доступа к медиаданным и управления через HTTP RESTful API. Тогда это была минимальная базовая функциональность, которой обладал Viinex: получение видео, запись видео и стриминг в HLS.

На тот момент, летом-осенью 2016 года, перед нами стоял довольно непростой выбор – что использовать в качестве базового протокола стриминга видео для первого релиза: надежный и робастный HLS или динамично развивающийся MPEG DASH (причем последний казался нам более простым в реализации). Мы выбрали HLS.

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

Со времени создания HLS компанией Apple в 2009 году опубликовано столько статей и мнений, что сложно сказать что-то новое про сам протокол. Поэтому эта статья посвящена в основном тому, как работает с HLS наш продукт.

Изначально HLS имел целый ряд преимуществ. Со стороны клиента он позволял работать на уже настроенной инфраструктуре, ориентированной на работу с HTTP-трафиком, что важно для администраторов последней мили. Для разработчиков он тоже был удобен – не требовал от браузеров сложных доработок и позволял использовать обычные веб-сервисы вроде Apache HTTP Server. Что мы имеем в результате на настоящий момент - протокол поддерживается почти всеми платформами и браузерами, может воспроизводиться практически на любом устройстве, надежен и проверен временем, лёгок во внедрении при разработке веб-сервисов.

Viinex поддерживает протокол HLS как для трансляции видеоархива, так и для трансляции онлайн-видеопотока. В обоих случаях решение работает путём получения клиентом видеофрагментов (их длительность может быть настроена на стороне сервера Viinex), которые впоследствии клиент собирает для непрерывного воспроизведения пользователю.На диаграмме ниже изображена последовательность действий при взаимодействии с веб-сервером Viinex для получения видеопотока. Чтобы получить новые фрагменты, приложение в браузере пользователя, полученное с вашего веб-сервера, в рамках спецификации HLS периодически пересчитывает данные в формате M3U8, что обеспечивает пользователя постоянно пополняемым списком видеофрагментов.

Если есть необходимость адаптировать видеопоток под нужды пользователя – скажем, сократить частоту кадров или разрешение с помощью объекта renderer (рендерер), входящего в состав Viinex, или переключившись на другой ONVIF-профиль видеокамеры – API Viinex позволяет создавать временные копии видеопотока с заданными характеристиками. Временные видеопотоки можно удалять, когда они больше не нужны – например, когда завершена сессия работы с пользователем, запросившим видеопоток. Ниже приведена расширенная версия диаграммы, отражающая этот аспект.

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

Нам в Viinex удавалось в качестве эксперимента добиться минимальной задержки в 2-3 секунды за счет уменьшения длины фрагмента и сокращения длины списка воспроизведения. Разумеется, мы не рекомендуем такие экспериментальные настройки, напротив, считаем, что лучше использовать настройки Apple по умолчанию. Кроме того, для такой работы требуется, чтобы кодер видеоисточника работал соответственно. Мы определяем фрагменты HLS по границам GOP (group of pictures). Однако если ключевые кадры идут раз в 30 секунд – как, например, могут выдавать камеры Axis с включенным режимом zipstream, – то и фрагменты будут не менее чем по 30 секунд. Таким образом, все попытки уменьшения минимальной задержки (low latency) в HLS в принципе возможны не при любых настройках камеры.

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

Протокол HLS продолжает развиваться, и на конференции WWDC 2019   уже были обрисованы перспективы развития спецификации HLS, а именно – анонсировано расширение протокола (предварительная спецификация для Low Latency HLS), позволяющее вести передачу медиаданных с низкой задержкой.

Как уже было сказано выше, HLS имеет неоспоримый плюс в лёгкости внедрения и работе клиентского приложения с сервером Viinex, как с онлайн-видео, так и с видеоархивом (поиск нужного фрагмента, проигрывание, остановка и пауза и т.д.). Он с лихвой закрывает свои задачи в части видеонаблюдения. Как это выглядит на практике: после того, как сервер Viinex установлен, нужно подключить камеру (cam1 в нашем случае) и создать простейший HTML-файл по спецификации HTML5. Пример ниже:

<!DOCTYPE html>

<html>

<head>

<title>A simple example of HLS streaming based on Viinex Video Management SDK</title>

</head>

<body>

<video id="livevideo" controls>

<!-- Укажите IP-адрес, порт вашего сервера и путь к стриму -->

<source src="http://127.0.0.1:8880/v1/svc/cam1/stream.m3u8" />

</video>

<script src="hls.min.js"></script>

<script>

var isAndroid = /(android)/i.test(navigator.userAgent);

function startLive(videoElementId, cameraName)

{

  if(Hls.isSupported()) {

    var video = document.getElementById(videoElementId);

    var hls = new Hls();

    hls.loadSource('http://127.0.0.1:8880/v1/svc/'+cameraName+'/stream.m3u8');

    hls.attachMedia(video);

    hls.on(Hls.Events.MANIFEST_PARSED,function() {

      if(!isAndroid){

        video.controls = false;

      }

      video.play();

    });

  }

}

if(Hls.isSupported()) {

  startLive("cam1");

  document.write("Playback via hls.js<br/>");

}

else {

  document.write("Native iOS HLS playback");

}

</script>

</body>

</html>

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

Комментариев еще нет.

Leave a Reply

Вы должны войти Авторизованы чтобы оставить комментарий.