Joiner · No upload

Join MP3 and M4A audio into one MP3 on your device

Join MP3 and M4A tracks or voice memos in the order you choose and download one MP3.

Drag a row to move it, or use its ↑ and ↓ buttons, which also work from the keyboard. Join follows the list order.

Output is one newly encoded MP3. Lossy sources can lose a little more quality, and metadata (titles, dates, album art and chapters) is not copied. Keep your originals.

Statusidle Files— File— Sum of parts— Crossfadeoff Output duration— Planned PCM rate— Planned channels— Requested bitrate192 kbps Output size— Network since file read—

Refused by name: a file after 50 usable files are queued, input past 60 minutes, not an audio file this tool accepts, or one your browser cannot decode; refusal cutoffs, not completion promises. Mid-join failure makes no new output. Results count remixed files and list each shortened seam; crossfades can pass full scale and are clipped without a note. Takes .mp3, .m4a, .aac, .wav, .ogg, .oga, .opus, .flac and .weba.

How this joiner works

When you add a file, your browser reads it and its audio engine decodes it once to measure it. The row shows the duration and channel count, and the decoded audio is not kept. Pressing Join decodes the files again, one at a time in list order, and feeds the audio to lamejs, a JavaScript port of the LAME encoder (LGPL), so the page does not build one decoded buffer for the whole join; at a common 44.1 kHz rate, an hour of stereo Float32 audio alone exceeds a gigabyte. One encoder writes the whole join as a single MPEG stream, so each seam sits inside one stream. The bitrate in the readout and result rows is your request, and at low PCM input rates the encoder can use a lower bitrate.

Leave the crossfade field empty for a straight join: the last sample of one file is followed by the first sample of the next. Enter a duration to overlap the tracks on an equal-power fade curve, which keeps perceived loudness roughly steady through the join. A crossfade is capped at 10 s and at 45% of the shorter adjoining track, and any clamp is reported below the result. Mixed inputs are normalised to one PCM sample rate and channel count before encoding. The readout shows the planned PCM rate and channel count, and the result row reports the format supplied to the encoder. Neither is measured from finished MP3 headers.

The output is a new, lossy MP3, and tags, dates, album art and chapters are not carried across. There is no loudness matching between tracks. Only the extensions listed under the readout are accepted: AIFF is refused before decoding, even in a browser that could read it. Chrome’s decoder reports a file holding no audio as undecodable, so that file gets an error row and is not joined as an empty track. When memory, a browser limit or processor speed stops a join, the page reports the failure; it does not save a shortened file.

Frequently asked questions

Is my audio uploaded anywhere?
No. The browser reads and decodes the files, and the MP3 encoder writes the joined result in this tab. The network meter counts resource-timing entries from the first file read, so the earlier page and encoder downloads and any WebSocket traffic fall outside it. The methodology page explains the other checks.
How do I set the order the files play in?
From the top of the list to the bottom. Drag a row to a new place, or use its up and down buttons from the keyboard; removing a file leaves the others where they are. Reordering can change the output length, because the crossfade allowed at each seam depends on the two tracks beside it.
What does the crossfade do to the seam?
It overlaps the two tracks: the outgoing one fades down as the incoming one fades up. Both are audible during the overlap, so unrelated passages can sound like two tracks playing at once. The joined file is shorter than the tracks’ combined length by the overlap at each seam, and the readout shows the result.
What do the planned PCM rate and channels mean?
They are the sample-buffer (PCM) rate and channel count the page plans to hand the MP3 encoder. If any decoded input has two or more channels, the plan is stereo and mono tracks are copied to both channels; otherwise it is mono. The browser downmixes sources with more than two channels. Browser decoding may resample before this page receives the samples, so the planned rate is not each source’s original rate.
What happens if a file will not decode or my device cannot finish the join?
A file your browser cannot decode, or one with a name this page does not accept, gets its own row giving the reason and stays out of the join; the other files still join as long as two remain. If a file that decoded when you added it fails during the join, that run stops and makes no new file. The page also refuses a file after 50 usable files are queued, and any file that would take the decoded input past 60 minutes. A smaller join can still fail on a device that runs short of memory or processing power, or when the browser hits a limit.

Related tools