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

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.

Разберём его по частям.

Структура пайплайна

Пайплайн состоит из двух параллельных веток, каждая из которых:

  1. Получает видеопоток с RTSP-камеры (rtspsrc).
  2. Декодирует поток (decodebin).
  3. Преобразует цветовое пространство (videoconvert).
  4. Масштабирует изображение (videoscale).
  5. Добавляет буфер (queue) для стабильности.
  6. Устанавливает формат (video/x-raw,width=640,height=360).
  7. Передаёт кадр на вход элемента 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, веб-интерфейсы или другие приложения.

Главные принципы успешного использования:

  1. Приводите все входы к одному формату (размер, цвет, fps).
  2. Используйте queue для стабильности, но не переборщайте.
  3. Настройте latency и sync в зависимости от задачи (мониторинг vs запись).
  4. Планируйте нагрузку на систему — особенно при большом числе камер.

В следующих разделах мы рассмотрим, как добавлять текстовые оверлеи, логотипы и аудио — чтобы превратить простую мозаику в полноценный медиакомплекс.