Захват RTSP (Ingestion)
RUSEON Core подключается к IP-камерам и источникам RTSP видеопотоков с помощью библиотек bluenviron/gortsplib/v4 и pion/rtp.
Жизненный цикл подключения
- Ограничение конкурентных хендшейков: Все попытки подключения проходят через семафор (
dialSemaphore, максимум 10 одновременных подключений) для предотвращения эффекта Thundering Herd и перегрузки сетевой карты при массовом старте сотен камер. - Describe и Setup: Выполняет
DESCRIBEи инициализирует треки черезSETUP(по умолчанию используется надежный протокол TCP interleaved, с возможностью переключения на UDP). - Play и чтение пакетов: Отправляет команду
PLAYи регистрирует колбэки:OnPacketRTP: Извлечение NAL-юнитов из RTP пакетов.OnPacketLost: Инкремент счетчиков ошибок и логирование без разрыва соединения.OnDecodeError: Безопасная обработка поврежденных кадров.
Обработка видеокодеков
RUSEON Core выполняет демультиплексирование потоков без распаковки видео на CPU:
- H.264 (AVC): Извлечение параметров SPS (тип 7), PPS (тип 8) и ключевых кадров IDR (тип 5).
- H.265 (HEVC): Извлечение параметров VPS (тип 32), SPS (тип 33), PPS (тип 34) и ключевых кадров IRAP/IDR (типы 16–21).
- Расчет битрейта: Вычисляется по скользящему 1-секундному окну и передается в телеметрию камеры.
Реконнект с экспоненциальной задержкой (Exponential Backoff + Jitter)
При потере связи с камерой:
- В EventBus публикуется событие
camera_offline, а статус камеры переходит вoffline. - Запускается цикл переподключения с экспоненциальной задержкой и случайным джиттером: $$\text{delay} = \min(60\text{с}, 1\text{с} \times 2^{\text{reconnectCount}}) \pm 20% \text{ джиттер}$$
- Это исключает лавинообразные одновременные повторные запросы к камерам.
- При успешном восстановлении связи публикуется
camera_online, а статус возвращается вonline.