ffmpeg
-i 1.avi -i 2.avi -i 3.avi -i 4.avi
-filter_complex "
nullsrc=size=640x480 [base];
[0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];
[1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
[base][upperleft] overlay=shortest=1 [tmp1];
[tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
[tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
[tmp3][lowerright] overlay=shortest=1:x=320:y=240
"
-c:v libx264 output.mkv
问题是它总是从第一部电影。例如,我怎样才能让音频来自第二部电影?
添加频道图似乎-filter_complex
是可行的方法,但我不知道如何引用电影中的曲目。
我尝试了以下变化:
channelmap=map=0.0.0=1.0.0|0.0.1=1.0.1
但它会出现语法错误。
答案1
您可以使用-map
选项否则,您将只能使用默认设置流选择行为可能不会选择您想要的。
例子
这将映射来自第二个输入的音频(2.avi
):
-map 1:a
由于
ffmpeg
从 0 开始计数,第一个输入 ID 是 0,第二个是 1,第三个是 2,等等。如果第二个输入有多个音频流,这将映射所有音频流。例如,如果您只想要第二个输入的第四个音频流,那么您可以使用
-map 1:a:3
。
带过滤
我倾向于明确说明ffmpeg
要使用哪个流以避免歧义,而不是依赖默认值。因此您的命令可能看起来像下面的示例:
ffmpeg
-i 1.avi -i 2.avi -i 3.avi -i 4.avi
-filter_complex "
nullsrc=size=640x480 [base];
[0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];
[1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
[base][upperleft] overlay=shortest=1 [tmp1];
[tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
[tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
[tmp3][lowerright] overlay=shortest=1:x=320:y=240[v]
"
-map "[v]" -map 1:a -c:v libx264 -shortest output.mkv
[v]
注意和的两个实例1:a
:它们将映射来自滤镜图的视频和来自第二个输入的音频(2.avi
)。我添加了
-shortest
以确保当最短输入结束时输出也结束(或[v]
)1:a
。