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

07-05-02 Наложение текстовых и графических оверлеев

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


Зачем нужны оверлеи?

Представьте, что вы строите систему видеонаблюдения с несколькими камерами. Без дополнительной информации на экране сложно быстро определить, какой именно источник вы видите. Даже в трансляциях или студийных съёмках часто требуется выводить название сцены, имя спикера или текущее время.

Оверлеи решают эту задачу:

  • Идентификация источника: надпись вроде Camera 1 помогает оператору ориентироваться.
  • Синхронизация по времени: отображение точного времени на кадре критично для анализа событий.
  • Брендинг: логотип компании или канала добавляется как графический водяной знак.
  • Служебная информация: например, уровень сигнала, температура, статус подключения.

Важно понимать: оверлеи — это обработка изображения, поэтому они требуют, чтобы видео было декодировано в несжатый формат (например, video/x-raw). Это значит, что вы не можете наложить текст прямо на H.264-поток — сначала нужно распаковать кадры, добавить оверлей, а затем (при необходимости) снова закодировать.


Основные элементы для наложения оверлеев

GStreamer предоставляет несколько готовых элементов для работы с оверлеями. Все они работают на уровне пикселей и вставляются в пайплайн как обычные фильтры.

1. textoverlay — текстовые надписи

Элемент textoverlay позволяет добавить статический или динамический текст на видео. Он поддерживает настройку положения, цвета, фона и шрифта.

Пример базового использования:

... ! textoverlay text="Camera 1" valignment=top halignment=left shaded-background=true ! ...

Разберём параметры:

  • text="Camera 1" — текст, который будет отображаться.
  • valignment=top — вертикальное выравнивание: вверху кадра.
  • halignment=left — горизонтальное выравнивание: слева.
  • shaded-background=true — добавляет полупрозрачный фон под текстом, чтобы он был читаем на любом изображении.

💡 Визуализация: представьте, что в левом верхнем углу видео появляется прямоугольник с надписью Camera 1 на сером фоне. Текст легко читается даже на светлом или тёмном участке изображения.

Вы можете изменять текст динамически из кода (например, в Python), присвоив элементу имя и вызвав set_property("text", "Новое значение").


2. timeoverlay — отображение текущего времени

Если вам нужно выводить точное время, timeoverlay — это самый простой способ. Он автоматически показывает текущее системное время в формате ЧЧ:ММ:СС.мс.

Пример:

... ! timeoverlay halignment=right valignment=top ! ...

Здесь:

  • halignment=right — размещает надпись в правой части кадра.
  • valignment=top — сверху.

💡 Где это полезно?
Например, при записи с камеры в полицейском автомобиле или в системах безопасности. Если произошло событие, вы можете точно определить, в какой момент оно случилось, просто посмотрев на видео.

timeoverlay начинает отсчёт с момента запуска пайплайна, но вы можете настроить смещение или формат времени через дополнительные свойства (например, time-mode=buffer-time для синхронизации с таймстемпами кадров).


3. gdkpixbufoverlay — наложение PNG-изображений

Для добавления логотипов, иконок или водяных знаков используется элемент gdkpixbufoverlay. Он загружает изображение (обычно в формате PNG с альфа-каналом) и накладывает его на видео.

Пример:

... ! gdkpixbufoverlay location=logo.png offset-x=10 offset-y=10 ! ...

Пояснение параметров:

  • location=logo.png — путь к файлу с логотипом.
  • offset-x=10 — отступ от левого края кадра в пикселях.
  • offset-y=10 — отступ от верхнего края.

💡 Важно: изображение должно быть в формате PNG с прозрачным фоном, чтобы логотип не перекрывал видео сплошным прямоугольником.
Например, логотип в виде белой буквы "A" на прозрачном фоне будет аккуратно выглядеть в углу кадра.

Этот элемент также поддерживает масштабирование (scale-x, scale-y) и прозрачность (alpha), что позволяет гибко настраивать внешний вид оверлея.


Где размещать оверлеи в пайплайне?

Оверлеи — это пост-декодерная обработка. Это значит, что они должны находиться после декодирования, но до вывода или повторного кодирования.

Типичное место в пайплайне:

rtspsrc → decodebin → videoconvert → [оверлеи] → videoconvert → [sink или encoder]

Пример полного пайплайна с несколькими оверлеями:

gst-launch-1.0 \
rtspsrc location=rtsp://cam1/stream latency=0 ! \
decodebin ! \
videoconvert ! \
textoverlay text="Main Entrance" valignment=top halignment=left shaded-background=true ! \
timeoverlay halignment=right valignment=top ! \
gdkpixbufoverlay location=logo.png offset-x=10 offset-y=50 ! \
videoconvert ! \
autovideosink

Здесь:

  1. Видео с камеры принимается через RTSP.
  2. Декодируется (decodebin).
  3. Преобразуется в общий формат (videoconvert).
  4. Последовательно накладываются: надпись с названием, текущее время, логотип.
  5. Ещё раз videoconvert — на случай, если оверлеи изменили формат.
  6. Вывод в окно.

⚠️ Предупреждение: если вы забудете videoconvert, GStreamer может не суметь соединить элементы из-за несовпадения форматов. Например, gdkpixbufoverlay ожидает video/x-raw, а декодер может выдавать I420, NV12 или другой вариант — videoconvert обеспечивает совместимость.


Сравнение с FFMPEG

Вы могли сталкиваться с похожими задачами в FFMPEG, где используются фильтры drawtext, drawbox, overlay. Например:

ffmpeg -i input.mp4 -vf "drawtext=text='Camera 1':x=10:y=10, overlay=logo.png" output.mp4

Сходства:

  • Оба подхода требуют декодирования перед наложением.
  • Операции выполняются на уровне пикселей.
  • Нужно контролировать формат и размеры.

Различия:

КритерийFFMPEGGStreamer
ГибкостьОдин фильтр на много задачКаждый оверлей — отдельный элемент
УправлениеСтрока фильтровГраф пайплайна, можно управлять из кода
Динамические измененияОграниченыМожно менять текст/изображение на лету
Интеграция с приложениямиЧерез сложные интерфейсыЧерез appsink, Python, GObject — проще

GStreamer даёт более точный контроль над тем, где и как происходит обработка. Вы можете, например, вставить оверлей только в определённой ветке мультивью или управлять его видимостью программно.


Практические рекомендации

  1. Используйте shaded-background для текста — это делает его читаемым на любом фоне.
  2. Размещайте оверлеи в углах — центр кадра лучше оставить для контента.
  3. Тестируйте с разными разрешениями — отступы в пикселях могут выглядеть по-разному на 720p и 4K.
  4. Не перегружайте кадр — один-два оверлея достаточно. Избыток информации отвлекает.
  5. Следите за производительностью — каждый оверлей требует CPU. На слабых системах лучше использовать аппаратное ускорение или упрощать графику.

Заключение

Наложение оверлеев — это простая, но мощная возможность GStreamer, которая превращает «голое» видео в информативный медиа-поток. Благодаря модульной архитектуре, вы можете комбинировать textoverlay, timeoverlay и gdkpixbufoverlay в любом порядке, точно контролируя, что и где появляется на экране.

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