FFMPEG:使用复杂滤镜的视频过滤器

12

我正在使用fluent-ffmpeg Node.js库对视频文件进行批量处理。视频过滤器可以裁剪16:9的输入,添加填充并将字幕烧入到填充中。

在下一步中,我想使用复杂的过滤器将图像作为水印叠加在视频上。

ff.input(video.mp4)
ff.input(watermark.png)
ff.videoFilter([
  'crop=in_w-2*150:in_h',
  'pad=980:980:x=0:y=0:color=black',
  'subtitles=subtitles.ass'
])
ff.complexFilter([
  'overlay=0:0'
])
ff.output(output.mp4)

然而,运行此代码时,会出现以下错误:

Filtergraph 'crop=in_w-2*150:in_h,pad=980:980:x=0:y=0:color=black,subtitles=subtitles.ass' was specified through the -vf/-af/-filter option for output stream 0:0, which is fed from a comple.
-vf/-af/-filter and -filter_complex cannot be used together for the same stream.

据我所了解,视频过滤器和复杂过滤器选项不能同时使用。如何解决这个问题?


你必须将叠加滤镜放在一个过滤器中。在ffmpeg中不能在同一命令中使用2个过滤器图。尝试学习复杂的过滤器图并相应地匹配你的流到叠加滤镜。 - Legolas
您可以在同一命令中使用多个复杂的过滤器图。但是,您不能在其他图中引用在一个图中创建的中间或输出流。 - Gyan
2个回答

45

通过学习一些有关过滤器图的基础知识,我解决了这个问题。这是完整的 ffmpeg 命令。当过滤器字符串逐行书写时,我发现它们更易于阅读。

ffmpeg \
-i video.mp4 \
-i watermark.png \
-filter_complex " \
  [0]crop = \
    w = in_w-2*150 : \
    h = in_h \
    [a] ;
  [a]pad = \
    width = 980 : \
    height = 980 : \
    x = 0 :
    y = 0 :
    color = black
    [b] ;
  [b]subtitles = 
    filename = subtitles.ass
    [c] ;
  [c][1]overlay = \
    x = 0 :
    y = 0
  " \
output.mp4

解释:

[0]crop=...[a]; => 从视频输入 0 开始应用裁剪过滤器。将结果命名为 a

[a]pad=...[b]; => 对流 a 应用填充过滤器。将结果命名为 b

[b]subtitles=...[c] => 对流 b 应用字幕过滤器。将结果命名为 c

[c][1]overlay... => 使用输入 1 (PNG文件) 将叠加过滤器应用于流 c

希望这能帮助那些在筛选图表方面遇到困难的人们。


3
具有单个输入/输出的滤镜可以用逗号连接,这样可以简化命令,因为您可以省略不必要的标签,例如 [0]crop,pad[bg];[bg][1]overlay,subtitles[0]crop,pad,subtitles[bg];[bg][1]overlay - llogan
1
你的问题涉及到 fluent-ffmpeg 语法。而这个答案则与 ffmpeg CLI 语法有关。 - Gyan
是的,但过滤器图形是问题所在。 - Sebastien
你有安装 fluent-ffmpeg 的版本吗? - lowcrawler

7

使用3个标志和1个文本滚动的简单语法

ffmpeg
    .complexFilter([

        {
            filter: 'overlay',
            options: { x: 100, y: 100 },
            inputs: 0, outputs: '1'

        },
        {
            filter: 'overlay',
            options: { x: 200, y: 200 },
            inputs: '1', outputs: '2'

        },
        {
            filter: 'overlay',
            options: { x: 300, y: 300 },
            inputs: '2', outputs: '3'

        },
        {
            filter: 'drawtext',
            options: {
            // outputs: 1,
            fontfile:'/usr/share/fonts/dejavu/DejaVuSans.ttf',
            text: 'some text',
            fontsize: 40,
            fontcolor: 'white',
            x: 'w-w/10*mod(t,10*(w+tw)/w)',
            y: 'h-line_h',
            shadowcolor: 'black',
            shadowx: 3,
            shadowy: 3,
            },
            inputs: '3',
          },
        ])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接