As it was suggested here I am using cat
command to concatenate several .mp3 files into one .mp3 file.
Imagine, I have following .mp3 files in the current folder:
001001.mp3 001002.mp3 001003.mp3 001004.mp3 001005.mp3
or, like this:
096001.mp3 096002.mp3 096003.mp3 096004.mp3
I need to concatenate these .mp3 files in there ascending sequence, i.e. 001001.mp3+001002.mp3+001003.mp3+etc.
In order to join these .mp3 files into one I am executing following command in the current folder:
cat *.mp3 > final.mp3
I tested the final .mp3 file and it is what I am expected, but I need to be sure that above command picks files in there ascending sequence.
Can I be sure that above command always concatenates files in the ascending sequence?
Thank you Sir!
cat
is not the right tool for this job. The MP3 format has all sorts of junk that can lurk at the front and end of the file and this needs to be strippe out.mp3wrap
is what you want. It will exclude any metadata in the files and stick the audio together.Before you do that, run
ls *.mp3
to check that they're in the correct order. When I originally wrote this answer (over six years ago!) wildcard globs apparently didn't behave well but I think they do now.You might need to rename the files if for example, they are numbered but aren't zero-padded,
{1-11}.mp3
would be sorted by1 10 11 2 3 4 5 6 7 8 9
. This can be fixed easily.mp3wrap seems to be a decent enough solution, but when I played the resulting file, the timestamp wasn't correct. It seems like mp3wrap is best used when you're joining mp3s into a file that you know you'll want to split later.
I simply wanted to permanently concatenate some mp3s together. I ended up using ffmpeg to concatenate the files:
First, install ffmpeg
Ubuntu 15.04+
Ubuntu 14.10 and below
Go to http://ffmpeg.org/download.html, download one of the static builds, untar it, and copy to /usr/local/bin
ffmpeg -i "concat:file1.mp3|file2.mp3" -acodec copy output.mp3
More info: https://trac.ffmpeg.org/wiki/Concatenate#protocol
https://superuser.com/a/314245
As previously suggested,
mp3wrap
is a good solution. It may not work all of the time though. As far as I know,mp3wrap
assumes that all the input files have the same characteristics such as VBR vs CBR, bitrate, and so on. If this assumption isn't met, it is likely to fail. In that case, the only solution would be to decode all the mp3files to a raw format like.wav
, concatenate them with a program likesox
and finish by re-encoding all to mp3.Most people are suggesting
mp3wrap
, but it has downsides: the file generated does not report its full length in some players, and then you cannot seek past that point.mp3cat
does the job fast and well, as far as I can tell. It can be downloaded in http://mulholland.xyz/dev/mp3cat/, and used as follows:another possibility would be
sox
but it seems very slow (possibily it decodes and reencodes the audio?)
It does an alphabetical sort based on single characters. That means that "01" comes before "1", since nought has a lower value than one.
Here's an example. I've got a directory with files named 1, 2, 3, 04, 05, and 06. They are text files that contain their own file names:
So, yes it will; but you need to make sure that all your files are 'padded' properly.
This nifty line of bash script will let you visually compare the file names, making it very easy to spot any mistakes:
It's output will look like this:
If they aren't, you will need to pad the file names: Bash script to pad file names on StackOverflow explains how to do it.
Edit. Vote for Oli's answer, it's much better. :P
I'll leave mine because it add something, but you should use his solution,
Keep in mind that
sort
will still sort things in the way I described above, you will still need to pad file-names if they aren't equal in length.I found the online service audio-joiner to work very well and preserve the correct time-stamp (contrary to mp3wrap).
perl
andffmpeg
available) after changing to the folder with all the files you want to concatenateffmpeg
I love bmaupin's comment, yet it could produce natural sort of (version) numbers by using
sort -V
:and you don't have to deal with special characters like
' " () [] {}
in the filename.Let me summarize the other answers:
mp3wrap
joins mp3 files into a special "concatenated mp3 file" format, which is faster because it doesn't require re-encoding, but has the disadvantage of not being a normal mp3 file with a length and so on.ffmpeg -i "concat:file1.mp3|file2.mp3" -acodec copy output.mp3
is cumbersome to type, but should work well, as it's a standard command to use for joining video files for example. However, in my testing it introduces glitches at the input file transitions.sox file1.mp3 file2.mp3 target.mp3
should work great, certainly much easier to type, but it also introduces glitches in my testing.Even when I use
sox
to first convert each .mp3 file to .wav, and thensox file1.wav file2.wav target.wav
, the output contains audible glitches.However, if I use
mpg123
to decode the mp3 files to .wav, then I can join the .wav files with Sox and not hear glitches. This suggests that the problem withsox
(and maybeffmpeg
) is in the decoding of the mp3 files.mp3cat
apparently works great but I was too lazy to test it, as it isn't found in my distribution's repositoryIt's curious that no one mentioned
mpg123
yet. Although troubled by security and license issues early in its 20+ year history, it is one of the original mp3 players and should be fairly stable. Since it automatically concatenates its mp3 arguments (in a glitch-less fashion) before sending them to the sound card, we just have to use the-w
option to tell it to output to a Wave file instead. Thenlame
encodes this back to mp3. Here's a script which accomplishes this:Usage example: