Gstreamer OSD

Материал из virt2real wiki
Перейти к: навигация, поиск

Содержание

Введение

OSD - "on-screen display". Общепринятое название для различных графических и текстовых информационных блоков, размещённых поверх видео.

В нашем случае, возможны три варианта OSD:

  • текст и графика, накладываемый поверх видеопотока на борту (т.е. на Виртурилке)
  • текст и графика, накладываемые поверх видеопотока на принимающей стороне (на ПК/планшете/смартфоне)
  • текст и графика, наклыдываемые поверх видео с аналогового видеовыхода

Первые два варианта применимы для разных типов трансляции по сети и реализуются средствами GStreamer. Последний вариант - только для аналогового видеовыхода, реализуется средствами стандартного фреймбуфера Linux, его описание не входит в рамки данной статьи и будет изложен отдельно (Использование композитного видеовыхода и OSD).


Pango

Существует несколько систем оверлеев, но для Virt2real наиболее оптимален пакет Pango http://www.pango.org

Ещё существует emboverlay https://developer.ridgerun.com/wiki/index.php/Fast_GStreamer_overlay_element, который оптимизирован для процессоров DM36x, но этот пакет доступен только в платной SDK компании RidgeRun.

Pango позволяет накладывать только текст поверх видео. Для наложения изображений есть пакет Cairo, но его использование существенно ухудшает задержку кодирования видео, так что можно считать его непригодным для использования.


В дефолтной прошивке pango уже имеется, список доступных элементов можно посмотреть командой

#gst-inspect | grep pango
pango:  textoverlay: Text overlay
pango:  timeoverlay: Time overlay
pango:  clockoverlay: Clock overlay
pango:  textrender: Text renderer


Элемент textoverlay

Добавляет текст поверх видео.

Посмотреть список всех доступных параметров можно командой

gst-inspect textoverlay

Достаточно добавить в цепочку элемент "textoverlay" с параметром "text". Дополнительные параметры необязательны и служат для различной настройки отображения.

Нижеприведённый пример добавит текст "virt2real" на затенённом фоне внизу по центру кадра. Шрифт Arial, 12px.

gst-launch v4l2src always-copy=false chain-ipipe=true ! \
  capsfilter caps=video/x-raw-yuv,format='(fourcc)'NV12,width=640,height=480,framerate='(fraction)'30 ! \
  dmaiaccel ! \
  queue ! \
  textoverlay text="virt2real" shadow=false auto-resize=false shaded-background=1 font-desc="Arial 12px" ! \
  dmaienc_h264 ddrbuf=true encodingpreset=2 ratecontrol=2 intraframeinterval=5 idrinterval=50 targetbitrate=600000 ! \
  rtph264pay ! \
  udpsink port=3000 host=192.168.1.10 enable-last-buffer=false sync=false


Результат



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


Элемент timeoverlay

Добавляет текст с таймером длительности видеотрансляции поверх видео. Параметры аналогичны элементу "textoverlay".

Данный элемент очень ресурсоёмок, т.к. пытается обновлять текст каждую миллисекунды, что слишком занимает процессор (данная операция не использует DSP). К практическому применению непригодно.


Элемент clockoverlay

Накладывает текущее время на видео. Информация обновляется раз в секунду, на быстродействии не сказывается.


gst-launch v4l2src always-copy=false chain-ipipe=true ! \
  capsfilter caps=video/x-raw-yuv,format='(fourcc)'NV12,width=640,height=480,framerate='(fraction)'30 ! \
  dmaiaccel ! \
  queue ! \
  clockoverlay shadow=false auto-resize=false shaded-background=1 font-desc="Arial 12px" ! \
  dmaienc_h264 ddrbuf=true encodingpreset=2 ratecontrol=2 intraframeinterval=5 idrinterval=50 targetbitrate=600000 ! \
  rtph264pay ! \
  udpsink port=3000 host=192.168.1.10 enable-last-buffer=false sync=false


Результат



Оптимизация запуска

Рекомендуется запускать GStreamer с максимальным приоритетом процесса. Для этого необходимо gst-launch запускать не напрямую, а через nice

nice -n -20 gst-launch  <остальная цепочка>


Динамическое изменение текста

Допустим, мы хотим передавать в видеокартинке текущие координаты с GPS.

Для этого воспользуемся сервером gstd (про его использование написано в статье Управление цепочками GStreamer)

На практике, для реализации OSD для конечного использования лучше написать свою программу-обёртку для GStreamer, для тонкой настройки. Это будет более экономично к ресурсам. Но для тестирования и отладки вполне можно использовать и gstd.


Итак, сначала понадобится создать цепочку с пустым элементом "textoverlay"

gst-client create "v4l2src always-copy=false chain-ipipe=true ! \
  capsfilter caps=video/x-raw-yuv,format=(fourcc)NV12,width=640,height=480,framerate=(fraction)30/1 ! \
  dmaiaccel ! \
  queue ! \
  textoverlay ! \
  dmaienc_h264 ddrbuf=true encodingpreset=2 ratecontrol=2 intraframeinterval=5 idrinterval=50 targetbitrate=600000 ! \
  rtph264pay ! \
  udpsink port=3000 host=192.168.1.10 enable-last-buffer=false sync=false"


Затем устанавливаем параметры и в цикле меняем текст

# прозрачный серый фон
gst-client -p 0 set textoverlay0 shaded-background integer 1

# отключаем тень
gst-client -p 0 set textoverlay0 shadow boolean false

# отключаем авто ресайз
gst-client -p 0 set textoverlay0 auto-resize boolean false

# отключаем перенос текста
gst-client -p 0 set textoverlay0 wrap-mode integer 0

# Задаём шрифт
gst-client -p 0 set textoverlay0 font-desc string "Arial 12px"

# Устанавливаем начальный текст 
gst-client -p 0 set textoverlay0 text string "virt2real" 

# Запускаем трансляцию
gst-client -p 0 play

# Теперь в цикле, раз в секунду обновляем текст
# Для примера, текстом будет случайное число

while [ 1 ] ; do
  let koord=$RANDOM
  gst-client -p 0 set textoverlay0 text string "$koord" > /dev/null
  sleep 1
done


Нагрузка на процессор сильно различается при разных размерах шрифта. При шрифте размером 12px лаги незаметны.