FFmpeg - 覆盖过滤器。是否可以将 eof_action 设置为“通过”最长的文件?

FFmpeg - 覆盖过滤器。是否可以将 eof_action 设置为“通过”最长的文件?

我正在尝试使用 FFmpeg 覆盖过滤器并排覆盖 2 个文件。

这些文件包含不同的持续时间。我尝试了 FFmpeg 文档中的各种 eof_actions 和其他设置,但找不到实现所需交互的方法。

我希望文件在黑色画布上并排播放,并且当最短的文件结束时 - 该区域继续显示“黑色”。

如果我将较长的文件设置为覆盖过滤器的“主”文件并且将 eof_action 设置为“通过”,我就可以获得正确的结果...但是,我想在多个文件对上重复此命令,但不知道哪个文件是“最长的”。

有没有办法告诉 ffmpeg 将 eof_action 设置为“传递”两个文件中最长的一个?

这是我当前的过滤图:

-filter_complex "[0:v]setpts=PTS-STARTPTS[t1];[1:v]setpts=PTS-STARTPTS[t2]:[t2]pad=1000:500:0:0[p];[p][t1]overlay=x=500:y=0:eof_action=pass[out]" ......

... 如果 [0:v] 的持续时间比 [1:v] 长,则上述命令将完全按照我的要求工作。 是否有办法通过将“eof_action”设置为“通过”最长的文件而不是“主”文件来实现所有情况下的相同交互?

答案1

使用:

-filter_complex "[0:v]setpts=PTS-STARTPTS[t1];[1:v]setpts=PTS-STARTPTS[t2];[t1][t2]hstack[out]"

上面的命令不会以最短的输入终止,但它会冻结较短输入的最后一帧,因此您可能需要在每个输入的末尾附加一个黑帧,然后从结果中修剪出最后一帧。

相关内容