Join many MP3, OGG, and FLAC files into one WAV or FLAC

9

3

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)?

Fraxtil

Posted 2010-07-31T22:18:02.803

Reputation: 1 013

Answers

6

You can do this with ffmpeg and sox:

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

sox *.wav combined.wav

Matthew Flaschen

Posted 2010-07-31T22:18:02.803

Reputation: 2 370

This worked perfectly! Thank you for the help. – Fraxtil – 2010-08-01T00:11:02.480

sox doesn't work for OGG: /usr/local/Cellar/sox/14.4.2_1/bin/sox FAIL formats: no handler for detected file type 'opus' – Housemd – 2018-05-07T22:18:28.703

8

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

evilsoup

Posted 2010-07-31T22:18:02.803

Reputation: 10 085

Does not work if a file name contains ' – Display Name – 2014-11-11T06:21:34.830

^ I'm talking about 1st command, didn't try other two yet. – Display Name – 2014-11-11T08:27:10.560

1I believe this is the 'correct' ffmepg answer as it will not re-encode anything. – Andrew Burns – 2013-08-28T00:59:40.360

3

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

shntool join *.flac

Raphael

Posted 2010-07-31T22:18:02.803

Reputation: 305

I get this error: shntool [join]: warning: unsupported format 0xfffe (Unknown) while processing file: [file1.flac] – bonh – 2019-09-14T04:06:37.460

1

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
do
flac -f --decode "$file" -o temp.wav
flac -f -8 temp.wav -o "$file"
done
rm temp.wav

Then run
shntool join *.flac
as above.

Brent Fisher

Posted 2010-07-31T22:18:02.803

Reputation: 41

1

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

dgrb

Posted 2010-07-31T22:18:02.803

Reputation: 11