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

Фильтр 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/... |
| Windows | C:\\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 |
Важные замечания
- Требуется перекодирование видео
Фильтрdrawtextработает на уровне декодированных кадров. Это означает, что нельзя использовать-c copy, если вы накладываете текст. Видео всегда будет перекодироваться, даже если вы хотите сохранить тот же кодек. Это влияет на нагрузку CPU и задержку. - Задержка и производительность
Каждый фильтр добавляет небольшую задержку. При наложении текста она минимальна, но в сложных цепочках (множество оверлеев, масштабирование, PIP) задержка накапливается. - Читаемость текста
Всегда используйте фон (box) или тень, если текст накладывается на неоднородный фон. Это особенно важно в условиях низкой освещённости или при движении камеры.
Заключение
Фильтр drawtext — простой, но мощный инструмент для добавления информационных надписей на видеопоток. Он идеально подходит для:
- Идентификации источников (камер, каналов);
- Отображения времени и даты;
- Индикации статуса (LIVE, REC);
- Подготовки видеоматериалов для трансляции или архива.