从第二个输入文件中选择音频用于 ffmpeg 电影叠加

从第二个输入文件中选择音频用于 ffmpeg 电影叠加

我正在此示例来自 ffmpeg wiki

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

相关内容