目录
- 上下文
- 必须在叠加层链中引用上一个叠加层
- 问题
上下文
我正在以编程方式生成 ffmpeg 命令,因为我想在不同时间显示多行。我编写的算法会生成一个字符串,然后将其传递给标志-filter_complex
,我的算法有点复杂,因为我需要引用前一个覆盖层的名称。如果我知道如何引用前一个覆盖层而不必明确写出它的名称,那就更简单了。我想知道是否有可能做到这一点。
必须在叠加层链中引用上一个叠加层
我没有找到说明引用叠加层链中的前一个叠加层是强制性要求的文档,因此我用最少的工作示例证明了这一点,本节将展示这些示例。如果您也这么认为,请跳过本节。如果您持相反观点,请告诉我如何操作。
以下命令生成带有两条水平线的蓝色背景。
ffmpeg \
-v error \
-y \
-f lavfi \
-i color=blue:s=1920x1080:d=10 \
-filter_complex "color=white@1:1920x10 [myline1]; \
[0:v][myline1] overlay=0:360:shortest=1 [overlay1]; \
color=white@1:1920x10 [myline2]; \
[overlay1][myline2] overlay=0:720:shortest=1" \
output.avi
以下命令与第一个命令类似。不同之处在于,在第二个覆盖层中,我们不引用第一个覆盖层。该命令没有成功退出。
ffmpeg \
-v error \
-y \
-f lavfi \
-i color=blue:s=1920x1080:d=10 \
-filter_complex "color=white@1:1920x10 [myline1]; \
[0:v][myline1] overlay=0:360:shortest=1 [overlay1]; \
color=white@1:1920x10 [myline2]; \
[0:v][myline2] overlay=0:720:shortest=1" \
output.avi
echo Exit code: $?
Filter overlay:default has an unconnected output
Exit code: 1
以下命令与第一个命令类似。不同之处在于,在第二个叠加层中,我们不引用第一个叠加层,并且第一个叠加层未指定名称。该命令成功退出,但第二个叠加层似乎对生成的视频没有影响。
ffmpeg \
-v error \
-y \
-f lavfi \
-i color=blue:s=1920x1080:d=10 \
-filter_complex "color=white@1:1920x10 [myline1]; \
[0:v][myline1] overlay=0:360:shortest=1; \
color=white@1:1920x10 [myline2]; \
[0:v][myline2] overlay=0:720:shortest=1" \
output.avi
echo Exit code: $?
Exit code: 0
问题
以下命令生成带有两条水平线的蓝色背景。
ffmpeg \
-v error \
-y \
-f lavfi \
-i color=blue:s=1920x1080:d=10 \
-filter_complex "color=white@1:1920x10 [myline1]; \
[0:v][myline1] overlay=0:100:shortest=1 [overlay1]; \
color=white@1:1920x10 [myline2]; \
[overlay1][myline2] overlay=0:200:shortest=1 [overlay2]; \
color=white@1:1920x10 [myline3]; \
[overlay2][myline3] overlay=0:300:shortest=1" \
output.avi
我希望可以编写下面显示的命令,而不是编写上面显示的命令,所以我的问题是:是否有一个变量可以引用前一个覆盖?
ffmpeg \
-v error \
-y \
-f lavfi \
-i color=blue:s=1920x1080:d=10 \
-filter_complex "color=white@1:1920x10 [myline1]; \
[0:v][myline1] overlay=0:100:shortest=1 [overlay1]; \
color=white@1:1920x10 [myline2]; \
[<<REFERENCE PREVIOUS OVERLAY>>][myline2] overlay=0:200:shortest=1 [overlay2]; \
color=white@1:1920x10 [myline3]; \
[<<REFERENCE PREVIOUS OVERLAY>>][myline3] overlay=0:300:shortest=1" \
output.avi
这个问题突然出现在我的脑海中,因为我记得 ffmpeg 定义了其他变量,例如main_w
和overlay_w
,所以它很可能有一个用于引用前一个覆盖的变量。