Appearance
Архитектура
Обзор
ForgeVis забирает поток с каждой камеры один раз и раздаёт его всем потребителям через broadcast-архитектуру. По умолчанию без перекодирования: видео с камеры записывается и раздаётся как есть. Перекодирование включается, только когда зритель выбирает 720p в HLS.
Основные компоненты
┌─────────────┐
│ Камера │ RTSP/H.264
│ (source) │────────────┐
└─────────────┘ │
▼
┌──────────────┐
│ StreamHub │
│ (broadcast) │
└──────────────┘
│
┌──────────┼──────────┐─────────┐
▼ ▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│Recorder│ │ RTSP │ │ RTSP │ │ HLS │
│ │ │Client 1│ │Client 2│ │Client 1│
└────────┘ └────────┘ └────────┘ └────────┘
│ │
▼ ▼
┌────────┐ ┌────────┐
│ Disk │ │ HLS │
│ (fMP4) │ │Client 2│
└────────┘ └────────┘StreamHub
Назначение: Одно подключение к камере, broadcast всем потребителям
Ключевые возможности:
- Одно RTSP подключение на камеру
- Внутренний буфер кадров для плавной раздачи
- Ленивое подключение: старт при первом подписчике
- Idle timeout: отключение через N секунд без подписчиков
Поток данных: Камера → StreamHub → Несколько потребителей (Recorder + RTSP клиенты)
Recorder
Назначение: Запись видео кадров в fMP4 сегменты
Ключевые возможности:
- Фрагментированный MP4 формат
- Настраиваемая длительность сегмента (по умолчанию: 900с = 15 минут)
- Автоматическое переподключение при таймауте/ошибке
- Шаблоны путей с плейсхолдерами
Процесс:
- Подписка на StreamHub
- Ожидание ключевого кадра для начала записи
- Запись видео данных в файл
- Создание нового файла сегмента каждые N секунд
- Финализация сегмента при таймауте или ручной остановке
RTSP Сервер
Назначение: Рестриминг камер RTSP клиентам
Ключевые возможности:
- Полная поддержка RTSP протокола
- TCP транспорт для надёжности
- Автоматическая фрагментация пакетов для сетевой эффективности
- Поддержка main + substream (
/camera_001и/camera_001/sub)
Как работает:
- Клиент подключается по RTSP протоколу
- Сервер подписывается на StreamHub для этой камеры
- Видео кадры упаковываются и отправляются клиенту
- Соединение закрывается автоматически при отключении клиента
Поток данных
Путь записи
Камера (RTSP)
→ StreamHub (broadcast)
→ Recorder (подписка)
→ Диск (файлы fMP4 сегментов)Путь рестриминга
Камера (RTSP)
→ StreamHub (broadcast)
→ RTSP Server (подписка)
→ Клиент (VLC, ffmpeg и т.д.)По умолчанию без перекодирования
Видео с камеры записывается и раздаётся как есть.
Запись и рестрим:
- ✅ Чтение потока с камеры
- ✅ Запись в файл и раздача клиентам
- ✅ Упаковка для сетевой передачи и в контейнер MP4
- ❌ Декодирование, обработка и кодирование видео
- ❌ Изменение битрейта, разрешения и качества
Результат: минимальная нагрузка на CPU, обработка тысяч камер
Ступень 720p в HLS
Перекодирование включается, только когда зритель выбирает 720p в HLS. Ступень кодирует отдельный процесс ffmpeg с RTSP-рестрима этого же узла, так что запись и остальных зрителей она не касается. Кодер работает, пока ступень смотрят, и одновременно их не больше transcodeMaxConcurrent. Подробнее — в разделе Выбор качества.
Параллельная обработка
- Асинхронная архитектура: Неблокирующие операции для максимальной эффективности
- Задачи на камеру: Каждая камера работает независимо
- Broadcast распространение: Эффективное распределение кадров между потребителями
- Неблокирующий I/O: Сетевые и дисковые операции не блокируют другие камеры
Использование памяти
На камеру (~10 МБ):
- Буфер кадров для плавного распространения
- Минимальные буферы пакетов
- Краткосрочный буфер записи
Для 1000 камер: ~10-12 ГБ RAM всего
Масштабируемость
Узкие места:
- Сетевой I/O (4 Гбит/с для 1000 камер @ 4 Мбит/с)
- Дисковый I/O (500 МБ/с запись для 1000 камер)
- File descriptors (1 сокет на камеру)
- Память (10 ГБ для 1000 камер)
Решения:
- Несколько 10G NIC или сетевых интерфейсов
- NVMe SSD или RAID для записи на диск
- Увеличить ulimit:
ulimit -n 100000 - 32-64 ГБ RAM
Разделение записи и раздачи
Запись и раздачу зрителям можно разнести по разным серверам: камера по-прежнему подключена один раз, а нагрузку от зрителей несёт отдельный сервер.
Сервер записи (origin)
- Подключение к камерам (RTSP)
- Запись на диск (fMP4)
- RTSP-рестрим для сервера раздачи
Сервер раздачи (edge)
- Забирает поток у сервера записи, как у обычной камеры
- Раздаёт зрителям по RTSP, HLS и WebRTC
Преимущества:
- Одно подключение к камере
- Отказоустойчивость (сервер раздачи может падать независимо)
- Масштабируемость (добавление серверов раздачи)
В кластере то же самое делают роли узлов recorder и streamer — см. Кластер.
Пример конфигурации
Сервер записи:
yaml
rtsp:
enabled: true # для внутреннего рестрима
port: 8554
cameras:
camera_001:
source: "rtsp://camera-ip/stream1"
record: true # включить записьСервер раздачи:
yaml
rtsp:
enabled: true # для клиентов
port: 8554
cameras:
camera_001:
source: "rtsp://origin-server:8554/camera_001" # поток с Origin
record: false # только рестриминг