Перейти к основному содержимому

Связь FFMPEG с ONVIF, медиапротоколами и видеосвязью

06-06-03

На предыдущих этапах лекции мы рассмотрели, как FFMPEG работает с сетевыми медиапротоколами, как он трансмутирует, комбинирует и преобразует видеопотоки. Теперь пришло время собрать эти знания воедино и показать, как FFMPEG на практике становится «мостом» между различными системами — от IP-камер до медиасерверов и платформ видеосвязи. Этот слайд завершает цепочку практических сценариев и демонстрирует, почему FFMPEG так часто оказывается в центре архитектуры современных видеосистем.


Интеграция с ONVIF: от камеры к потоку

ONVIF — это стандарт, позволяющий унифицировать взаимодействие с IP-камерами от разных производителей. Один из ключевых сервисов ONVIF — Media Service — предоставляет информацию о доступных видеопрофилях, включая RTSP-URL для каждого потока. FFMPEG использует этот URL как входной источник, что делает интеграцию простой и стандартизированной.

Как это работает на практике?

  1. Получение RTSP-URL через ONVIF
    С помощью ONVIF-клиента (например, ONVIF Device Manager, gSOAP, или Python-библиотеки onvif-zeep) запрашивается список профилей камеры. Каждый профиль содержит параметры: разрешение, битрейт, кодек (H.264/H.265), и, что важно, RTSP-адрес потока.

    Пример RTSP-ссылки:

    rtsp://192.168.1.100:554/onvif-media/media.amp?profile=Profile_1
  2. Передача потока в FFMPEG
    Полученный URL используется напрямую в команде FFMPEG:

    ffmpeg -rtsp_transport tcp -i "rtsp://192.168.1.100:554/onvif-media/media.amp?profile=Profile_1" \
    -c copy -f mp4 camera_recording.mp4

    Здесь:

    • -rtsp_transport tcp — стабильный режим передачи, устойчивый к потерям пакетов;
    • -c copy — поток копируется без перекодирования (remux), что минимизирует задержку и нагрузку на CPU;
    • -f mp4 — указание формата вывода (можно использовать mkv, ts и др.).

Зачем это нужно?

  • Автоматизация систем видеонаблюдения (VMS):
    Система может опрашивать камеру по ONVIF, получать актуальные параметры и запускать FFMPEG-процессы для записи или рестриминга.
  • Динамическая адаптация:
    Если камера поддерживает несколько профилей (например, высокое и низкое качество), FFMPEG может переключаться между ними в зависимости от нагрузки или цели (архив vs. превью).

💡 Пример:
В центре мониторинга 50 камер. Скрипт каждые 10 минут проверяет доступность каждой камеры через ONVIF, получает RTSP-URL нужного профиля и запускает FFMPEG для записи в архив. При сбое — процесс перезапускается.


FFMPEG как шлюз между протоколами видеосвязи

FFMPEG редко используется напрямую для реализации SIP или WebRTC, но он отлично справляется с ролью медиашлюза, преобразуя потоки из одного формата в другой. Это особенно полезно при интеграции с медиасерверами, такими как Janus, Mediasoup, Asterisk, или Wowza.

Типичный сценарий: WebRTC → RTMP/HLS

WebRTC обеспечивает ультранизкую задержку, но плохо масштабируется на тысячи зрителей. Чтобы транслировать WebRTC-стрим в массовую аудиторию, его нужно конвертировать в RTMP или HLS.

Как это организовать?

  1. Медиасервер принимает WebRTC-поток
    Например, пользователь подключается к Janus через браузер.

  2. Сервер экспортирует поток как RTP/UDP или SRT
    Janus может пересылать поток в виде RTP/UDP на локальный порт.

  3. FFMPEG принимает поток и конвертирует его

    ffmpeg -i "udp://127.0.0.1:5004?timeout=5000000" \
    -c:v libx264 -preset veryfast -tune zerolatency \
    -c:a aac \
    -f flv rtmp://twitch.tv/live/your_stream_key

    Здесь:

    • Вход: UDP-поток от медиасервера;
    • Выход: RTMP-стрим на Twitch;
    • Применяется транскодирование, так как WebRTC часто использует VP8/VP9, а RTMP — H.264.

🔄 Обратный путь тоже возможен:
FFMPEG может принимать RTMP-поток и перекодировать его в SRT или UDP/RTP, чтобы передать в WebRTC-сервер, который уже ретранслирует его в браузеры.

