WebRTC и HLS: как видео с камеры доходит до зрителя
Камера отдаёт видео по RTSP, а браузер RTSP не понимает. Поэтому сервер доставляет видео в понятном браузеру формате — через WebRTC или HLS. Разберём, чем они отличаются и зачем мы используем оба.
Почему браузер не показывает RTSP напрямую
RTSP — язык систем видеонаблюдения: его понимают камеры, регистраторы и VLC, но не Chrome, Safari и Firefox. Выставлять камеру напрямую в интернет к тому же небезопасно, и сотни зрителей она всё равно не выдержит. Поэтому наш сервер берёт с камеры один RTSP-поток и раздаёт его зрителям в формате, понятном браузеру. Таких форматов два.
WebRTC — почти в реальном времени
WebRTC создан для видеозвонков — на нём работает Google Meet. Видео идёт маленькими пакетами, в основном по UDP, и браузер показывает его сразу, без большого буфера. Задержка обычно меньше секунды: вы видите то, что происходит сейчас. Для приёма трансляции наш плеер использует стандартный протокол WHEP. WebRTC всегда зашифрован.
Слабое место: WebRTC нужен свой путь через сеть. Корпоративные файрволы, Wi-Fi в гостиницах и кафе, некоторые VPN блокируют UDP, и тогда соединение просто не устанавливается.
HLS — проходит везде, но позже
HLS режет видео на небольшие файлы, которые браузер скачивает один за другим по обычному HTTPS, как картинки. Поэтому он работает везде, где открываются сайты: файрвол не отличит его от обычной страницы. Цена — задержка: классический HLS часто отстаёт на 10–30 секунд, потому что плеер заранее накапливает несколько файлов. Мы используем LL-HLS (Low-Latency HLS): он отдаёт файлы более мелкими частями и сокращает задержку до нескольких секунд.
Сравнение
| WebRTC | LL-HLS | |
|---|---|---|
| Порядок задержки | Меньше секунды | Несколько секунд |
| Транспорт | В основном UDP | HTTPS (обычный веб-трафик) |
| Корпоративный файрвол | Может блокировать | Почти всегда пропускает |
| Браузеры | Все современные | Все современные; встроен в iPhone |
| Когда используется | В первую очередь — когда важно «сейчас» | Когда WebRTC не подключился |
Точная задержка зависит от камеры, сети и местоположения зрителя. В таблице — порядок величин, а не обещание.
Почему сначала WebRTC, потом HLS
Наш плеер выбирает путь сам. Сначала он пробует WebRTC, потому что это лучший результат. Если сеть WebRTC не пропускает, плеер автоматически переходит на LL-HLS. Зрителю ничего не нужно ставить или выбирать — он просто видит видео, даже из офисной сети. Заметить он может разве что чуть большую задержку.
- Склон, море, вид на город — несколько секунд никому не мешают; главное, чтобы видео открывалось у всех.
- Стройка, ворота, мероприятие — здесь «сейчас» важнее, и преимущество WebRTC заметно.
На телефоне
Оба пути работают на Android и iPhone, в Chrome, Safari, Firefox и Edge, без приложения. В мобильном интернете WebRTC обычно подключается, но в сетях некоторых операторов или с включённым VPN плеер перейдёт на HLS. На iPhone в режиме энергосбережения браузер может блокировать автозапуск видео — тогда зритель один раз нажимает кнопку воспроизведения.
Как на это влияют настройки камеры
- Интервал I-кадров. Видео нового зрителя начинается со следующего ключевого кадра. Интервал 1–2 секунды даёт быстрый старт и короткие части HLS.
- B-кадры. В H.264 они вызывают подтормаживание в браузере, особенно через WebRTC. Отключите их на камере.
- H.265. Большинство браузеров его не показывает; для таких камер сервер перекодирует видео в H.264, пока его кто-то смотрит. См. H.265 в браузере.
Все рекомендуемые значения в одном месте: настройки камеры для веб-трансляции.
Почему видео иногда отстаёт на несколько секунд?
Скорее всего, сеть зрителя не пропустила WebRTC, и плеер перешёл на LL-HLS. Так часто бывает в офисном и гостиничном Wi-Fi и с VPN. Видео работает, просто чуть позже.
Зрителю нужно что-то устанавливать?
Нет. Плеер работает в обычном браузере на компьютере и телефоне и сам выбирает путь.
Работает ли на iPhone?
Да, в Safari и других браузерах. Если телефон в режиме энергосбережения, может понадобиться один раз нажать кнопку воспроизведения.
Безопасен ли WebRTC?
Да. Видео в WebRTC всегда зашифровано, а HLS идёт по HTTPS. К тому же зритель подключается только к нашему серверу и не видит адрес вашей камеры.