代码之家  ›  专栏  ›  技术社区  ›  kraftydevil

使用ffmpeg按顺序添加多个音频曲目并将特定曲目固定到结尾

  •  0
  • kraftydevil  · 技术社区  · 6 年前

    我有一个没有音频曲目的视频,并希望按顺序添加几个音频曲目(每个曲目紧接着另一个开始)。

    基本情况可能如下所示:

    |-----------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
    

    当然,它没有产生预期的结果。它只使用第一个音乐剪辑in-out.mp4,并且在结束时不启动其他音频曲目。

    问题1
    为了按顺序添加多个音频曲目,我缺少什么?我假设它指定了音频剪辑的起始点和结束点,但我在查找语法方面做得不够。

    此外,我正在寻找一种方法来确保视频以音频曲目3的完整持续时间结束,如下所示:

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

    在这种情况下,音频曲目2将被修剪,以便将完整的音频曲目3固定到末尾。

    问题2
    这种类型的音频固定可以在ffmpeg中完成,还是我必须先用另一个程序修剪音频曲目2?

    1 回复  |  直到 6 年前
        1
  •  1
  •   llogan    6 年前

    使用Atrim、Asetpts和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 .
    • asetpts 重置时间戳(concat要求)。
    • concat 连接每个音频段。

    如果你想实现自动化,你必须编写脚本。您可以使用 ffprobe :

    ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
    

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