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)?
5 Answers
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
-
-
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'
– The OninMay 7, 2018 at 22:18
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
-
1I believe this is the 'correct' ffmepg answer as it will not re-encode anything. Aug 28, 2013 at 0:59
-
-
-
1I get an error when I attempt the one-liner, but this works for me:
ffmpeg -f concat -safe 0 -i <(for f in ./*.flac; do echo "file '$PWD/$f'"; done) output.flac
– PeterApr 10, 2020 at 22:02 -
a) Edit the file inputs.txt if some files of the type (ogg,flac,mp3) do not exist. b) If 'Unsafe file name' is reported then add the following parameter : -safe 0 example : ffmpeg -f concat -safe 0 -i inputs.txt output.flac Feb 15 at 13:41
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
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 runshntool join *.flac
as above.