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

时间:2011-11-02 11:28:53

标签: video ffmpeg video-processing transcoding

我在FFmpeg上使用 drawtext drawbox 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

提到的两个元素in the documentation n t 。但是,我似乎只能在x和y中使用它们。不在文本中,甚至不在其他参数中。

非常感谢任何帮助或FFmpeg指导。

1 个答案:

答案 0 :(得分: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

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

(虽然这会使boxed.flv的最后一帧永远可见)或将视频分成多个部分,绘制正确的部分,然后重新组合。