Estou usando ffmpeg
combinado com tee
e mplayer
para ter uma transmissão ao vivo de vídeo simples e um gravador sobre SSH. Agora, eu adoraria incorporar a hora atual (do servidor) no fluxo. O formato não importa muito, o ideal seria YYYY-MM-DD HH:MM:SS
.
Eu encontrei este tutorial sugerindo o seguinte comando:
ffmpeg -f video4linux2 -input_format mjpeg -s 1280x720 -i /dev/video0 \
-vf "drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf: \
text='%{localtime\:%T}': [email protected]: x=7: y=700" -vcodec libx264 \
-preset veryfast -f mp4 -pix_fmt yuv420p -y output.mp4
Mas usar a -vf
parte disso resulta no seguinte erro para mim:
[NULL @ 0x55e4ef96b2a0] Unable to find a suitable output format for 'text=%{localtime:%T}:'
text=%{localtime:%T}:: Invalid argument
Eu também tentei este comando (o terceiro bloco de código no Q), apenas para testá-lo, mas também falhou:
[Parsed_drawtext_0 @ 0x55fb2862a940] Both text and text file provided. Please provide only one
[AVFilterGraph @ 0x55fb28629fc0] Error initializing filter 'drawtext' with args 'text=%{pts:hms:1553359336.166336638}'
Por fim, também encontrei esta pergunta e tentei, ligeiramente modificada assim (isso está mostrando meu comando completo, apenas ajustei as -vf
opções nos dois exemplos anteriores):
ffmpeg -r 20 -s 640x480 -f video4linux2 -i /dev/video0 -vf "drawtext=fontsize=90:fontcolor=white: fontfile=/usr/share/fonts/TTF/DejaVuSans.ttf: text='%{localtime\:%X}'" -f avi -
Isso me apresenta o seguinte erro:
[NULL @ 0x55ae61d051a0] Unable to find a suitable output format for 'fontfile=/usr/share/fonts/TTF/DejaVuSans.ttf:'
fontfile=/usr/share/fonts/TTF/DejaVuSans.ttf:: Invalid argument
Modificando um pouco o que encontrei aqui para:
-vf drawtext="fontfile='/usr/share/fonts/cantarell/Cantarell-Light.otf':fontsize=14:fontcolor=white:shadowcolor=black:shadowx=2:shadowy=1:text='%H-%M-%S':x=8:y=8"
Me presenteia com:
[Parsed_drawtext_0 @ 0x55e36db2aa40] Stray % near 'H-%M-%S'
Observe que usar este comentário apenas com texto (por exemplo text='test'
, ) funciona bem.
Adicionar 1-4 \
s na frente dos %
s não mostra nenhuma alteração no erro ou efeito.
Minha ffmpeg
versão: ffmpeg version 3.2.12-1~deb9u1
em uma máquina debian.
Foi compilado com a biblioteca drawtext e está presente em ffmpeg -filters
.
Ok, encontrei a solução na documentação do filtro FFmpeg .
Embora diga
This feature is deprecated.
, isso funciona muito bem para mim. Aqui está o meu final-vf
:Por favor, note que, de qualquer forma, os quatro
\\\\
são necessários para escapar:
. Para escapar do espaço, um único\
é suficiente. O resultado ficará assim:A primeira opção,
text='%{localtime\\:T}'
funciona bem. O OP tinha suas citações no lugar errado, ele tinha'text=...'
. Você notará que nos exemplos subsequentes, ele tem as aspas simples no lugar certo.