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

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

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 в реальном времени, но может отображать эти данные, если они поставляются извне.

Схема работы:

  1. Внешний скрипт анализирует поток (например, через ffprobe).
  2. Скрипт вычисляет текущий битрейт, FPS, задержку.
  3. Результат записывается в текстовый файл.
  4. 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 в этом смысле выступает как универсальный «дисплей» для метаданных, встроенный прямо в видеопоток.