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

06-05-01 Наложение текста с помощью фильтра drawtext

06-05-01

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

Рассмотрим, как работает этот фильтр, какие параметры он поддерживает, и как его использовать на практике.


Основы использования фильтра drawtext

Фильтр drawtext применяется на этапе видеофильтрации (-vf) и позволяет накладывать текст поверх каждого кадра. Простейшая команда выглядит так:

ffmpeg -i rtsp://example.com/cam1 \
-vf "drawtext=text='Камера 1':fontcolor=white:fontsize=24:x=10:y=10" \
-c:v libx264 -c:a copy -f flv rtmp://server/app/cam1

Эта команда:

  • Принимает видеопоток с IP-камеры по RTSP;
  • Накладывает белый текст «Камера 1» размером 24 пикселя в верхний левый угол (с отступом 10 пикселей);
  • Перекодирует видео в H.264, оставляя аудио без изменений;
  • Отправляет результат на RTMP-сервер.

Разберём основные параметры фильтра.


Ключевые параметры фильтра drawtext

1. text — содержание текста

Задаёт строку, которая будет отображаться. Может быть статичной:

text='Камера 1'

или содержать специальные переменные (см. ниже — динамический текст).

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


2. fontcolor — цвет текста

Определяет цвет шрифта. Поддерживаются именованные цвета (white, red, blue) и шестнадцатеричные коды:

fontcolor=yellow
fontcolor=#FF0000 # красный
fontcolor=0x00FF00 # зелёный

Также можно задать прозрачность с помощью суффикса @ и значения от 0.0 (полная прозрачность) до 1.0 (непрозрачность):

fontcolor=white@0.8

3. fontsize — размер шрифта

Задаёт высоту шрифта в пикселях:

fontsize=24

Если не указан, FFMPEG выберет размер автоматически (обычно слишком маленький). Рекомендуется всегда указывать явно, особенно при работе с разными разрешениями видео.


4. x и y — позиция текста

Определяют координаты левого верхнего угла текста в пикселях относительно левого верхнего угла кадра:

x=10:y=10

Также можно использовать выражения на основе ширины (W) и высоты (H) кадра:

x=W-200:y=H-50        # 200 пикселей от правого края, 50 от нижнего
x=(W-tw)/2 # по центру по горизонтали (tw — ширина текста)
y=(H-th)/2 # по центру по вертикали (th — высота текста)

Подсказка: FFMPEG автоматически вычисляет tw и th — ширину и высоту текста — что позволяет точно центрировать надпись.


5. box и boxcolor — фон под текстом

Чтобы текст был читаем на сложном фоне (например, при наложении на движущееся изображение), можно добавить прямоугольный фон:

box=1:boxcolor=black@0.5
  • box=1 — включает фон;
  • boxcolor — цвет фона с возможностью прозрачности. Здесь: чёрный с 50% прозрачности.

Это создаёт полупрозрачную подложку под текстом, улучшая читаемость.


Динамический текст: использование выражений

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

Текущее время

Чтобы отобразить текущее время, используется выражение:

text='%{localtime\:%T}'

Разберём:

  • %{localtime} — встроенная переменная, возвращающая текущее время;
  • \: — экранированный двоеточие (чтобы не интерпретировать как разделитель параметров);
  • %T — формат времени в виде ЧЧ:ММ:СС.

Пример:

drawtext=text='%{localtime\:%T}':fontcolor=white:fontsize=20:x=10:y=50

Отобразит: 14:23:05

Другие полезные форматы:

  • %{localtime\:%Y-%m-%d} — дата: 2025-04-05
  • %{localtime\:%a %H:%M} — день недели и время: Sat 14:23

Важно: FFMPEG обновляет значение выражения каждый кадр, поэтому время будет меняться плавно и точно.


Статус трансляции: LIVE, REC и др.

Можно вручную указать статус, например:

text='LIVE':fontcolor=red:fontsize=30:x=W-100:y=10

Или использовать условные выражения (через if), но это требует более сложного синтаксиса. Проще всего — комбинировать с внешними скриптами, которые динамически генерируют команду FFMPEG.


Работа со шрифтами: где взять и как указать

По умолчанию FFMPEG использует встроенный шрифт, который может выглядеть не очень эстетично. Чтобы использовать собственный шрифт, нужно указать путь к файлу .ttf или .otf:

fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf

Особенности путей на разных ОС

ОСПример пути
Linux/usr/share/fonts/truetype/...
macOS/Library/Fonts/Arial.ttf или ~/Library/Fonts/...
WindowsC:\\Windows\\Fonts\\arial.ttf (обратные слеши экранируются)

Совет: Используйте стандартные шрифты (Arial, DejaVu, Roboto), чтобы избежать проблем с отсутствием файла.

Если шрифт не найден, FFMPEG выдаст предупреждение и вернётся к встроенному.


Практические сценарии использования

1. Отображение имени камеры

Часто в системах видеонаблюдения нужно знать, с какой именно камеры идёт изображение. Пример:

drawtext=text='Камера 3 — Вестибюль':fontcolor=white:fontsize=20:x=10:y=10:box=1:boxcolor=black@0.7

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

Критично для архивных записей и анализа событий:

drawtext=text='%{localtime\:%T} %{localtime\:%d.%m.%Y}':fontcolor=yellow:fontsize=18:x=10:y=H-30

3. Индикация статуса

Например, при записи:

drawtext=text='REC':fontcolor=red:fontsize=36:x=W-60:y=10:box=1:boxcolor=black@0.8

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


Таблица: типичные параметры drawtext

ПараметрНазначениеПример значения
textТекст или выражение'Камера 1', '%{localtime}'
fontcolorЦвет текстаwhite, #FF0000@0.9
fontsizeРазмер шрифта в пикселях24
fontfileПуть к файлу шрифта/usr/share/fonts/...
x, yПозиция текста10, H-20, (W-tw)/2
boxВключить фон под текстом1
boxcolorЦвет фона с прозрачностьюblack@0.6
shadowx/yСмещение тени2, 2
borderwТолщина границы вокруг текста2
bordercolorЦвет границыblack

Важные замечания

  1. Требуется перекодирование видео
    Фильтр drawtext работает на уровне декодированных кадров. Это означает, что нельзя использовать -c copy, если вы накладываете текст. Видео всегда будет перекодироваться, даже если вы хотите сохранить тот же кодек. Это влияет на нагрузку CPU и задержку.
  2. Задержка и производительность
    Каждый фильтр добавляет небольшую задержку. При наложении текста она минимальна, но в сложных цепочках (множество оверлеев, масштабирование, PIP) задержка накапливается.
  3. Читаемость текста
    Всегда используйте фон (box) или тень, если текст накладывается на неоднородный фон. Это особенно важно в условиях низкой освещённости или при движении камеры.

Заключение

Фильтр drawtext — простой, но мощный инструмент для добавления информационных надписей на видеопоток. Он идеально подходит для:

  • Идентификации источников (камер, каналов);
  • Отображения времени и даты;
  • Индикации статуса (LIVE, REC);
  • Подготовки видеоматериалов для трансляции или архива.