如何组合这两个 ffmpeg 命令以便不生成中间文件?

如何组合这两个 ffmpeg 命令以便不生成中间文件?

我需要用这个命令连接两个文件。

ffmpeg -ss 00:04 -to 1:15:28 -i 1_out.mp4 -ss 0:42 -to 10:28 -i 2.mp4 -lavfi concat=n=2:a=1 result.mp4

但是,我需要1.mp4在连接之前进行缩放才能获得1_out.mp4

ffmpeg -to 2:00 -i 1.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:-1:-1:color=black" 1_out.mp4

如您所见,1_out.mp4中间文件中有两个命令和。如何组合这两个命令,以免生成中间文件?

答案1

-filter_complex是你的朋友

ffmpeg -ss 00:04 -to 1:15:28 -i 1_out.mp4 \
       -ss 0:42 -to 10:28 -i 2.mp4 \
       -filter_complex \
           "[0:v:0]scale=1920:1080:\
                force_original_aspect_ratio=decrease,\
            pad=1920:1080:-1:-1:color=black[vscaled],\
            [vscaled][0:a:0][1:v:0][1:a:0]\
                concat=n=2:v=1:a=1[outv][outa]" \ 
       -map [outv] -map [outa] result.mp4

我还没有测试过完整的命令,但这个想法是这样的。[0:v:0]是第一个文件的第一个视频流(请记住,ffmpeg 中的所有编号都从 0 开始),它是 scale 和 pad 过滤器的输入(并且只有它),结果被命名[vscaled](您的选择)。然后与(第二个文件的第一个视频流)和音频流[vscaled]一起用作 concat 过滤器的输入。结果被命名为(再次由您选择)连接的视频流和连接的音频流。最后和被映射到输出文件。[1:v:0][outv][outa][outv][outa]

否则,您可以研究使用管道(第一个 ffmpeg 将输出写入标准输出,通过管道传输到第二个 ffmpeg,后者从标准输入读取其中一个文件。仍然是两个单独的命令,但没有中间文件)。

相关内容