06-05-03 Информационные панели и динамические данные

В предыдущих разделах мы рассмотрели базовые приёмы наложения текста и графики с помощью FFMPEG — например, статичные титры с названием камеры или водяные знаки. Однако в реальных системах часто требуется не просто фиксированная подпись, а динамическая, обновляемая информация, отражающая состояние системы в режиме реального времени. В этом слайде мы углубимся в более сложные, «интеллектуальные» сценарии использования оверлеев, которые превращают FFMPEG из простого видеоредактора в часть автоматизированной медиасистемы.
Динамические оверлеи: зачем они нужны?
В профессиональных видеосистемах — от телестудий до систем видеонаблюдения — важно не только транслировать изображение, но и передавать контекст. В некоторых ситуациях пользователь должен понимать, что он видит, в каком состоянии находится система, и какие метаданные сопровождают видео. FFMPEG позволяет встраивать такую информацию прямо в видеопоток, делая её доступной даже на «глупых» плеерах, не поддерживающих дополнительные данные.
Примеры таких задач:
- Отображение текущего времени и даты на записи видеонаблюдения.
- Вывод номера камеры, её местоположения или статуса («LIVE», «OFFLINE»).
- Показ технических параметров: битрейт, FPS, задержка.
- Интеграция с внешними системами: счёт в спортивном матче, телеметрия автомобиля, данные датчиков.
Ключевое преимущество — вся информация «вшита» в видео и не требует дополнительных каналов передачи.
::: info Решение описанных задач здесь показано "по-инженерному" -- через фильтры в FFMPEG. В телевизионном производстве для этого используются специальные системы титрования и логотипирования (из открытых решений -- CasparCG) или возможности, встроенные в программные микшера (в VMix такая возможность встроена, в OBS это делается через плагины).
:::
Обновляемый текст через внешние файлы
Один из самых гибких способов динамического обновления текста — чтение данных из файла с помощью фильтра drawtext и опции textfile. Это позволяет обновлять содержимое оверлея без перезапуска FFMPEG, что критически важно для 24/7 систем.
Как это работает?
FFMPEG периодически (по умолчанию — каждый кадр) проверяет содержимое указанного текстового файла и отображает его содержимое как текст на изображении.
Пример команды:
ffmpeg -i rtsp://camera1.local/stream \
-vf "drawtext=textfile=status.txt:fontcolor=yellow:fontsize=20:x=10:y=50" \
-c:v libx264 -f flv rtmp://server/live/cam1
Здесь:
textfile=status.txt— путь к файлу, из которого читается текст.- FFMPEG будет обновлять текст каждый кадр, подтягивая актуальное содержимое из файла.
Практический сценарий: статус камеры
Допустим, у нас есть IP-камера, и мы хотим отображать её статус: «ONLINE», «RECORDING», «LOW LIGHT» и т.д. Мы создаём скрипт (например, на Python или Bash), который анализирует состояние камеры и записывает соответствующий текст в status.txt.
# Скрипт (упрощённо)
if ping -c1 camera.local; then
echo "ONLINE" > status.txt
else
echo "OFFLINE" > status.txt
fi
FFMPEG автоматически подхватит изменения — без перезапуска, без перерыва в трансляции.
💡 Важно: FFMPEG читает файл очень часто (на каждый кадр). Если файл временно недоступен (например, перезаписывается), могут возникнуть ошибки. Рекомендуется использовать атомарную запись (например, запись во временный файл и переименование) или задержку обновления.
Вывод технических метрик: битрейт, FPS
FFMPEG сам по себе не измеряет битрейт или FPS в реальном времени, но может отображать эти данные, если они поставляются извне.
Схема работы:
- Внешний скрипт анализирует поток (например, через
ffprobe). - Скрипт вычисляет текущий битрейт, FPS, задержку.
- Результат записывается в текстовый файл.
- FFMPEG читает этот файл через
drawtext.
Пример содержимого файла metrics.txt:
Bitrate: 4.2 Mbps | FPS: 25.1 | Delay: 120 ms
Фильтр:
drawtext=textfile=metrics.txt:fontcolor=white:fontsize=18:x=10:y=100:box=1:boxcolor=black@0.7
Такой подход позволяет визуализировать качество видеопотока в реальном времени — например, на мониторе оператора или в трансляции для технического контроля.
Интеграция с внешними системами
FFMPEG может стать «мостом» между видео и внешними данными — от спортивных трансляций до промышленных систем мониторинга.
Пример 1: Счёт в матче
Представим трансляцию футбольного матча. Счёт обновляется в системе судейства. Мы настраиваем скрипт, который:
- Получает счёт через API.
- Формирует строку:
Team A 2 : 1 Team B. - Записывает её в
score.txt.
FFMPEG отображает эту строку в углу экрана — и зритель видит актуальный счёт, даже если смотрит через обычный RTMP-плеер.
Пример 2: Номер камеры по ONVIF
В системах видеонаблюдения камеры часто идентифицируются по ONVIF-профилю. Мы можем:
- Использовать ONVIF-клиент (например,
onvif-cli) для получения имени камеры. - Записать его в файл.
- Отобразить через
drawtext.
Таким образом, даже если в RTSP-URL нет имени камеры, оно будет визуально доступно на изображении.
Пример 3: Телеметрия с дронов или автомобилей
При трансляции видео с дрона можно наложить:
- Высоту полёта
- Скорость
- Координаты GPS
- Уровень заряда батареи
Эти данные приходят по последовательному порту, MQTT или другому протоколу, обрабатываются скриптом и выводятся на экран через FFMPEG.
Создание информационных панелей
Иногда одного текстового блока недостаточно — нужно структурированное отображение нескольких параметров. FFMPEG позволяет строить простые информационные панели, комбинируя несколько drawtext и графические элементы.
Пример: панель статуса камеры
Мы хотим отобразить:
- Имя камеры
- Время
- Статус (ONLINE/OFFLINE)
- Текущий битрейт
Решение:
Используем drawtext несколько раз с разными координатами:
-vf "
drawtext=text='Камера: %{{filename}}':fontcolor=white:fontsize=20:x=10:y=10,
drawtext=text='%{localtime\:%d.%m.%Y %T}':fontcolor=cyan:fontsize=18:x=10:y=40,
drawtext=textfile=status.txt:fontcolor=yellow:fontsize=18:x=10:y=70,
drawtext=textfile=bitrate.txt:fontcolor=lime:fontsize=18:x=10:y=100
"
Здесь
%{filename}— условное обозначение; на практике имя можно подставить через переменную окружения или внешний файл.
Добавление рамок и фона
Чтобы панель выглядела аккуратнее, можно:
- Использовать
box=1иboxcolorдля фона под текстом. - Наложить PNG-изображение с рамкой через
overlay. - Использовать
colorиpadфильтры для создания фона.
Пример с фоном:
drawtext=text='INFO PANEL':fontcolor=white:fontsize=24:x=0:y=0:box=1:boxcolor=black@0.8
Прозрачность (@0.8) делает фон полупрозрачным, не закрывая изображение.
Автоматизация и интеграция
Ключевой вывод: FFMPEG — не просто утилита, а компонент системы. Его можно встроить в автоматизированный процесс, где:
- Данные поступают из API, датчиков, баз данных.
- Скрипты обрабатывают и формируют текстовые файлы.
- FFMPEG отображает информацию в реальном времени.
Преимущества такого подхода:
- Гибкость: можно отображать любые данные.
- Надёжность: не требует сложных плееров или дополнительных протоколов.
- Совместимость: работает с любым RTMP, HLS, SRT-приёмником.
Ограничения:
- FFMPEG не умеет сам запрашивать API — нужен внешний скрипт.
- Частое обновление файлов может создавать нагрузку на диск (можно смягчить через кэширование или память
/dev/shm). - Нет встроенной поддержки шаблонов — форматирование текста нужно делать в скрипте.
Итоги
FFMPEG способен на гораздо больше, чем просто наложение статичного текста. С помощью простых механизмов — таких как textfile и внешние скрипты — он превращается в инструмент для динамического отображения информации в видеопотоке.
| Возможность | Как реализуется | Пример использования |
|---|---|---|
| Обновление текста без перезапуска | drawtext=textfile=... | Статус камеры, счёт матча |
| Отображение времени | %{localtime} в drawtext | Видеонаблюдение, трансляции |
| Показ технических метрик | Скрипт + ffprobe → файл → drawtext | Контроль качества потока |
| Интеграция с API/датчиками | Внешний скрипт → текстовый файл | Телеметрия, ONVIF, MQTT |
| Многострочные панели | Несколько drawtext с разными координатами | Информационная панель оператора |
Такие решения особенно ценны в автоматизированных системах, где важно, чтобы информация была доступна «в кадре» — без необходимости подключения к дополнительным интерфейсам. FFMPEG в этом смысле выступает как универсальный «дисплей» для метаданных, встроенный прямо в видеопоток.