Задача 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 out | WebRTC | On-demand | Веб-панель | Вывод |
|---|---|---|---|---|---|---|---|
| go2rtc | MIT | нет (remux) | да :8554 | отличный :1984 | да | да (тех.) | старт здесь |
| MediaMTX | MIT | нет (remux) | да :8554 | да :8889 | да | нет | ядро при росте |
| RTSPtoWeb | MIT | нет | — | да | да | да | только RTSP→web |
| SRS | MIT | опц. | да | да | — | да | кластер 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. «Красивая сетка» для руководства
Три пути:
- iVMS с RTSP-потоками — привычные раскладки/туры. Минус: надо ставить клиент.
- Самодельная HTML-мозаика поверх go2rtc — go2rtc отдаёт готовые embed-ссылки, собрать страницу-сетку нужных камер = работа на вечер. Плюс: открывается с любого устройства по ссылке, ничего не ставить. (Могу сделать, когда будет сервер.)
- Frigate — если захочется ещё и детекцию людей/машин: приличный UI с сетками из коробки, внутри использует тот же go2rtc.
7. «Моментальное переключение» между камерами
Два фактора:
- WebRTC вместо HLS в браузере — старт < 1 с (HLS думает 2–5 с). go2rtc умеет из коробки.
- Лайфхак с постоянными субпотоками: камеры, которые в сетке у руководства, держать БЕЗ on-demand (постоянно активными), но по субпотоку (102, 720p/~1 Mbit). Даже 30–50 постоянных субпотоков — копейки по трафику, зато открытие сетки и переключение происходят мгновенно, без паузы на подключение к камере. Основные потоки (101) — on-demand, для полноэкранного просмотра.
8. План пилота
- Развернуть Ubuntu-тачку (4 CPU / 8 GB).
- Поставить один go2rtc.
- Завести 10–20 камер скриптом из CSV.
- Неделю тыкать: iVMS через RTSP + браузер через WebRTC.
- Нравится → масштабировать на весь парк скриптом + собрать HTML-сетку.
- Упёрлись в производительность RTSP → добавить MediaMTX вторым слоем (без переделки).
Готовые конфиги/скрипты/systemd → config-examples.md.