Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

How do you join multiple MP3 files into one? "cat" and "mp3wrap" are no good as they produce non standard MP3 files. I know I can use audacity, but when you have 1000's of MP3 files to join into one, it takes too long.

Any suggestions?

share|improve this question

3 Answers 3

up vote 6 down vote accepted

Use ffmpeg or a similar tool to convert all of your MP3s into a consistent format, e.g.

ffmpeg -i originalA.mp3 -f mp3 -ab 128kb -ar 44100 -ac 2 intermediateA.mp3 ffmpeg -i originalB.mp3 -f mp3 -ab 128kb -ar 44100 -ac 2 intermediateB.mp3

Then, at runtime, concat your files together:

cat intermediateA.mp3 intermediateB.mp3 > output.mp3

Finally, run them through the tool MP3Val to fix any stream errors without forcing a full re-encode:

mp3val output.mp3 -f -nb
(source)

share|improve this answer
    
So it's not possible to do this lossless? –  oshirowanen Oct 24 '10 at 20:05
    
@oshirowanen maybe using VBR it's possible, did you try that? –  Tobias Kienzler Aug 24 '11 at 12:56
    
interesting, simple catting 2 mp3 files (extracted 2CD movie audio track) automagically works, mplayer shows correct total duration –  mykhal Oct 23 '11 at 21:10
    
@mykhal But Amarok and Clementine do not; they show the original first file's length. –  Mr Lister Jul 29 at 6:11

You can do this programmatically with ffmpeg's concat demuxer.

First, create a file called inputs.txt with lines like

file '/path/to/input1.mp3'
file '/path/to/input2.mp3'
file '/path/to/input3.mp3'

...etc. Then, run the following ffmpeg command:

ffmpeg -f concat -i inputs.txt -c copy output.mp3

It's possible to generate inputs.txt easily with a bash for loop (this can probably be done with a Windows batch for loop too), assuming you want to merge the files in alphabetical order. This will match every *.mp3 in the working directory, but it can be easily modified:

for f in ./*.mp3; do echo "file '$f'" >> inputs.txt; done
##  Alternatively
printf "file '%s'\n" ./*.mp3 >> inputs.txt

It's also possible to do the entire thing in one line, avoiding the creation of an intermediate list file with process substitution:

ffmpeg -f concat -i <(printf "file '%s'\n" ./*.mp3) -c copy output.mp3
share|improve this answer
    
The process substitution example here creates an input list that ffmpeg doesn't like; it barfs for me with [concat @ 0x10201a200] Impossible to open '/dev/fd/./01 Track.mp3'. I fixed it by making the path to the files absolute: ffmpeg -f concat -i <(printf "file '/path/to/files/%s'\n" *.mp3) -c copy output.mp3 –  Neil C. Obremski Feb 24 at 21:15

Goldwave has some batch processing capabilities, though it's shareware, not freeware.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.