Appearance
Публикация в узел
Обычно узел сам подключается к камере и забирает её поток. Камера с source: publisher работает наоборот: публикатор — кодер, ffmpeg, камера, умеющая отправлять поток, — подключается к узлу и отправляет поток в него по RTSP. Опубликованный поток записывается и раздаётся по RTSP, HLS и WebRTC так же, как поток любой камеры.
Настройка
yaml
security:
users:
- user: publisher
pass: "argon2:$argon2id$..."
permissions:
- action: publish
path: camera_042
cameras:
camera_042:
source: publisher
record: true
audio: truesub: publisher так же принимает субпоток камеры, его публикуют на /<camera>/sub.
Публикация пишет в архив камеры, поэтому для неё всегда нужен пользователь с publish на эту камеру — даже если security.users пуст и всё остальное открыто.
Как публиковать
Публикатор отправляет поток на rtsp://<node>:<rtsp.port>/<camera>:
bash
ffmpeg -re -i input.mp4 -c copy -f rtsp -rtsp_transport tcp \
rtsp://publisher:secret@node:8554/camera_042- Транспорт — TCP (interleaved). На
SETUPпо UDP узел отвечает461, и ffmpeg сам переходит на TCP. - Кодеки: видео H.264 или H.265, звук AAC или G.711. Звуковая дорожка в другом кодеке не принимается.
- Звук идёт вместе с картинкой по RTCP Sender Report публикатора, даже если он начался раньше первого ключевого кадра.
Во время публикации
- Публикатор один: пока он шлёт видео, другому отвечают
455, а в журнале узла названы оба. Публикатора, который 5 секунд не шлёт видео, узел отпускает и принимает следующего. - Запись начинается с публикацией и заканчивается вместе с ней: перерыв между публикациями — разрыв в архиве, как при переподключении камеры.
- Пока никто не публикует, зрителям RTSP и HLS отказывают, а запись ждёт.
Ответы
| Статус | Когда |
|---|---|
401 | нет пользователя с publish на камеру или неверный пароль |
404 | такой камеры нет |
405 | у камеры source — не publisher |
455 | камеру уже публикует другой |
461 | SETUP просит UDP |
503 | в кластере: узел не пишет (нет роли recorder) или кластер не ответил, кто публикует камеру |
В кластере
Узлы с записью стоят за TCP-балансировщиком, и публикатор может попасть на любой из них. Узел, на который он попал, пишет камеру, а зрители получают её на любом узле. Если публикатор вернётся через другой узел, пишет уже тот, и архив собирается со всех.
- Публикатор один на весь кластер: пока публикация камеры за одним узлом, остальные отвечают
455. Узел, который пропал, её отпускает. - Публикацию принимают только узлы с ролью
recorder; балансировщик направляйте только на них. /api/health/readyотвечает без пароля и говорит балансировщику, какие узлы готовы.
Балансировщик передаёт адрес публикатора по PROXY protocol, чтобы узел видел его, а не адрес балансировщика. На каждом узле балансировщику разрешено передавать этот адрес:
yaml
rtsp:
trustedProxies: ["10.0.0.5"]С адресов из rtsp.trustedProxies соединение обязано начинаться с заголовка PROXY (v1 или v2); ips пользователей и журнал берут адрес из него. От остальных заголовок не читается.
Подробнее — в разделе для интеграторов
Ограничения
- Только TCP: UDP не проходит через TCP-балансировщик, а все известные нам публикаторы умеют TCP.