ffmpeg filter_complex 连接输出

ffmpeg filter_complex 连接输出

我使用 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 过滤介绍了解更多信息。

相关内容