How to join mp3 files online without uploading — free tool
- Step 1Drop your MP3 files — Add 2 or more MP3s to the multi-file dropzone above. The dropzone also accepts WAV, FLAC, M4A, OGG, and Opus, so you can mix in a non-MP3 file too — but for an MP3-to-MP3 join, drop MP3s.
- Step 2Order them in the list — Files join top-to-bottom in list order. There is no reorder handle — if a file is in the wrong spot, remove it with its X and re-add. Check each file's duration so the total looks right.
- Step 3Keep crossfade at 0 — For a standard gapless MP3 join, leave
crossfadeS: 0. A crossfade only applies to exactly 2 files; for a plain chapter/segment join you want the hard concat. - Step 4Confirm output format is MP3 — MP3 is the default output. Leave it on MP3 to get a single
.mp3. (Switch to WAV or FLAC only if you want a lossless join of the MP3 sources.) - Step 5Run the join — FFmpeg-WASM decodes each MP3, resamples to 48 kHz stereo, concatenates, and re-encodes to MP3 at 192 kbps — all on your CPU. Longer/larger batches take more time.
- Step 6Download merged.mp3 — The file saves as
merged.mp3. The metrics panel reports input/output bytes and time. Confirm the duration equals the sum of the input durations (a hard join adds no time).
Stream copy vs re-encode (what this tool does)
Important accuracy note: this tool does NOT do a byte-level MP3 stream copy. It always decodes and re-encodes. Here's the trade-off so you know what you're getting.
| Approach | Quality | Handles mismatched MP3s? | This tool |
|---|---|---|---|
| Byte-level stream copy | No generation loss | No — clicks/wrong duration on mismatch | Not used |
| Decode + resample + re-encode (concat filter) | One re-encode generation | Yes — normalises to 48 kHz stereo first | Yes (always) |
| Output codec | libmp3lame @ 192 kbps | — | Fixed for MP3 output |
How mismatched MP3s are reconciled
Whatever the input MP3s look like, they're normalised to one timeline before joining.
| Input variation | What the merger does | Result |
|---|---|---|
| Different bitrates (128 vs 320 kbps) | Decodes both, re-encodes at 192k | Uniform 192 kbps output |
| Different sample rates (44.1 vs 48 kHz) | Resamples all to 48 kHz | Single 48 kHz timeline, no pitch/clock drift |
| Mono + stereo mix | Upmixes mono to stereo | Stereo output throughout |
| VBR + CBR mix | Decoded to PCM, re-encoded | Consistent CBR-style 192k output |
Tier limits (audio family)
Per-file size and duration caps plus batch-file counts. Multi-file MP3 joins need Pro or higher because Free's batch is 1 file.
| Tier | Max file size | Max duration / file | Files per batch |
|---|---|---|---|
| Free | 50 MB | 30 min | 1 |
| Pro | 200 MB | 120 min | 10 |
| Pro-Media | 100 GB | Unlimited | 100 |
| Developer | 100 GB | Unlimited | Unlimited |
Cookbook
Real MP3-join scenarios with inputs, options, and output. The merger always re-encodes to a uniform 48 kHz stereo 192 kbps MP3.
Join chapter MP3s of different bitrates
Audiobook chapters downloaded from different sources often have different bitrates. Joining them re-encodes everything to a uniform 192 kbps.
Inputs: ch1.mp3 128 kbps 44100 Hz 18:20 ch2.mp3 320 kbps 44100 Hz 21:05 ch3.mp3 192 kbps 48000 Hz 16:40 Options: crossfade 0, format MP3 Output: merged.mp3 192 kbps 48000 Hz 56:05
Combine two phone-recorded VBR MP3s
Phone recorder apps export VBR MP3. Concatenating VBR files at the byte level breaks duration reporting; re-encoding fixes it.
Inputs: call-part1.mp3 VBR ~96 kbps 44100 Hz 4:12 call-part2.mp3 VBR ~96 kbps 44100 Hz 3:48 Options: crossfade 0, format MP3 Output: merged.mp3 192 kbps 48000 Hz 8:00 (correct duration)
Join MP3s but output lossless WAV
If the MP3 join is an intermediate step before editing, output WAV so you don't stack a second lossy generation in your DAW.
Inputs: loop-a.mp3 192 kbps 2:00 loop-b.mp3 192 kbps 2:00 Options: crossfade 0, format WAV Output: merged.wav 48000 Hz 2ch 4:00 (pcm_s16le)
Re-target the joined bitrate afterward
The merge is fixed at 192 kbps. To get 320 kbps (or 64 kbps for a smaller file), join first then convert.
Step 1 join-mp3-files-online-no-upload ep1.mp3 + ep2.mp3 -> merged.mp3 (192 kbps) Step 2 bitrate-changer merged.mp3 -> 320 kbps (or 96 kbps for distribution)
Trim dead air, then join
Silence at the start/end of separate MP3s adds gaps at the seams. Trim each first, then join.
Step 1 audio-trimmer (per file) cut leading/trailing silence off intro.mp3 and main.mp3 Step 2 join-mp3-files-online-no-upload intro-trimmed.mp3 + main-trimmed.mp3 -> merged.mp3
Edge cases and what actually happens
Expecting a no-re-encode stream copy
Not supportedThis tool does not do a byte-level MP3 stream copy — it always decodes and re-encodes through libmp3lame at 192 kbps. That means one generation of MP3 loss, but it's why mismatched-bitrate/VBR files join cleanly. For a lossless join of the same MP3 sources, output WAV or FLAC instead.
Only one MP3 added
RejectedThe merger needs at least 2 files; one file throws Audio merger needs at least 2 files. To split or trim a single MP3, use audio-splitter or audio-trimmer.
MP3s at different sample rates
By designA 44.1 kHz and a 48 kHz MP3 are both resampled to 48 kHz before joining, so there's no clock drift or pitch shift across the seam — a real risk with naive byte concat. This normalisation is intentional.
Output bitrate is always 192 kbps
ExpectedMP3 output is fixed at 192 kbps regardless of input bitrates. If the inputs were 320 kbps you can't preserve that here — the merge re-encodes to 192k. Use bitrate-changer afterward to raise or lower the joined file's bitrate.
Crossfade requested with 3+ MP3s
IgnoredCrossfade only applies to exactly 2 files. With 3 or more MP3s the crossfade value is ignored and a hard concat is used. Merge in pairs if you need overlaps between several segments.
MP3 has embedded ID3 cover art / tags
DroppedRe-encoding produces a fresh MP3 stream; embedded ID3 tags and cover art from the inputs are not carried into merged.mp3. Add metadata afterward with id3-editor.
A file is mono
ExpectedMono MP3s are upmixed to stereo on the common timeline, so the output is stereo even if some inputs were mono. There's no mono output option in the merger.
File over the tier size/duration cap
BlockedFree caps each file at 50 MB / 30 min; Pro at 200 MB / 120 min. An oversize file blocks the run. Trim it with audio-trimmer or upgrade for higher ceilings.
Free tier can only batch 1 file
Tier limitThe Free audio batch limit is 1, but a join needs 2+, so practical MP3 joining starts at Pro (10 files). The merge logic is identical at every tier — only the file-count/size gates differ.
Large batch is slow / memory-heavy
ExpectedEvery MP3 is decoded to PCM in memory, resampled, and re-encoded — all in the browser. Joining many long files can be slow and use lots of RAM. Close other tabs for big jobs.
Frequently asked questions
Does this join MP3s without re-encoding?
No — it always decodes and re-encodes to MP3 at 192 kbps via libmp3lame. There is no byte-level stream-copy path. The benefit is that MP3s with different bitrates, sample rates, or VBR/CBR encodings join cleanly without seam clicks or wrong-duration bugs. The cost is one (usually inaudible) re-encode generation. For a lossless join of MP3 sources, output WAV or FLAC.
Are my MP3s uploaded?
No. Everything runs in your browser on FFmpeg 8.1 (WebAssembly). The files never leave your device, and no account is required to merge and download. That's the point of the no-upload design — private calls, drafts, and client audio stay local.
Can I join MP3s of different bitrates?
Yes. Mixed bitrates (e.g. 128 + 320 kbps) are decoded and re-encoded to a uniform 192 kbps, so the joined file has one consistent bitrate instead of a patchwork. Different sample rates are also normalised to 48 kHz.
Can I keep the output at 320 kbps?
Not directly — the merge always outputs 192 kbps for MP3. Join first, then run the result through bitrate-changer to re-encode to 320 kbps (or down to 96/64 kbps for a smaller file).
Will my ID3 tags and cover art carry over?
No. The output is a fresh MP3 stream, so input ID3 tags and embedded artwork are not preserved. Re-apply title/artist/album and cover art afterward with id3-editor.
How many MP3s can I join at once?
At least 2. The maximum per batch depends on tier: Pro 10, Pro-Media 100, Developer unlimited. Free's audio batch limit is 1 file, so multi-file joining needs Pro or above.
What order do the files play in?
The order they appear in the list (the order you added them). There's no reorder control, so if it's wrong, remove a file with its X button and add the files back in the correct sequence.
Can I add a non-MP3 file to the join?
Yes — the dropzone accepts WAV, FLAC, M4A, OGG, and Opus too. Any mix is normalised to the same 48 kHz stereo timeline before joining, so you can drop, say, a WAV intro in with your MP3s. The MP3-to-one-MP3 case is just the most common.
Why is the merged duration exactly the sum of the parts?
Because a hard join (crossfade 0) is a plain concatenation — no overlap is removed. If you set a crossfade (2 files only), the output is shorter by the overlap duration. A duration that's far off usually means a file was added twice or in the wrong place.
Is there a file-size limit?
Yes — per tier. Free: 50 MB and 30 minutes per file. Pro: 200 MB / 120 min and up to 10 files. Pro-Media and Developer: 100 GB with no duration limit. The duration cap is per file, separate from the size cap.
How do I get gapless joins with no silence between tracks?
A hard join is already gapless at the seam, but if individual files have trailing/leading silence you'll hear a pause. Trim each file's ends with audio-trimmer (or remove internal silence with silence-stripper) before joining.
What's the best workflow for a clean joined MP3?
Trim ends per file, join into one MP3 here, then normalise loudness with loudness-normalizer so the whole file sits at a consistent level. For spoken content, podcast-master handles leveling and limiting in one step.
Privacy first
Every JAD Audio tool runs entirely in your browser via FFmpeg (WebAssembly) and RNNoise. Your audio files never leave your device — verified by zero outbound network requests during processing.