使用ffmpeg顺序添加多个音轨并将特定音轨固定到末尾

时间:2019-01-02 23:23:56

标签: audio ffmpeg

我有一个没有音轨的视频,并且想要顺序添加多个音轨(每个音轨都紧随其后开始)。

基本情况可能如下所示:

|-----------VIDEO-----------VIDEO-------------VIDEO-----------VIDEO-----------|  
|---FULL AUDIO TRACK 1---|---FULL AUDIO TRACK 2---|---PARTIAL AUDIO TRACK 3---|

这是我要实现的目标:

ffmpeg -i video.mov -i audio1.mp3 -i audio2.mp3 -i audio3.mp3 -map 0:0 -map 1:0 -map 2:0 -map 3:0 out.mp4

当然,它不会产生理想的结果。它只使用out.mp4中的第一个音乐剪辑,结束时不会启动其他音轨。

问题1
为了顺序添加多个音轨,我缺少什么?我假设它指定了音频剪辑的起点和终点,但是我在定位语法上很短。

...

此外,我正在寻找一种方法来确保视频以AUDIO TRACK 3的完整时长结束,如下所示:

|-----------VIDEO-----------VIDEO-------------VIDEO-----------VIDEO-----------|  
|---FULL AUDIO TRACK 1---|---PARTIAL AUDIO TRACK 2---|---FULL AUDIO TRACK 3---|

在这种情况下,将修剪音频轨道2,以便将完整的音频轨道3固定在末端。

问题2
可以在FFmpeg中完成这种类型的音频固定,还是必须先用其他程序来修剪AUDIO TRACK 2?

1 个答案:

答案 0 :(得分:2)

使用atrim,setsets和concat过滤器:

ffmpeg -i video.mov -i audio1.mp3 -i audio2.mp3 -i audio3.mp3
  -filter_complex "[2:a]atrim=duration=5,asetpts=PTS-STARTPTS[a2];[1:a][a2][3:a]concat=n=3:a=1:v=0[a]"
  -map 0:v -map "[a]" -c copy -c:a aac -shortest output.mp4
  • atrim修剪音频。如果您更喜欢start和/或end,也可以使用duration和/或ffprobe选项。
  • asetpts重置时间戳(concat要求)。
  • concat连接每个音频段。

如果要自动执行此操作,则必须编写脚本。您可以使用ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4 获取每次输入的持续时间:

{{1}}

然后使用它来确定要修剪的音频流的持续时间。