我正在尝试学习如何使用 ffmpeg,并在 http://trac.ffmpeg.org/wiki/FancyFilteringExamples 上看到了这个过滤示例。具体来说,是这个:
ffplay -f lavfi -i mandelbrot -vf "format=yuv444p,split=4\[a\]\[b\]\[c\]\[d\],\[a\]waveform\[aa\],\[b\]\[aa\]vstack\[V\],\[c\]waveform=m=0\[cc\],\[d\]vectorscope=color4\[dd\],\[cc\]\[dd\]vstack\[V2\],\[V\]\[V2\]hstack"
这将生成一个曼德布洛特分形,两侧各有两个波形,右下角有一个矢量示波器。我想将这个概念应用到我拥有的视频中,但只有矢量示波器而没有波形。我已经想出了如何将矢量示波器生成为其自己的文件,但我如何指定它的 lxw(像素),然后使用拆分语法将其添加到视频底部?
到目前为止,我已经使用过
ffmpeg -i original.mp4 -vf vectorscope=color4 -f mp4 vectorscope.mp4
生成原始的 256x256 矢量示波器。
我理解 split 语法的方式是它与 -vf 选项结合使用,类似于:
ffmpeg -i original.mp4 -vf "format=h264, split=2[a][b],[a]vectorscope=color4 ... " -f mp4 output.mp4
但我不太确定此后的语法是什么。
抱歉,如果这个问题看起来有点愚蠢,我正在学习!
答案1
在下面的例子中,我们取第一个输入[0]
并将其拆分为两个实例[S1]
和[S2]
。如果实例数大于 2(即split=3
),我们只需说明实例数。我们将矢量示波器应用于一个实例[S1]
,并将矢量示波器输出为
[VS]
。此输出现在叠加到第二个实例上[S2]
。在此示例中,我们在左上角叠加了(overlay=0:0
),可以进行调整以适应。
ffmpeg -y -i 1.mkv -vf ^
[0]split[S1][S2];^
[S1]vectorscope=color4[VS];^
[S2][VS]overlay=0:0 out.mp4
如果我们想在叠加之前调整矢量示波器输出的大小,我们只需[VS]
在叠加滤镜之前缩放其输出即可。现在我们必须叠加来自缩放滤镜的输出[VSS]
。
ffmpeg -y -i 1.mkv -vf ^
[0]split[S1][S2];^
[S1]vectorscope=color4[VS];^
[VS]scale=400:400[VSS];^
[S2][VSS]overlay=0:0 out.mp4
更进一步,我们可以在重新缩放之前裁剪矢量示波器的输出。在这里,我们通过将输入乘以 (裁剪过滤器的输出) 宽度 (iw) 和高度 (ih) 各减少 2 (*2)。如果裁剪不对称,此方法很有用。
ffmpeg -y -i 1.mkv -vf ^
[0]split[S1][S2];^
[S1]vectorscope=color4[VS];^
[VS]crop=100:100[CVS];^
[CVS]scale=2*iw:2*ih[VSS];^
[S2][VSS]overlay=0:0 out.mp4
注意:您可以说明裁剪尺寸和位置(50:25
) 如下:
crop=100:100:50:25
如果您下载了便携版 Avidemux,您可以先生成矢量示波器,然后在 Avidemux 中打开并使用裁剪滤镜确定 ffmpeg 的值。有一个自动裁剪选项,但这仅应用作起点。在记录值之前使用预览。
Avidemux 过滤器的值对应如下:
作物=宽度:高度:左:上(宽度和高度取自“尺寸”)。左侧和顶部代表 x 和 y 位置。