【问题标题】:Insert trimmed audio into a video with FFMPEG使用 FFMPEG 将修剪后的音频插入视频
【发布时间】:2018-03-14 14:07:47
【问题描述】:

最近我不得不使用 FFMPEG 进行一些工作,有时我很难理解应该使用哪些命令/过滤器来实现我的目标,这篇文章仅用于分享我在此过程中获得的知识,特别是在处理音频文件并将其插入视频的过程。

我需要在特定位置和特定持续时间用新音频文件替换视频的音频,最好在音频结束时淡出,以下是我的问题的解决方案及其解释。

我还应该提到,获得了一些所需的知识 通过研究rajib 在此post 中提供的答案,也非常感谢他!

【问题讨论】:

    标签: audio video ffmpeg video-processing


    【解决方案1】:

    这是完整的命令,提供了一个名为 vinput.mp4 的输入视频文件和一个名为 ainput.wav 的音频文件:

    ffmpeg -y -i vinput.mp4 -i ainput.wav -filter_complex "\
     [1:a]aloop=-1:2e+09[aloop];\
     [aloop]aformat=channel_layouts=mono,atrim=end=2[atrim];\
     [atrim]adelay=2000[afinal];\
     [afinal]afade=t=out:st=3.5:d=0.5[afinal]" \
    -shortest -map "[afinal]" -map 0:v output.mp4
    

    下面是每个步骤的解释:

    [1:a]aloop=-1:2e+09[aloop]
    

    将无限次循环我的音频 (-1),并重复可能的最大帧数 (2e+09)(我没有找到一种方法来告诉命令只完整地重复音频。 ..


    [aloop]aformat=channel_layouts=mono,atrim=end=2[atrim]
    

    这会从上一条指令(aloop)中获取循环音频,并主要将其修剪为仅持续 2 秒。


    [atrim]adelay=2000[afinal]
    

    这会将音频的开始延迟 2000 毫秒(2 秒),使其在视频的第二秒开始播放。


    [afinal]afade=t=out:st=3.5:d=0.5[afinal]
    

    这将淡出我们的音频,在视频的第 4 秒开始淡出,并使淡出持续 0.5 秒,这意味着声音将从第 3.5 秒到第 4 秒淡出。


    -shortest
    

    因为我们有一个无限重复的音频流,我们需要告诉 ffmpeg 什么时候停止编码,这是由标签完成的,它告诉 ffmpeg 我们期望最终结果与最短输入一样长它收到了(在这种情况下,视频输入)。


    -map "[afinal]" -map 0:v
    

    正如Samuel Williamshis answer 中指出的那样,这个选项指示 ffmpeg 我们要复制哪些流到生成的输出,在这种情况下,我们希望同时拥有最终音频(afinal)和源视频流(0:v)。

    【讨论】:

    • 这个答案为我省去了很多麻烦!谢谢!
    【解决方案2】:

    https://stackoverflow.com/a/12943003/6917520

    -map 选项指示 ffmpeg 你想要什么流。从 input_0.mp4 复制视频和从 input_1.mp4 复制音频:

    $ ffmpeg -i input_0.mp4 -i input_1.mp4 -c copy -map 0:0 -map 1:1 -shortest out.mp4

    【讨论】:

    • 谢谢 Samuel,忘记解释那部分了!感谢分享:)
    • 我应该将此添加到原始答案中以在同一位置编译所有信息吗?
    • 当然!请务必记下我的功劳,并链接我的答案。
    猜你喜欢
    • 2017-05-05
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2023-04-02
    • 2019-08-25
    • 2018-03-26
    相关资源
    最近更新 更多