使用FFmpeg仅在单个帧上绘制文字,绘图框或叠加

wax*_*cal 5 video ffmpeg video-processing transcoding

我使用的DrawTextdrawbox上FFmpeg的两个人类已知的最糟糕记录功能avfilters.

我正在努力研究是否以及如何在一个帧上使用它们,即第22帧上的drawtext.

当前命令:

ffmpeg -i test.wmv -y -b 800k -f flv -vcodec libx264 -vpre default -s 768x432 \
  -g 250 -vf drawtext="fontfile=/home/Cyberbit.ttf:fontsize=24:text=testical:\
  fontcolor=green:x=100:y=200" -qscale 8 -acodec libfaac -sn -vstats out.flv
Run Code Online (Sandbox Code Playgroud)

文档中提到的两个元素是nt.但是,我似乎只能在x和y中使用它们.不在文本中,甚至不在其他参数中.

我们将非常感谢您提供任何帮助或FFmpeg指导.

bla*_*lah 3

FFmpeg 总是让您保持警惕,这是一个很好的例子,这对于做起来来说是微不足道的drawtext,而且是非常痛苦的drawbox

关键是drawtext包含draw参数:

设置
一个表达式,指定是否应绘制文本。如果表达式的值为 0,则不绘制文本。这对于指定仅在满足特定条件时才绘制文本非常有用。

因此只在第 22 帧上显示文本:

ffmpeg -i in.wmv -vf drawtext="fontfile=font.ttf:text='blah':draw='eq(n,22)'" out.flv
Run Code Online (Sandbox Code Playgroud)

drawbox没有draw参数,也没有通用的方法来模拟它,所以你只能做一些事情,比如提取你想要放置盒子的视频部分,然后用偏移量覆盖它:

ffmpeg -i in.wmv -t 1 -ss 10 -vf drawbox=10:10:20:20:red boxed.flv
ffmpeg -i in.wmv -itsoffset 10 -i boxed.flv -filter_complex overlay out.flv
Run Code Online (Sandbox Code Playgroud)

(尽管这会留下永远可见的最后一帧boxed.flv)或将视频分成多个部分,绘制适当的部分,然后重新组合。

  • 如今,drawbox(和drawtext)具有视频编辑功能,允许您以通用方式执行相同的操作。http://stackoverflow.com/questions/17339841/ffmpeg-drawbox-on-a-given-frame (3认同)