我需要用这个命令连接两个文件。
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,后者从标准输入读取其中一个文件。仍然是两个单独的命令,但没有中间文件)。