How to overlay/downmix two audio files using ffmpeg

72,195

Solution 1

stereo + stereo → stereo

Normal downmix

Normal downmix

Use the amix filter:

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

Or the amerge filter:

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

Downmix each input into specific output channel

Downmix each input into specific output channel

Use the amerge and pan filters:

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

mono + mono → stereo

mono + mono → stereo

Use the join filter:

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

Or amerge:

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

mono + mono → mono

mono + mono → mono

Use the amix filter:

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

More info and examples

See FFmpeg Wiki: Audio Channels

Solution 2

Check this out:

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

I think it will help.

Solution 3

The amix filter helps to mix multiple audio inputs into a single output.

If you run the following command:

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

This command will mix 3 input audio streams (I used two mp3 files, in the example below) into a single output with the same duration as the first input and a dropout transition time of 3 seconds.

The amix filter accepts the following parameters:

  • inputs: The number of inputs. If unspecified, it defaults to 2.

  • duration: How to determine the end-of-stream.

    • longest: The duration of the longest input. (default)

    • shortest: The duration of the shortest input.

    • first: The duration of the first input.

  • dropout_transition: The transition time, in seconds, for volume renormalization when an input stream ends. The default value is 2 seconds.

For example, I ran the following command in Ubuntu: FFMPEG version: 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 was used to set a variable bit rate. Remember that, you need to install the libmp3lame library, if is necessary. But, it will work even without the -codec:a libmp3lame -q:a 0 part.

Reference: https://ffmpeg.org/ffmpeg-filters.html#amix

Solution 4

For merging two audio files with different volumes and different duration following command will work:

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

Here duration can be change to longest or to shortest, you can also change the volume levels according to your need.

If you're looking to add background music to some voice use the following command as in the gaps the music will become loud automatically:

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

In this threshold is something whose value will decide how much loud the audio should be, the less the threshold more the audio will be. Ratio gives how much the other audio should be compressed, the more the ratio the more the compression is.

Solution 5

If they are different length, you can use apad to add a silent sound to the shortest one

Share:
72,195

Related videos on Youtube

Faisal
Author by

Faisal

Knows C#, VB.Net, Sql Server, Web API, WinForm, Asp.Net MVC, Nodejs, CouchDB

Updated on January 08, 2020

Comments

  • Faisal
    Faisal over 4 years

    Can I overlay/downmix two audio mp3 files into one mp3 output file using ffmpeg?

    • Andriy Tylychko
      Andriy Tylychko over 11 years
      You can decode both of them, mix (pretty simple operation) and encode again
    • Faisal
      Faisal over 11 years
      Can you please mention commands to do that. I checked the other post you mentioned in your link but it did not help.
    • TheFlash
      TheFlash about 11 years
      @Faisalcan u please guide me..how to build ffmpeg on ubuntu? if yes then i will post new question on Stackoverflow with all the necessary details..
  • Faisal
    Faisal over 11 years
    Thanks it helped. what if length of both files is different?
  • Faisal
    Faisal over 11 years
    Thanks, it really helped and done without errors. But my audio files are different in length. Do you have any idea that how to generate output file to the maximum length of input files?
  • Ahmad Arslan
    Ahmad Arslan almost 10 years
    please can you give the example by putting fake path and value . It will be appreciated
  • Ahmad Arslan
    Ahmad Arslan almost 10 years
    Will it be using like this ?? {"ffmpeg","-i", Audio,"-i",Audio2, "-filter_complex" ,"amerge", "-c:a", "libmp3lame","-q:a","4" ,filenameVideoReplace};
  • Admin
    Admin over 9 years
    @LordNeckbeard: Your code is not working for Merging two audio files.
  • sonida
    sonida about 9 years
    It worked for me. It's perfect and faster "ffmpeg -y -i input1.mp3 -i input2.mp3 -filter_complex amerge -c:a libmp3lame -q:a 4 output.mp3"
  • Ahmad Arslan
    Ahmad Arslan over 8 years
    it throws me error in log Unknown encoder 'libmp3lame'
  • llogan
    llogan over 8 years
    @ArslanAhmad Without your actual command and the complete console output I can only guess that your ffmpeg was not configured with --enable-libmp3lame and therefore cannot use this encoder.
  • cesarpachon
    cesarpachon over 7 years
    this worked better for me, as take care of the differences in lenght.. this is how I mixed three sounds: ffmpeg -i flute_long.ogg -i gallop.ogg -i wind.ogg -filter_complex "[0:0][1:0] amix=inputs=3:duration=longest" main.ogg
  • EnriMR
    EnriMR over 7 years
    Perfect explanation of amix :)
  • chovy
    chovy over 7 years
    Is there anyway to adjust the volume on one of the input files down say 20%?
  • dastan
    dastan over 6 years
    @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:d‌​uration=longest" -c:a libmp3lame output1.mp3
  • Hermann
    Hermann almost 6 years
    amerge creates one multi-channel which is then "squashed" into a stereo stream by -ac 2. @Ehsan's answer utilising amix is the better way to go.
  • llogan
    llogan almost 6 years
    @Hermann amerge is more flexible in this regard because you can choose the desired downmix channel layout, but either should be fine for the general user.
  • ychaouche
    ychaouche over 5 years
    Works perfectly well AND is also available for avconv, contrary to the amerge plugin which didn't work for my version of avconv (avconv version 9.20-6:9.20-0ubuntu0.14.04.1)
  • Shino Lex
    Shino Lex over 5 years
    Thanks a lot, worked perfectly for me. I wanted to combine 2 different sound's into 1 file that has different durations.
  • Asif Sb
    Asif Sb over 5 years
    @llogan, I tried using this cmd but it goes to the failure callback method.
  • llogan
    llogan over 5 years
    @AsifSb I don't know what that means.
  • Asif Sb
    Asif Sb over 5 years
    @llogan, I tried using this command for merging two audios using FFMPEG, It is not working.If it is working for you can you please share some code?
  • llogan
    llogan over 5 years
    @AsifSb Use a pastebin link to show your ffmpeg command and the complete log from the command.
  • llogan
    llogan over 5 years
    @AsifSb Is the problem with the script or the ffmpeg command? If the problem is ffmpeg then get rid of the extra layer of complexity from the scripting. Just run the ffmpeg command manually, unscripted and provide the complete log from the ffmpeg command. Once you verify that ffmpeg runs only then should you attempt to script it.
  • Asif Sb
    Asif Sb over 5 years
    I don't think the problem is with the FFmpeg but command. Because when I try to execute another command it gives me success.
  • llogan
    llogan over 5 years
    @AsifSb The command works for me. I can't help you because you never provided the log from ffmpeg.