◆ ForgeVis
Skip to content

Публикация в узел ​

Обычно узел сам подключается к камере и забирает её поток. Камера с 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: true

sub: 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камеру уже публикует другой
461SETUP просит 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.

Proprietary software.