Почему это важно?

  • Масштабируемость:
    Один WebRTC-пользователь может транслироваться на тысячи зрителей через CDN.
  • Совместимость:
    FFMPEG «скрывает» несовместимость между протоколами, позволяя строить гибридные системы.

💡 Пример:
Онлайн-конференция: докладчик подключается по WebRTC к медиасерверу. FFMPEG забирает его поток, транскодирует в H.264 и отправляет в RTMP на YouTube и в HLS для внутреннего просмотра. Аудио смешивается с презентацией — всё это в одном FFMPEG-процессе.


FFMPEG в мультимедийных комплексах: центральный трансформатор форматов

В сложных видеокомплексах — студиях, центрах управления, образовательных платформах — часто требуется синхронизация, комбинирование и конвертация множества источников. FFMPEG выступает в роли универсального «адаптера», который:

  • принимает разнородные входы (RTSP, файлы, экран, микрофоны);
  • применяет фильтры (масштабирование, оверлеи, PIP);
  • выдаёт унифицированный выход в нужный протокол.

Типичная архитектура мультимедийного комплекса

[IP-камера] → RTSP →
[Экран] → SRT →→ FFMPEG → RTMP → CDN
[Файл] → MP4 → → HLS → VMS
[Микрофон] → RTP → → SRT → Архив

FFMPEG в этом случае:

  • синхронизирует источники;
  • транскодирует под требования платформы;
  • добавляет графику (логотип, титры);
  • разветвляет на несколько выходов.

Пример команды для студийного комплекса

ffmpeg \
-i rtsp://cam1/live \
-i rtsp://cam2/live \
-i presentation.mp4 \
-i "udp://192.168.1.50:5000" \
-filter_complex "
[0:v]scale=1280:720,setpts=PTS-STARTPTS[main];
[1:v]scale=320:180,setpts=PTS-STARTPTS[pip];
[2:v]scale=1280:720,setpts=PTS-STARTPTS[pres];
[pres][pip]overlay=main_w-overlay_w-20:20[comp];
[comp][main]overlay=0:0;
[3:a]aformat=sample_rates=48000:channel_layouts=stereo[audio]
" \
-map "[video]" -map "[audio]" \
-c:v libx264 -preset veryfast -b:v 4M \
-c:a aac -b:a 128k \
-f flv rtmp://cdn/live/stream1 \
-f hls -hls_time 4 -hls_list_size 5 stream.m3u8

Что делает эта команда:

  • Берёт 4 источника: две камеры, презентацию и аудио по RTP;
  • Масштабирует и выравнивает временные метки;
  • Накладывает PIP (вторая камера) поверх презентации;
  • Смешивает аудио;
  • Отправляет результат одновременно в RTMP (для стрима) и HLS (для архива и просмотра).

Сводная таблица: роли FFMPEG в интеграционных сценариях

СценарийВходВыходОбработка в FFMPEG
ONVIF → ЗаписьRTSP (через ONVIF)MP4/MKVRemux (-c copy)
ONVIF → РестримингRTSPRTMP/SRT/HLSRemux или транскодирование
WebRTC → RTMPRTP/UDP (от медиасервера)RTMPТранскодирование + упаковка
Мультивью (видеостена)4× RTSPRTMP/HLSМозаика (xstack), масштабирование
Студийный комплексRTSP, файл, RTP, SRTRTMP, HLS, SRT, файлКомпозитинг, PIP, аудиосмешение
Брендирование трансляцииRTSPRTMPНаложение логотипа (overlay)

Заключение: FFMPEG как «центральный узел» в видеосистемах

FFMPEG редко выступает как конечная точка назначения, но он — ключевой элемент интеграции. Он стоит между:

  • устройствами (камеры, экраны, микрофоны);
  • протоколами (RTSP, RTMP, SRT, HLS, WebRTC);
  • форматами (H.264, H.265, VP8, AAC, MP3);
  • системами (VMS, CDN, медиасерверы, архивы).

Его сила — в универсальности и простоте. При этом важно помнить:

  • FFMPEG не заменяет медиасерверы, но отлично с ними работает вместе;
  • Он не обеспечивает ультранизкую задержку, как GStreamer, но достаточно быстр для большинства задач;
  • Он не управляет сессиями, но превосходно обрабатывает потоки, которые ему передают.