Skip to main content

Задача 1 — Ретрансляция видеопотоков Hikvision

1. Постановка задачи

  • Парк: 1000+ камер Hikvision.
  • Проблема A: слабый NVR не тянет одновременную раздачу множеству клиентов.
  • Проблема B: много клиентов претендуют на один и тот же поток.
  • Цель: единая точка входа — в любой момент зайти и посмотреть любую камеру.
  • Ограничение: без лицензий Hikvision (HikCentral лицензирует каждый канал — на 1000+ камер бюджет неподъёмный).
  • Клиенты: в основном iVMS (iVMS-4200), плюс желателен просмотр через браузер.
  • Отдельная цель: красивая сетка/мозаика для руководства + моментальное переключение между камерами.
  • Хранение/архив — отложенная задача (пока архив остаётся на NVR).

2. Ключевая идея архитектуры

Не тянуть потоки через NVR. Каждая камера Hikvision сама отдаёт RTSP:

rtsp://<user>:<pass>@<ip>:554/Streaming/Channels/101   ← основной поток (main)
rtsp://<user>:<pass>@<ip>:554/Streaming/Channels/102 ← субпоток (sub, 720p/~1 Mbit)

Ретранслятор подключается к камере ОДИН раз, а все клиенты подключаются уже к ретранслятору. Камера и сеть до неё нагружаются одним потоком независимо от числа зрителей. NVR продолжает писать архив — его не трогаем.

                       ┌────────────────────────┐
Камеры (RTSP) ─────▶│ Ретранслятор │─────▶ iVMS (RTSP)
1 подключение │ (go2rtc / MediaMTX) │─────▶ Браузер (WebRTC/HLS)
на камеру │ on-demand, no transcode│─────▶ HTML-мозаика
└────────────────────────┘
NVR (архив) ── не трогаем, пишет как писал

Без транскодирования — ретранслятор просто перекладывает пакеты (remux), не декодирует видео. Отсюда низкие требования к CPU.

3. Выбор инструмента

ИнструментЛиценз.ТранскодRTSP outWebRTCOn-demandВеб-панельВывод
go2rtcMITнет (remux)да :8554отличный :1984дада (тех.)старт здесь
MediaMTXMITнет (remux)да :8554да :8889данетядро при росте
RTSPtoWebMITнетдададатолько RTSP→web
SRSMITопц.дададакластер edge, сложнее
HikCentralплатн.да❌ лицензии

Рекомендация: начать с одного go2rtc — он и RTSP для iVMS раздаёт, и лучший в классе WebRTC для браузера (задержка < 1 с). При упоре в производительность RTSP-раздачи — добавить MediaMTX как ядро (см. go2rtc.md, раздел «Связка»).

Детали по каждому: mediamtx.md, go2rtc.md.

4. Железо

4 CPU / 8 GB RAM — достаточно для старта и, скорее всего, навсегда.

Ретранслятор без транскодирования не требует ни много CPU, ни много RAM:

  • ~100 одновременно активных потоков = единицы % CPU + пара сотен МБ RAM;
  • 300–400 активных потоков влезут в 4/8.

Реальный потолок — СЕТЬ. Считать так:

  • 100 камер × 4 Mbit (main) = 400 Mbit входящих + столько же исходящих на клиентов.
  • Гигабитный линк ≈ 100–120 активных main-потоков «вход+выход».
  • Планируешь больше одновременных зрителей → проси 10G интерфейс (важнее RAM).

Перед заказом тачки: уточнить у сетевиков пропускную способность до сегмента камер и до клиентов.

5. Как подключаются клиенты

iVMS (iVMS-4200)

Добавляется как Custom Protocol / RTSP-поток, не как нативное Hikvision-устройство. Последствия:

  • добавлять каждый поток отдельно (но можно импортом/массово, скриптуемо);
  • НЕ будет PTZ-управления, событий с камеры, SDK — только видео;
  • сетки/раскладки 2×2…4×4, туры по камерам — работают (обычные видеопотоки).

Если PTZ и события руководству не нужны (обычно смотрят видео) — потери некритичны.

URL для iVMS: rtsp://<server>:8554/cam0001

Браузер

  • go2rtc: http://<server>:1984/stream.html?src=cam0001 (WebRTC, < 1 с задержки).
  • MediaMTX HLS: http://<server>:8888/cam0001 (2–5 с задержки).

6. «Красивая сетка» для руководства

Три пути:

  1. iVMS с RTSP-потоками — привычные раскладки/туры. Минус: надо ставить клиент.
  2. Самодельная HTML-мозаика поверх go2rtc — go2rtc отдаёт готовые embed-ссылки, собрать страницу-сетку нужных камер = работа на вечер. Плюс: открывается с любого устройства по ссылке, ничего не ставить. (Могу сделать, когда будет сервер.)
  3. Frigate — если захочется ещё и детекцию людей/машин: приличный UI с сетками из коробки, внутри использует тот же go2rtc.

7. «Моментальное переключение» между камерами

Два фактора:

  1. WebRTC вместо HLS в браузере — старт < 1 с (HLS думает 2–5 с). go2rtc умеет из коробки.
  2. Лайфхак с постоянными субпотоками: камеры, которые в сетке у руководства, держать БЕЗ on-demand (постоянно активными), но по субпотоку (102, 720p/~1 Mbit). Даже 30–50 постоянных субпотоков — копейки по трафику, зато открытие сетки и переключение происходят мгновенно, без паузы на подключение к камере. Основные потоки (101) — on-demand, для полноэкранного просмотра.

8. План пилота

  1. Развернуть Ubuntu-тачку (4 CPU / 8 GB).
  2. Поставить один go2rtc.
  3. Завести 10–20 камер скриптом из CSV.
  4. Неделю тыкать: iVMS через RTSP + браузер через WebRTC.
  5. Нравится → масштабировать на весь парк скриптом + собрать HTML-сетку.
  6. Упёрлись в производительность RTSP → добавить MediaMTX вторым слоем (без переделки).

Готовые конфиги/скрипты/systemd → config-examples.md.