【问题标题】:How to overlay/downmix two audio files using ffmpeg如何使用 ffmpeg 叠加/缩混两个音频文件
【发布时间】:2013-01-08 01:02:37
【问题描述】:

我可以使用 ffmpeg 将两个音频 mp3 文件叠加/缩混成一个 mp3 输出文件吗?

【问题讨论】:

  • 你可以同时解码它们,混合 (pretty simple operation) 并再次编码
  • 能否请您提及执行此操作的命令。我检查了您在链接中提到的另一篇文章,但没有帮助。
  • @Faisalcan 你请指导我..如何在 ubuntu 上构建 ffmpeg?如果是,那么我将在 Stackoverflow 上发布新问题以及所有必要的详细信息..

标签: audio ffmpeg mp3 cmd


【解决方案1】:

使用 Bash

set 'amovie=a.mp3 [gg]; amovie=b.mp3 [hh]; [gg][hh] amerge'
ffmpeg -f lavfi -i "$1" -q 0 c.mp3

Example

【讨论】:

  • 感谢它的帮助。如果两个文件的长度不同怎么办?
【解决方案2】:

立体声 + 立体声 → 立体声

正常缩混

使用amix 过滤器:

ffmpeg -i input0.mp3 -i input1.mp3 -filter_complex amix=inputs=2:duration=longest output.mp3

amerge 过滤器:

ffmpeg -i input0.mp3 -i input1.mp3 -filter_complex amerge=inputs=2 -ac 2 output.mp3

将每个输入缩混到特定的输出通道中

使用amergepan 过滤器:

ffmpeg -i input0.mp3 -i input1.mp3 -filter_complex "amerge=inputs=2,pan=stereo|c0<c0+c1|c1<c2+c3" output.mp3

单声道 + 单声道 → 立体声

使用join 过滤器:

ffmpeg -i input0.mp3 -i input1.mp3 -filter_complex join=inputs=2:channel_layout=stereo output.mp3

amerge:

ffmpeg -i input0.mp3 -i input1.mp3 -filter_complex amerge=inputs=2 output.mp3

单声道 + 单声道 → 单声道

使用amix 过滤器:

ffmpeg -i input0.mp3 -i input1.mp3 -filter_complex amix=inputs=2:duration=longest output.mp3

更多信息和示例

FFmpeg Wiki: Audio Channels

【讨论】:

  • 谢谢,它真的很有帮助,而且没有错误。但是我的音频文件长度不同。您知道如何将输出文件生成到输入文件的最大长度吗?
  • 请您举个假路径和值的例子。将不胜感激
  • 会这样使用吗?? {"ffmpeg","-i", 音频,"-i",Audio2, "-filter_complex","amerge", "-c:a", "libmp3lame","-q:a","4",文件名视频替换};
  • @LordNeckbeard:您的代码不适用于合并两个音频文件。
  • @ArslanAhmad 如果没有您的实际命令和完整的控制台输出,我只能猜测您的ffmpeg 未配置--enable-libmp3lame,因此无法使用此编码器。
【解决方案3】:

如果长度不同,可以用apad给最短的一个加静音

【讨论】:

    【解决方案4】:

    看看这个:

    ffmpeg -y -i ad_sound/whistle.mp3 -i ad_sound/4s.wav -filter_complex "[0:0][1:0] amix=inputs=2:duration=longest" -c:a libmp3lame ad_sound/outputnow.mp3
    

    我认为这会有所帮助。

    【讨论】:

    • 这对我来说效果更好,因为要注意长度的差异。这就是我混合三种声音的方式: ffmpeg -i flute_long.ogg -i gallop.ogg -i wind.ogg -filter_complex "[0:0][1:0] amix=inputs=3:duration=longest" main.ogg
    • 是否可以将其中一个输入文件的音量调低 20%?
    • @chovy ffmpeg -y -i A.mp3 -i B.mp3 -filter_complex "[0:0]volume=0.2[a];[1:0]volume=0.5[b]; [a][b]amix=inputs=2:duration=longest" -c:a libmp3lame output1.mp3
    • 非常感谢,非常适合我。我想将 2 种不同的声音组合成 1 个具有不同持续时间的文件。
    【解决方案5】:

    amix 过滤器有助于将多个音频输入混合到一个输出中。

    如果你运行以下命令:

    ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
    

    此命令会将 3 个输入音频流(我使用了两个 mp3 文件,在下面的示例中)混合到一个输出中,其持续时间与第一个输入相同,并且 dropout 转换时间为 3 秒。

    amix 过滤器接受以下参数:

    • 输入: 输入的数量。如果未指定,则默认为 2。

    • 持续时间: 如何确定流的结尾。

      • 最长: 最长输入的持续时间。 (默认)

      • 最短: 最短输入的持续时间。

      • 首先: 第一次输入的持续时间。

    • dropout_transition: 输入流结束时卷重新归一化的转换时间(以秒为单位)。默认值为 2 秒。

    例如,我在 Ubuntu 中运行了以下命令: FFMPEG 版本:3.2.1-1 Ubuntu 16.04.1

    ffmpeg -i background.mp3 -i bSound.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=0 -codec:a libmp3lame -q:a 0 OUTPUT.mp3
    

    -codec:a libmp3lame -q:a 0 用于设置可变比特率。请记住,如果有必要,您需要安装 libmp3lame 库。但是,即使没有 -codec:a libmp3lame -q:a 0 部分,它也可以工作。

    参考:https://ffmpeg.org/ffmpeg-filters.html#amix

    【讨论】:

    • 完美解释 amix :)
    • 工作得非常好并且也可用于 avconv,这与不适用于我的 avconv 版本的 amerge 插件相反(avconv version 9.20-6:9.20-0ubuntu0.14.04.1)
    【解决方案6】:

    要合并两个具有不同音量和不同持续时间的音频文件,以下命令将起作用:

    ffmpeg -y -i audio1.mp3 -i audio2.mp3 -filter_complex "[0:0]volume=0.09[a];[1:0]volume=1.8[b];[a][b]amix=inputs=2:duration=longest" -c:a libmp3lame output.mp3
    

    这里的持续时间可以更改为最长或最短,您也可以根据需要更改音量级别

    如果您希望为某些声音添加背景音乐,请使用以下命令,因为在间隙中,音乐会自动变响

    ffmpeg -i bgmusic.mp3 -i audio.mp3 -filter_complex "[1:a]asplit=2[sc][mix];[0:a][sc]sidechaincompress=threshold=0.003:ratio=20[bg]; [bg][mix]amerge[final]" -map [final] final.mp3
    
    

    在这个阈值中,它的值将决定音频的音量,阈值越小,音频的音量越大。 Ratio 给出了其他音频应该被压缩多少,ratio 越大压缩越多

    【讨论】:

      【解决方案7】:

      您可以使用以下命令参数:

         // Command is here
      
      let commandValue = "-y -i \(recordedAudioPath) -i \(backgroundAudio) -filter_complex [\(0):a][\(1):a]amerge=inputs=\(2)[a] -map [a] -ac \(2) -shortest -preset ultrafast \(outputPath)"
        MobileFFmpeg.execute(commandValue)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-02
        • 2023-03-20
        • 1970-01-01
        • 2014-10-10
        • 1970-01-01
        • 2013-05-22
        • 1970-01-01
        相关资源
        最近更新 更多