07-05-01 Мультивью (мозаика) с compositor videomixer
В предыдущих разделах мы рассмотрели, как с помощью GStreamer получать и отображать видеопоток с одной RTSP-камеры. Однако на практике часто возникает необходимость одновременно отслеживать несколько источников — например, видео с нескольких камер в системе видеонаблюдения или в телестудии. Для этого GStreamer предоставляет мощные инструменты композиции, позволяющие объединять несколько видеопотоков в один кадр.
Один из наиболее востребованных сценариев — мультивью, или видеомозаика, когда изображения с нескольких камер размещаются на одном экране в виде сетки. В этом разделе мы разберём, как реализовать такой пайплайн с использованием элемента compositor, который является современным и предпочтительным способом объединения видео в GStreamer.
Что такое compositor и зачем он нужен
Элемент compositor — это специальный фильтр в GStreamer, предназначенный для наложения и объединения нескольких видеопотоков в один выходной кадр. Он заменил устаревший элемент videomixer и предлагает более гибкую и надёжную архитектуру.
Основные функции compositor:
- Принимает несколько входных видеопотоков.
- Позволяет задавать позицию, размер и прозрачность каждого входа.
- Поддерживает альфа-наложение, что позволяет создавать сложные эффекты (например, полупрозрачные оверлеи).
- Работает с одинаковым форматом входов — все потоки должны быть приведены к единому разрешению и цветовому формату.
Важно:
compositor— это не просто "смешиватель", а композитор, то есть он умеет работать с видеопотоками как с отдельными слоями, подобно тому, как это делают графические редакторы или видеоредакторы.
Пример пайплайна: мозаика из двух камер
Рассмотрим следующий пайплайн, который объединяет два RTSP-источника в один кадр:
gst-launch-1.0 \
rtspsrc location=rtsp://cam1 latency=0 ! decodebin ! videoconvert ! videoscale ! queue ! \
video/x-raw,width=640,height=360 ! compositor name=comp ! videoconvert ! autovideosink \
rtspsrc location=rtsp://cam2 latency=0 ! decodebin ! videoconvert ! videoscale ! queue ! \
video/x-raw,width=640,height=360 ! comp.
Разберём его по частям.
Структура пайплайна
Пайплайн состоит из двух параллельных веток, каждая из которых:
- Получает видеопоток с RTSP-камеры (
rtspsrc). - Декодирует поток (
decodebin). - Преобразует цветовое пространство (
videoconvert). - Масштабирует изображение (
videoscale). - Добавляет буфер (
queue) для стабильности. - Устанавливает формат (
video/x-raw,width=640,height=360). - Передаёт кадр на вход элемента
compositor.
Оба потока подключаются к одному и тому же элементу compositor, который объединяет их и отправляет результат в autovideosink — окно вывода.
Зачем выравнивать форматы и размеры
Один из ключевых моментов при работе с compositor — все входные потоки должны иметь одинаковый формат. Это включает:
- Разрешение (ширина и высота),
- Цветовое пространство (например,
I420,RGB), - Частоту кадров,
- Глубину цвета.
Если форматы не совпадают, GStreamer не сможет соединить элементы (ошибка автоподключения), и пайплайн не запустится.
Роль videoscale и capsfilter
В примере мы используем:
videoscale— чтобы изменить размер изображения до нужного (например, 640×360).video/x-raw,width=640,height=360— это caps-ограничение, которое явно указывает, что на этом участке пайплайна ожидается видео с разрешением 640×360.
Аналогия: представьте, что вы складываете два листа бумаги на один конверт. Если листы разного размера — их нужно подрезать.
videoscale— это ножницы, аcaps— шаблон, по которому вы их обрезаете.
Без этих шагов потоки могут остаться в разных разрешениях (например, одна камера 1080p, другая — 720p), и compositor не сможет их корректно наложить.
Как задаются позиции камер в мозаике
По умолчанию compositor размещает каждый новый вход в левый верхний угол. Чтобы создать мозаику, нужно явно указать позицию и размер для каждого входа.
Это делается через свойства входов элемента compositor. Например:
xpos— горизонтальное смещение (в пикселях),ypos— вертикальное смещение,width,height— размер области (если отличается от входного кадра),alpha— прозрачность (от 0.0 до 1.0).
Пример с явным позиционированием
Чтобы первая камера занимала левую половину экрана, а вторая — правую, можно модифицировать пайплайн так:
gst-launch-1.0 \
compositor name=comp sink_0::xpos=0 sink_0::ypos=0 sink_1::xpos=640 sink_1::ypos=0 ! \
videoconvert ! videoscale ! video/x-raw,width=1280,height=360 ! autovideosink \
\
rtspsrc location=rtsp://cam1 latency=0 ! decodebin ! videoconvert ! videoscale ! \
video/x-raw,width=640,height=360 ! queue ! comp. \
\
rtspsrc location=rtsp://cam2 latency=0 ! decodebin ! videoconvert ! videoscale ! \
video/x-raw,width=640,height=360 ! queue ! comp.
Здесь:
compositorполучает два входа.- Первый вход (
sink_0) размещается в точке (0, 0). - Второй вход (
sink_1) — в точке (640, 0). - Общий выходной кадр имеет размер 1280×360 (640×2 на 360).
Визуализация:
+---------------------+---------------------+
| Камера 1 | Камера 2 |
| (640×360) | (640×360) |
+---------------------+---------------------+
<-------- 1280 пикселей ширины -------->
Таким образом, мы получаем горизонтальную мозаику из двух камер.
Нагрузка на систему и задержка при композиции
Добавление нескольких камер и операций композиции увеличивает нагрузку на CPU и GPU, особенно если:
- Используется программное декодирование (например,
avdec_h264вместоvaapih264dec). - Много входов (4, 9, 16 камер).
- Высокое разрешение и частота кадров.
Что влияет на задержку:
| Фактор | Влияние на задержку |
|---|---|
latency=0 в rtspsrc | Минимизирует буфер джиттера → снижает задержку |
queue в пайплайне | Добавляет буфер → может увеличить задержку, но стабилизирует поток |
decodebin | Автоматически выбирает декодер, но может добавить накладные расходы |
compositor | Сам по себе работает быстро, но требует предварительной обработки входов |
Совет: для мониторинга в реальном времени (например, в OBS) лучше использовать
sync=falseвautovideosink, чтобы кадры выводились сразу по готовности, а не ждали синхронизации с системным временем.
Сравнение с FFMPEG: в чём преимущество GStreamer
В FFMPEG аналогичный эффект мультивью можно достичь с помощью фильтра xstack или hstack/vstack, например:
ffmpeg -i rtsp://cam1 -i rtsp://cam2 \
-filter_complex "[0:v]scale=640:360[v0];[1:v]scale=640:360[v1];[v0][v1]hstack" \
-f sdl "Multi View"
Однако у GStreamer есть ключевые преимущества:
- Гибкость: можно динамически добавлять/удалять источники, менять позиции на лету.
- Контроль задержки: точная настройка
latency,queue,sync. - Программируемость: через Python или C можно управлять пайплайном в реальном времени.
- Надёжность в сложных сценариях: лучше восстанавливается при обрыве соединения.
Итог: если вам нужно просто разово склеить два видео — FFMPEG подойдёт.
Если вы строите систему видеонаблюдения, студию или OBS-источник с динамическим управлением — GStreamer предпочтительнее.
Заключение
Элемент compositor в GStreamer — это мощный инструмент для создания мультивью-мозаик из нескольких видеопотоков. Он позволяет:
- Гибко управлять позицией и размером каждого источника,
- Обеспечивать минимальную задержку при правильной настройке,
- Интегрировать результат в OBS, веб-интерфейсы или другие приложения.
Главные принципы успешного использования:
- Приводите все входы к одному формату (размер, цвет, fps).
- Используйте
queueдля стабильности, но не переборщайте. - Настройте
latencyиsyncв зависимости от задачи (мониторинг vs запись). - Планируйте нагрузку на систему — особенно при большом числе камер.
В следующих разделах мы рассмотрим, как добавлять текстовые оверлеи, логотипы и аудио — чтобы превратить простую мозаику в полноценный медиакомплекс.