What breaks when you join audio files is rarely the join itself — it is the dozen small mismatches that show up after the button is pressed: the wrong order in the timeline, channels dropped because a mono clip was merged with a stereo clip, sample rates that drift because the tool silently resampled, gaps or fades the tool inserted without permission, and a final WAV that does not carry the tags or cover art from your sources. Audio Joiner is the local browser tool built to make each of those failure modes either impossible or explicitly flagged: it concatenates decoded channel samples in list order with no inserted silence, overlap, crossfade, normalization, transition, or automatic trimming, refuses to mix mono and stereo files, and applies the same fixed budgets on every run so the file you preview is the file you download. Decoding happens through one shared AudioContext inside the current tab, which means the sample rate, channel count, and sample budget the tool reports is the rate, channel count, and budget that govern the output. The picker recognizes common MP3, WAV, M4A, AAC, Ogg, WebM, and FLAC names and MIME types, although a recognized extension is not a guarantee that every browser can decode every codec variant inside that container.

The Usual Problems People Run Into When Joining Audio
Most join failures come from a small set of recurring mistakes. The list you see before clicking "Join in this order" has to match the timeline you want, because the decoded buffers are concatenated in that exact sequence and any reordering updates both the buffer array and the visible list together. A stale preview from a previous reorder is cleared the moment the order changes, so an older WAV can never claim a previous order by accident.
Channel identity is the second recurring trap. When a joiner silently duplicates a mono track across both channels of a stereo output, or averages a stereo pair down to mono to "match" a mono source, the result sounds plausible on headphones and falls apart on speakers. Audio Joiner sidesteps that by rejecting a channel-count mismatch with a clear message, so a mono and stereo mixture never produces a hidden remix.
Sample-rate drift is the third trap. Many joiners resample each source to a common rate without telling you, which means the WAV on disk carries the joiner's working rate instead of the rates stored in the original files. Audio Joiner routes every decoded track through one AudioContext and reports that shared rate for the tracks and result, so the rate you preview is the rate you download — but independent source sample rates are not preserved.
Inserted silence, fades, crossfades, and normalization are a fourth category of failure. Some editors slide in a short gap or a tiny fade at each seam to mask clicks, which is the wrong behavior when you are assembling chapters, lecture segments, or beat-locked music beds. The contract here is direct concatenation: the last sample frame of one decoded track is followed immediately by the first sample frame of the next in the output channel arrays, with nothing in between.
Codec, Container, and Browser-Decode Limits You Should Understand
Browser-based joining depends entirely on what the current browser can decode through its Web Audio implementation, which is documented at MDN's BaseAudioContext.decodeAudioData reference. The picker matches on common MP3, WAV, M4A, AAC, Ogg, WebM, and FLAC names and MIME types, but a recognized extension or MIME is not a contract that the decoder will succeed. Codec variants, unusual channel layouts, mid-stream metadata blocks, and DRM-protected files all behave differently in Safari, Chrome, Firefox, and other browsers, and damaged, encrypted, incomplete, or mislabeled files produce a clear error rather than a silent zero-length buffer.
There is no codec library and no server fallback added in the background. If your file's codec is not decodable by the browser you are using at that moment, the file is rejected before it can affect the join. The same rule applies to encrypted or partially downloaded files: waiting until a transfer completes, or re-encoding the file to a known-good container such as WAV or MP3, prevents the kind of mid-decode failures that produce distorted first seconds or sudden silence.
Because decoding runs through one shared AudioContext, the working rate is set once and used for the entire selection. That shared context is closed after decoding, on replacement, and during cleanup, so a slow read or decode from one file cannot taint the next. A job identifier is attached to each decode, and the component's cleanup invalidates older jobs so a stale worker cannot overwrite a newer selection.
Channel, Sample-Rate, Duration, and Sample Budgets That Decide Whether the Join Runs
Audio Joiner does not silently trim, downmix, downsample, or drop a track to fit a limit. Every budget below is enforced, and a selection that violates any one is rejected with a specific message that names the limit that was exceeded. The limits apply to the combined selection, not per file, so adding a high-rate or multichannel track can push the sample budget past the duration limit.
| Limit | Maximum value |
|---|---|
| Files per selection | 2 to 10 |
| Each file size | 25 MiB (26,214,400 bytes) |
| Total input size | 100 MiB (104,857,600 bytes) |
| Total decoded duration | 30 minutes |
| Channels per track | 8 |
| Per-track sample rate | 192 kHz |
| Total channel samples | 30,000,000 |
The channel limit is the one most likely to surprise first-time users. Matching channels are retained in their decoded order and concatenated independently before WAV interleaving, so the left/right identity of each track survives the join intact. A mono file alongside a stereo file is rejected rather than silently remixed, duplicated across both channels, dropped, or averaged — re-encode your mono source as stereo (or vice versa) in a dedicated editor before you re-run the join.
The sample budget is cumulative across all channels. A stereo file at 48 kHz for ten minutes is about 57,600,000 channel samples, so two such selections can hit the 30,000,000 cap long before the duration limit. The duration displayed for the result is the joined decoded duration at the working rate, not the sum of original durations at original rates, because of the shared AudioContext resampling step described above.
Joining Audio Files the Local Browser Way
The full workflow matches the verified operating steps for Audio Joiner, and each button is mapped to the failure mode it prevents.
- Choose 2 to 10 audio files in the picker. The picker only accepts files within the per-file and total input limits shown next to the button, which prevents the budget rejections described in the previous section.
- Wait for browser decoding to finish for every selected file. Each entry then shows its decoded duration, channel count, and sample rate at the working rate of the shared AudioContext.
- Use Move up or Move down next to each entry until the visible list is in the exact sequence you want for the timeline. Reordering updates the decoded-buffer array and the displayed list together, and clears any older WAV so a stale result cannot claim a previous order.
- Select "Join in this order". The combined plan validates track count, sample rate, channel count, total frames, duration, channel-sample budget, and the frame offset where each track begins before any output is produced.
- Preview the resulting PCM16 WAV with the in-page player, then choose Download to save a freshly encoded RIFF/WAVE file with interleaved little-endian signed 16-bit PCM samples.
If any step fails — for example a channel-count mismatch, an over-budget sample count, or a codec the browser cannot decode — the selection is rejected with a specific message that names the limit that was exceeded, and no partial WAV is produced.
Check the Joined WAV Before You Delete the Sources
The output is a new static PCM representation of the browser-decoded samples. It does not preserve the original codec, bitrate, encoder settings, tags, album art, chapters, cue points, loop points, loudness fields, timestamps, or other container metadata, and the PCM16 WAV is uncompressed, which means it can be much larger than the selected MP3, AAC, Opus, Vorbis, or FLAC files you started with.
For a thorough verification workflow that includes header inspection, sample-level checks, and section-by-section listening, the dedicated guide on how to check the result after you join audio walks through the same shared encoder tests that confirm header bytes, the complete stereo sample sequence, and the channel identity preserved across the join. Float samples are clipped to the range from -1 through 1, with negative full scale mapped to -32768, positive full scale to 32767, and non-finite values written as silence — so a digital clipping master will round rather than wrap.
Keep the source files and confirm the downloaded duration, order, joins, channel playback, and file size before deleting any original. If you need a time range rather than a full track, fades, loudness matching, channel conversion, compressed output, metadata preservation, or sample-level repair, use a dedicated editor — Audio Joiner is for gap-free full-track concatenation only, and the verification step is what protects the work you did before the join.
If you're weighing options, What Can Go Wrong When You Use Reverse Audio covers this in detail.