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

06-05-02 Водяные знаки и логотипы: наложение графики с помощью FFMPEG

06-05-02

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

Основы наложения изображений: фильтр overlay

Наиболее распространённый способ наложения изображения (например, логотипа) на видео в FFMPEG — это использование фильтра overlay. Этот фильтр объединяет два видеоисточника: основной поток (например, с IP-камеры) и графический слой (например, PNG-файл с логотипом).

Простейшая команда выглядит так:

ffmpeg -i rtsp://user:pass@192.168.1.100:554/stream1 -i logo.png \
-filter_complex "[0:v][1:v]overlay=10:10" \
-c:v libx264 -c:a copy out.flv

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

  • -i rtsp://... — основной видеопоток, например, с IP-камеры.
  • -i logo.png — второй вход, содержащий статическое изображение.
  • filter_complex — указывает, что будет использоваться сложный фильтр, объединяющий несколько потоков.
  • [0:v][1:v]overlay=10:10 — синтаксис означает: наложить видео со второго входа ([1:v]) на видео с первого входа ([0:v]) с отступом 10 пикселей от левого края и 10 пикселей от верхнего края.
  • -c:v libx264 — видео перекодируется в H.264.
  • -c:a copy — аудиопоток копируется без изменений.
  • out.flv — выходной файл в контейнере FLV, подходящем для RTMP-трансляций.

⚠️ Важно: фильтр overlay работает только с видео. Аудио от изображения (если оно есть) игнорируется. Поэтому в данном случае мы копируем аудио только от основного источника.

Требования к графическому файлу

Чтобы наложение выглядело корректно, особенно при использовании логотипов, важно правильно подготовить изображение. Вот ключевые требования:

1. Формат с поддержкой прозрачности

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

Пример:

  • ✅ Хорошо: логотип в формате PNG с прозрачным фоном.
  • ❌ Плохо: JPEG-логотип с белым фоном — будет выглядеть как прямоугольник на видео.

2. Подходящий размер

Размер изображения должен быть адекватным относительно разрешения основного видео. Например:

  • Для видео 1920×1080 логотип 200×100 пикселей будет хорошо читаемым, но не перекроет важные детали.
  • Слишком большой логотип (например, 800×400) может доминировать и мешать восприятию.

Если изображение слишком большое, его можно масштабировать прямо в FFMPEG с помощью фильтра scale:

-filter_complex "[1:v]scale=150:-1[logo]; [0:v][logo]overlay=10:10"

Здесь scale=150:-1 означает: установить ширину в 150 пикселей, высоту — пропорционально (чтобы не искажать изображение).

Управление непрозрачностью логотипа

Иногда логотип слишком яркий или плотный, и он перекрывает важную информацию. В таких случаях полезно снизить непрозрачность (сделать логотип полупрозрачным).

FFMPEG не имеет прямого параметра вроде opacity, но это можно сделать двумя способами:

Способ 1: Подготовка PNG-файла

Самый простой и эффективный способ — отредактировать изображение в графическом редакторе (например, GIMP или Photoshop) и сохранить его с пониженной непрозрачностью (например, 50%). Это не создаёт дополнительной нагрузки на FFMPEG.

Способ 2: Использование фильтра colorchannelmixer

Если нужно управлять прозрачностью «на лету», можно воспользоваться фильтром colorchannelmixer, который позволяет изменить альфа-канал:

-filter_complex "[1:v]colorchannelmixer=aa=0.6[logo]; [0:v][logo]overlay=10:10"

Здесь:

  • aa=0.6 — устанавливает альфа-канал (прозрачность) на 60% (0.0 — полностью прозрачно, 1.0 — полностью непрозрачно).
  • [logo] — временный поток с изменённой прозрачностью.

⚠️ Внимание: фильтр colorchannelmixer работает только если входное изображение уже имеет альфа-канал. Если PNG не прозрачный — сначала нужно добавить альфа-канал (например, с помощью -format rgba).

Влияние на производительность и задержку

Добавление логотипа — это не просто «наложение картинки». Это полноценная операция обработки видео, которая влияет на систему:

1. Дополнительное декодирование

FFMPEG должен:

  • Декодировать основной видеопоток.
  • Декодировать PNG-файл (даже если он статичный).
  • Применить фильтр overlay.
  • Перекодировать результат.

🔹 Это означает, что даже при -c copy (копировании потока) нельзя добавить оверлей без перекодирования. Фильтр требует декодирования и последующего кодирования.

2. Нагрузка на CPU

Каждый дополнительный фильтр увеличивает нагрузку на процессор. Особенно заметно это при:

  • Работе с несколькими камерами.
  • Использовании сложных фильтров (например, анимированные логотипы, масштабирование, прозрачность).
  • Высоком разрешении (1080p, 4K).

3. Влияние на задержку

Как обсуждалось в блоке про буферы, каждый этап обработки (включая фильтры) может добавлять задержку:

  • Декодирование PNG.
  • Буферизация в фильтре overlay.
  • Кодирование выходного потока.

Пример:

  • Простой рестриминг без фильтров: задержка ~200 мс.
  • Тот же поток с наложенным логотипом: задержка может вырасти до 400–600 мс, особенно при медленном кодировании.

4. Анимированные логотипы

Если вместо статичного PNG используется видео (например, GIF или MP4 с анимацией), нагрузка возрастает значительно:

  • Требуется декодирование видеопотока логотипа.
  • Постоянная синхронизация по времени.
  • Увеличение буферизации.

Такой подход редко используется в промышленных системах из-за высокой нагрузки.

Практические кейсы применения

1. Брендирование трансляций

Телеканалы, онлайн-курсы, вебинары — все они используют логотипы для идентификации бренда.

Пример:

  • Прямоугольный логотип в правом нижнем углу.
  • Прозрачность 70%, чтобы не перекрывать контент.

2. Защита контента (водяные знаки)

Хотя FFMPEG не предоставляет полноценной DRM-защиты, наложение логотипа усложняет несанкционированное использование видео.

Ограничения:

  • Водяной знак можно обрезать или замаскировать.
  • Не защищает от записи экрана.
  • Но отпугивает «случайных» нарушителей.

3. Идентификация камеры в системах видеонаблюдения

В мультикамерных системах полезно отображать ID камеры или её название. Хотя чаще это делается текстом (drawtext), логотип может дополнять информацию.

Пример:

  • Уголок с логотипом компании + текст "Камера 3, этаж 2".

Рекомендации по использованию

АспектРекомендация
Формат изображенияИспользуйте PNG с альфа-каналом
Размер логотипа10–15% от высоты видео (например, 100–150 пикселей для 1080p)
ПозицияУглы (чаще — правый нижний), чтобы не мешать контенту
Прозрачность50–70% для водяных знаков; 90–100% для брендирования
ПроизводительностьИзбегайте анимированных логотипов в реальном времени
ЗадержкаУчитывайте, что фильтр overlay требует перекодирования и добавляет задержку

Заключение

Наложение логотипов с помощью FFMPEG — простая, но мощная функция, широко применяемая в реальных видеосистемах. Фильтр overlay позволяет гибко управлять позицией, размером и прозрачностью графики. Однако важно помнить, что любое вмешательство в видеопоток требует перекодирования, что влияет на производительность и задержку.

Выбирая, где и как наложить логотип, инженер должен взвесить:

  • Необходимость брендирования или защиты.
  • Допустимую задержку в системе.
  • Нагрузку на оборудование.

В некоторых случаях логотип лучше накладывать на стороне камеры (если поддерживается), на медиасервере или даже в клиентском плеере — это зависит от архитектуры системы. FFMPEG же остаётся отличным компромиссным решением, когда нужно быстро и гибко реализовать оверлей в потоке.