我使用 ffmpeg xstack 进行分屏 - 经过几次迭代后,它们变得非常大,所以我想在此过程中缩小它们。但我收到错误“过滤器比例有一个未连接的输出”。这是我的代码(从 Python 调用,但对于过滤器来说应该没有区别):
subprocess.call(['ffmpeg', '-i', input_clips[j + 0], '-i', input_clips[j + 1], '-i', input_clips[j + 2], '-i', input_clips[j + 3], '-filter_complex', '[0:v]scale=3840:1920[v0];[1:v]scale=3840:1920[v1];[2:v]scale=3840:1920[v2];[3:v]scale=3840:1920[v3];[0:v][1:v][2:v][3:v]xstack=inputs=4:layout=0_0|0_h0|w0_0|w0_h0[v]', '-map', '[v]', '-c:v', 'libx265', '-crf', '12', '-preset', 'ultrafast', '-an', output])
我知道问题出在输入和输出语法上,但是我只是找不到任何可以理解的解释(它太短了,无法谷歌搜索):例如 [0:v] [v0] 和 [v] 到底是什么意思?
答案1
将缩放后的视频提供给 xstack。您的命令是将原始的未缩放视频提供给 xstack。
使用:
subprocess.call(['ffmpeg', '-i', input_clips[j + 0], '-i', input_clips[j + 1], '-i', input_clips[j + 2], '-i', input_clips[j + 3], '-filter_complex', '[0:v]scale=3840:1920[v0];[1:v]scale=3840:1920[v1];[2:v]scale=3840:1920[v2];[3:v]scale=3840:1920[v3];[v0][v1][v2][v3]xstack=inputs=4:layout=0_0|0_h0|w0_0|w0_h0[v]', '-map', '[v]', '-c:v', 'libx265', '-crf', '12', '-preset', 'ultrafast', '-an', output])
您之所以会收到错误,Filter scale has an unconnected output
是因为所有过滤器输出都必须被使用:通常要么由其他过滤器使用,要么将其定向到输出文件中。但您的命令只是孤立了比例过滤器的输出。
例如 [0:v] [v0] 和 [v] 到底是什么意思?
[0:v]
0
是输入 #0。是来自输入 #0 的所有视频。因此,它指的是来自命令中v
命名的第一个输入的视频。input_clips[j + 0]
[v0]
是某个比例过滤器输出的任意名称。您可以根据自己的喜好随意命名[superamazingscaledvideo]
。[v]
是另一个任意名称,指的是 xstack 的最终输出,然后在-map
选项中使用该名称来选择 xstack 的输出并将其放入输出文件中。同样,您可以使用任何您想要的名称。在这种情况下,[v]
可以-map [v]
选择省略,因为默认情况下,输出-filter_complex
将包含在输出文件中,但具体一点也不错。
看FFmpeg 过滤介绍了解更多信息。