如何使用 FFMPEG 应用 2 个过滤器 drawtext 和 drawbox

use*_*972 1 ffmpeg

我在组合过滤器时遇到问题。我正在尝试从相机拍摄视频,在其上应用计时器并在中心覆盖一个框。我可以使用 -vf drawtext 命令放置时间代码(本地时间和点),没有问题:

ffmpeg -f video4linux2 -input_format mjpeg -s 1280x720 -i /dev/video0 \
-vf "drawtext=fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: \
text='%{localtime} %{pts\:hms}':  fontcolor=white: fontsize=24: box=1: \
boxcolor=black@0.8: boxborderw=5: x=0: y=0" -vcodec libx264 \
-preset ultrafast -f mp4 -pix_fmt yuv420p -y output.mp4
Run Code Online (Sandbox Code Playgroud)

然后我有一个使用 drawbox 绘制一个小盒子:

ffmpeg -f video4linux2 -input_format mjpeg -s 1280x720 -i /dev/video0 \
-filter_complex " drawbox=x=iw/2:y=0:w=10:h=ih:color=red@0.1": \
-vcodec libx264 -preset ultrafast -f mp4 -pix_fmt yuv420p -y output.mp4
Run Code Online (Sandbox Code Playgroud)

我假设我可以将它们与 filter_complex 开关结合起来,并像这样使用分号将它们分开

ffmpeg -f video4linux2 -input_format mjpeg -s 1280x720 -i /dev/video0 -filter_complex "drawtext=fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='%{localtime} %{pts\:hms}':  fontcolor=white: fontsize=24: box=1: boxcolor=black@0.8;drawbox=x=iw/2:y=0:w=10:h=ih:color=red@0.1": -vcodec libx264 -preset ultrafast -f mp4 -pix_fmt yuv420p -y output.mp4
Run Code Online (Sandbox Code Playgroud)

但它无法在第二个过滤器上找到输入流:

输入 #0, video4linux2,v4l2, from '/dev/video0':

持续时间:N/A,开始:10651.720690,比特率:N/A

流 #0:0:视频:mjpeg、yuvj422p(pc、bt470bg/unknown/unknown)、1280x720、-5 kb/s、30 fps、30 tbr、1000k tbn、1000k tbc

在过滤器 Parsed_drawbox_1 上找不到未标记的输入板 0 的匹配流

我试图将它指向 [0] 像这样:

ffmpeg -f video4linux2 -input_format mjpeg -s 1280x720 -i /dev/video0 -filter_complex " \
drawtext=fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: \
text='%{localtime} %{pts\:hms}':  fontcolor=white: fontsize=24: box=1: \
boxcolor=black@0.8;[0] drawbox=x=iw/2:y=0:w=10:h=ih:color=red@0.1": \
-vcodec libx264 -preset ultrafast -f mp4 -pix_fmt yuv420p -y output.mp4
Run Code Online (Sandbox Code Playgroud)

但它无法将盒子放在输出上。

所以我试着像这样分割流

ffmpeg -f video4linux2 -input_format mjpeg -s 1280x720 -i /dev/video0 -filter_complex " \
split [main][tmp];\
[main] drawtext=fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: \
text='%{localtime} %{pts\:hms}':  fontcolor=white: fontsize=24: box=1: boxcolor=black@0.8 [tmp];\
[main] drawbox=x=iw/2:y=0:w=10:h=ih:color=red@0.1 [tmp2]; [tmp][tmp2] overlay": \
-vcodec libx264 -preset ultrafast -f mp4 -pix_fmt yuv420p -y output.mp4
Run Code Online (Sandbox Code Playgroud)

但是我的构建没有符合它的覆盖过滤器。在这一点上,我决定停下来问问我是否让这件事变得比应该的更难。最终结果是我只想要一个计时器和一个在视频上绘制的框。有没有更好的方法或格式化技巧来做到这一点?

谢谢

Gya*_*yan 6

您可以一个接一个地应用它们,用逗号分隔。

ffmpeg -f video4linux2 -input_format mjpeg -s 1280x720 -i /dev/video0 -filter_complex " \
drawtext=fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: \
text='%{localtime} %{pts\:hms}':  fontcolor=white: fontsize=24: box=1: \
boxcolor=black@0.8, drawbox=x=iw/2:y=0:w=10:h=ih:color=red@0.1": \
-vcodec libx264 -preset ultrafast -f mp4 -pix_fmt yuv420p -y output.mp4
Run Code Online (Sandbox Code Playgroud)

  • 它说,“*同一线性链中的过滤器用逗号分隔,不同的线性过滤器链用分号分隔。*”。drawtext 和 drawbox 不在不同的链中。 (5认同)