【问题标题】:Use ffmpeg to sequentially add multiple audio tracks and pin a specific track to the end使用 ffmpeg 顺序添加多个音轨并将特定音轨固定到末尾
【发布时间】:2019-01-02 23:23:55
【问题描述】:

我有一个没有音轨的视频,想按顺序添加几个音轨(每个音轨紧接着另一个开始)。

基本情况可能如下所示:

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

在这种情况下,AUDIO TRACK 2 会被修整,以便将完整的 AUDIO TRACK 3 固定到末尾。

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

【问题讨论】:

    标签: audio ffmpeg


    【解决方案1】:

    使用 atrim、asepts 和 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
    

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

    【讨论】:

    • 完美。我接受了您计算持续时间的方向 - 但并非所有人都会。我会添加持续时间的简单计算,也许在替换“持续时间 = 5”时使用它的注释。例如,duration = audio2.mp3(D) = video.mov(D) - audio3.mp3(D) - audio1.mp3(D),其中 (D) 是每个命名文件的持续时间。
    • 你有什么方向可以添加多个视频源到这个脚本中,它们之间有 1 秒的交叉淡入淡出吗?
    • @kraftydevil 见these three answers
    猜你喜欢
    • 2016-04-18
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多