FFmpeg drawtext и текущие координаты с sendcmd / zmq - PullRequest
0 голосов
/ 09 мая 2019

Я хотел бы использовать маркер на источнике живого видео, который имеет внешние данные в реальном времени, чтобы установить координаты x, y. sendcmd может читать текстовый файл, но не обновляет его, поэтому последующие обновления не выполняются. Это возможно только с zmq? И если да, могу ли я использовать zmq в качестве отдельного фильтра (с drawtext), а не с комплексом фильтров?

У меня есть питон, который экспортирует действующие координаты в соответствующем формате в файл cmd.txt. Я использую время Unix для координат, а также копирую временные метки ввода с устройства обратной петли, чтобы они имели практически одинаковое время. Есть небольшая задержка, поэтому я компенсировал экспортированные временные метки с + 1,5 с. Это означает, что маркер перемещается в течение этого дополнительного периода (хотя временные метки в cmd.txt немного опережают живой источник), но он больше не будет обновляться. Я предполагаю, что FFmpeg читает этот cmd.txt и больше не будет его обновлять, но мой питон пишет его постоянно.

Пример строки cmd.txt:

1557402120.3119707 drawtext reinit 'x=752:y=480';

Это фактическая труба ffmpeg:

ffmpeg -fflags nobuffer -vaapi_device /dev/dri/renderD128 -f v4l2 -i /dev/video0 -vf "sendcmd=f=cmd.txt,drawtext=fontfile=font.ttf:fontsize=30:fontcolor=white:r=25:text='o',format=nv12,hwupload" -copyts -c:v h264_vaapi -qp 24 -y 0.mp4

Источник представляет собой устройство обратной связи с временем unix в качестве метки времени ввода.

1 Ответ

1 голос
/ 09 мая 2019

Вы можете использовать zmq вместо sendcmd в простой цепочке фильтров.

Есть еще один способ, в настоящее время недокументированный. Отправить нажатия клавиш

Cdrawtext 1557402120.3119707 reinit 'x=752:y=480'<enter>

к стандартному ffmpeg.

Начальные c или C предназначены для команды, за которой сразу же (без пробелов) следует класс / экземпляр фильтра. Вы можете использовать all, чтобы отправить команду всем фильтрам, которые могут ее получить. Вы можете отправить \n на сигнал <enter>

...