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
Здесь:
- Видео с камеры принимается через RTSP.
- Декодируется (
decodebin). - Преобразуется в общий формат (
videoconvert). - Последовательно накладываются: надпись с названием, текущее время, логотип.
- Ещё раз
videoconvert— на случай, если оверлеи изменили формат. - Вывод в окно.
⚠️ Предупреждение: если вы забудете
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
Сходства:
- Оба подхода требуют декодирования перед наложением.
- Операции выполняются на уровне пикселей.
- Нужно контролировать формат и размеры.
Различия:
| Критерий | FFMPEG | GStreamer |
|---|---|---|
| Гибкость | Один фильтр на много задач | Каждый оверлей — отдельный элемент |
| Управление | Строка фильтров | Граф пайплайна, можно управлять из кода |
| Динамические изменения | Ограничены | Можно менять текст/изображение на лету |
| Интеграция с приложениями | Через сложные интерфейсы | Через appsink, Python, GObject — проще |
GStreamer даёт более точный контроль над тем, где и как происходит обработка. Вы можете, например, вставить оверлей только в определённой ветке мультивью или управлять его видимостью программно.
Практические рекомендации
- Используйте
shaded-backgroundдля текста — это делает его читаемым на любом фоне. - Размещайте оверлеи в углах — центр кадра лучше оставить для контента.
- Тестируйте с разными разрешениями — отступы в пикселях могут выглядеть по-разному на 720p и 4K.
- Не перегружайте кадр — один-два оверлея достаточно. Избыток информации отвлекает.
- Следите за производительностью — каждый оверлей требует CPU. На слабых системах лучше использовать аппаратное ускорение или упрощать графику.
Заключение
Наложение оверлеев — это простая, но мощная возможность GStreamer, которая превращает «голое» видео в информативный медиа-поток. Благодаря модульной архитектуре, вы можете комбинировать textoverlay, timeoverlay и gdkpixbufoverlay в любом порядке, точно контролируя, что и где появляется на экране.
В следующих частях мы увидим, как такие оверлеи можно использовать в составе более сложных сценариев — например, в мультивью или при трансляции в OBS. А пока важно запомнить: оверлеи — это обработка, а значит, они требуют декодированного видео и размещаются в соответствующем месте пайплайна.