Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have 33 audio files, each about 11 seconds long, and I'd like to merge them into one lossless file. How can I do this efficiently (i.e. without cut-pasting in Audacity 33 times)?

share|improve this question
up vote 3 down vote accepted

You can do this with ffmpeg and sox:

for i in *.mp3 *.ogg *.flac
  ffmpeg -i "$i" "$i.wav"

sox *.wav combined.wav
share|improve this answer
This worked perfectly! Thank you for the help. – Fraxtil Aug 1 '10 at 0:11

Assuming you want to merge them alphabetically, by filename:

for f in ./*.{ogg,flac,mp3}; do echo "file '$f'" >> inputs.txt; done
ffmpeg -f concat -i inputs.txt output.wav

The for loop puts all the filenames in a file called inputs.txt, one-per-line, and the second one uses ffmpeg's concat demuxer to merge the files. It is possible to use printf instead of the loop like so:

printf "file '%s'\n" ./*.{ogg,flac,mp3} > inputs.txt

Assuming a modern shell, you can also use command substitution to do the whole thing in a single line.

ffmpeg -f concat -i <(printf "file '%s'\n" ./*.{ogg,flac,mp3}) output.wav
share|improve this answer
I believe this is the 'correct' ffmepg answer as it will not re-encode anything. – Andrew Burns Aug 28 '13 at 0:59
Does not work if a file name contains ' – Sarge Borsch Nov 11 '14 at 6:21
^ I'm talking about 1st command, didn't try other two yet. – Sarge Borsch Nov 11 '14 at 8:27

If you start with only lossless files, you can use use shntool:

shntool join *.flac
share|improve this answer

It seems that the Sound Juicer that comes with Ubuntu writes broken FLAC files, which result in no MD5 signature in the file. MAKE A COPY of the directory containing the files you want to concatenate, then run the script below.
echo fixing broken FLAC files
find . -type f|grep .flac$ |while read file
flac -f --decode "$file" -o temp.wav
flac -f -8 temp.wav -o "$file"
rm temp.wav

Then run
shntool join *.flac
as above.

share|improve this answer

However, be aware that the shntool join will insist on joining them in collating sequence (alphabetical) order EVEN IF you specify them otherwise.

shntool join fileB.flac fileA.flac

will put A before B.

You can either rename the files first or use the -r parameter ("-r ask" will prompt for the order).

Frankly I find this irritating...

Also you can force the output mode, so if you're joining FLACs:

shntool join *.flac -o flac

will result in joined.flac rather than joined.wav

share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .