Video Merger
Join several video clips into one file, in the order you choose. When the clips came off the same camera or recorder — and most of the time they did — nothing is decoded: the packets are copied end to end, so the join is lossless and finishes in seconds. FFmpeg runs in your tab; nothing is uploaded.
- Compares every clip against the first before anything starts, and joins them without re-encoding whenever they match
- Handles mixed resolutions, sideways phone clips, and clips that have no sound at all
Drop your video clips here
Choose several at once — they stay on your machine and are never uploaded
Reads MP4, MOV, MKV, WebM, AVI, WMV, FLV, MPEG-TS, MPG, 3GP, and most other formats FFmpeg understands.
No clips yet
Add two or more video files to begin. The engine is only downloaded once you do.
Overview
Most of the clips people want to join came out of one device, minutes apart, and are already identical in every way that counts. This tool checks that before it does anything, and when it holds it joins them without decoding a single frame.
- 01
Joins without re-encoding when it can
Chapters from a GoPro, segments from a dashcam, and parts of a screen recording that split at the four-gigabyte mark often share a codec, a frame size and an audio layout. When the comparison confirms that, their packets can move into one track untouched. That finishes in seconds and the picture and sound are not re-encoded.
- 02
Shows you exactly where the clips disagree
Every clip is compared against the first, property by property: codec, frame size, rotation, pixel format, frame rate, and the audio parameters. Anything that differs is named, with both values side by side and which clip it belongs to. That is the difference between "this will take an hour" and knowing that one clip out of nine is 720p.
- 03
Fixes the silent-clip trap
Joining a clip that has sound to one that does not is where most tools quietly fail: the segment loses its place and everything after it slides forward, or the audio disappears entirely. Silence is generated for exactly the length of each mute clip instead, so the sound stays where it belongs all the way to the end.
- 04
Checks the result before you download it
A join can exit successfully and still have dropped a clip's packets — a file that plays, and simply stops early. Nobody notices until it has already been sent somewhere. The finished file is read back and its length compared against the clips that went in, so a short result is reported rather than handed over.
- 05
Order you can actually control
Drag a clip to move it, or use the arrows. Sort by filename the way a person reads it, so clip2 comes before clip10 and GX010042 before GX020042, or sort by the time the file was written — which is what you want for camera chapters that number themselves unhelpfully. A thumbnail on every row means you can see the order rather than infer it.
- 06
Local processing, with no upload
FFmpeg is compiled to WebAssembly and runs in the tab. Nothing is uploaded, queued, watermarked, or tied to an account, and no clip is limited to a preview length. Browser memory sets a practical ceiling on the total size, while interview footage, client recordings, and body-cam files stay on your machine.
How to use
From a folder of clips to one file, in four steps.
- 01
Add your video files — drop several at once, or use the picker. The engine starts downloading at this point; it is about 31 MB and only happens once. Each clip is then read for its codec, frame size, frame rate, and audio.
- 02
Put them in the order you want. Drag a row, use the arrows, or sort by filename or by date — camera chapters usually fall straight into place with one click on By name.
- 03
Read the comparison on the right. It says whether the clips can be joined without re-encoding, and if not, exactly which property differs and on which clip. Leave Method on Auto unless you need a specific frame size or format on the way out.
- 04
Press Merge. The joined file is checked against the total length of the clips, then appears on the right, ready to play before you download it.
Details
The details that decide whether the file you get back is the one you needed.
- Stream-copy joining whenever the clips match, with no decoding step at all and no quality lost
- A clip-by-clip comparison of codec, frame size, rotation, pixel format, codec profile, pixel aspect, frame rate, and the audio parameters
- Frame rate marked apart from the rest: a difference alone does not require re-encoding
- Up to 20 clips per join, reordered by dragging a row, by the up and down buttons, or by sorting on filename or file date
- Natural filename sorting, so clip2 comes before clip10 and camera chapters land in shooting order
- A thumbnail on each clip, drawn locally by the browser, so the running order is something you can see
- Generated silence for clips that have no audio, sized to each clip so nothing after them drifts out of sync
- Automatic normalising of mismatched clips to one frame, one frame rate, one pixel format, and one audio layout
- Fit inside with black, white, or a colour of your choosing; fill and crop; or stretch, for clips whose shape differs from the output frame
- Four output containers — MP4, MKV, WebM, and MOV — defaulting to the one your clips already use, so a matching set can be copied
- A length check on the finished file against the clips that went into it, so a join that stopped early is reported rather than handed over
- Everything runs in the browser tab — no upload, no queue, no account, no watermark, and no length limit per clip
Use cases
The situations that send people looking for a way to join videos.
-
GoPro or action-camera chapters
Action cameras split long recordings into numbered files — GX010042, GX020042, and so on — because of a filesystem limit, not because the footage changed. They are byte-compatible with each other, so sorting by name and pressing Merge puts them back together in seconds without touching a frame.
-
Dashcam footage of one journey
Dashcams write a new file every one, three, or five minutes, and an hour of driving becomes a folder of twenty. Joining them into one file before you review or send an incident makes the sequence readable, and sorting by date puts them in the order they were recorded even when the names are unhelpful.
-
A screen recording that split at 4 GB
Long captures hit the FAT32 or camera limit and continue in a second file, usually mid-sentence. Both halves came from the same encoder, so joining them is a copy — and the seam falls exactly where the split did, with no re-encoded section around it.
-
Clips from a phone that stopped every few minutes
Recordings taken in one session share every setting, so they join without re-encoding even when they are from different days. Clips shot in portrait and landscape are the case where that stops being true, and the comparison says so before you spend the time.
-
An intro or outro card on a video
A title card exported from a slide or a design tool is rarely the same shape or frame rate as the footage it introduces, and it usually has no sound. Both are handled: the card is fitted to the video's frame, and silence is generated for its length so the audio does not slide forward by the length of the card.
-
Interview or lecture recordings resumed after a break
A session recorded in three parts because the recorder was stopped for coffee is three files of the same thing. Joining them locally matters here beyond convenience — interview footage, medical recordings, and legal material have no business on someone else's server, and you can confirm nothing leaves the tab from the network panel.
-
A compilation from several different sources
Clips downloaded or exported from different places rarely agree about anything, and this is the case that genuinely needs a re-encode. The comparison tells you that up front rather than after an hour, and the output frame, frame rate, and fit are yours to choose rather than guessed at.
-
Rebuilding a video after cutting pieces out
Trimming a recording into keepers and then joining the keepers back together is the usual way to remove a middle section without an editor. Cuts made losslessly stay losslessly joinable, so the round trip costs nothing at all.
See also
Joining clips whole is one half of rebuilding a recording; cutting the parts you do not want out of one first is the other, and that belongs to Video Trimmer. When clips refuse to join because one of them is in an awkward format, putting it into the same format as the rest beforehand often turns a re-encode back into a copy, which is what Video Converter is for. And when one clip is simply the wrong size or shape for the others, matching it to them before joining is a job for Video Resizer & Cropper.
Why joining videos is usually free, and sometimes not
A joined video is not a new recording of the old ones. It is one track that has to describe every clip at once — and that single constraint explains why some joins take seconds and others take an hour.
-
A track carries one description
Inside an MP4, a video track declares one codec, one frame size, one pixel format, and one rotation, once, for everything in it. Packets that were encoded against a different description cannot simply be filed under this one. That is the whole rule, and everything below follows from it.
-
Which is why matching clips are free
Two chapters from the same camera were encoded by the same encoder with the same settings, so one description fits both. Their compressed packets are moved into a single track without ever being decoded. No quality is lost because nothing is compressed again, and the time it takes is the time it takes to write the bytes.
-
And why one odd clip costs everything
If a single clip is 720p among 1080p clips, no one frame size describes them all. The only way out is to decode every clip, scale them to a common frame, and encode the lot as one new video. The cost is not proportional to how wrong the odd clip is — one mismatch re-encodes the whole set.
-
Frame rate is the exception
MP4 and Matroska store a duration for each frame rather than a single clock for the track, so a 30 fps clip and a 60 fps clip can often sit in one track with their own timing. A frame-rate difference alone does not make this tool re-encode, which is why the comparison marks it apart; the finished length is still checked.
-
Rotation is a tag, not a picture
A phone recording held sideways stores a normal landscape frame plus a note telling the player to turn it. The note belongs to the track, not to the clip, so joining an upright recording to a sideways one applies one note to both and half the result plays on its side. Two clips can report the same frame size and still differ this way — which is why rotation is compared separately.
-
A container is not an encoder
Changing the output from MP4 to MKV does not re-encode anything; it writes the same packets into a different wrapper. That is worth knowing when a join refuses to copy: MKV accepts almost any stream, so it will often take a copy that MP4 rejects, and the picture inside is unchanged either way.
Best practices
Habits that get one good file on the first run.
- Read the comparison before you press anything — it takes a second and tells you whether this is a ten-second job or a long one
- Leave Method on Auto, and change it only when a player rejects the joined file or you specifically need a different frame size or codec
- Leave the output format alone when the comparison says the clips match, because it already defaults to the container your clips are in, which is the one that can take a copy
- Sort by name for camera and dashcam chapters, and by date when the filenames are timestamps in an order nobody can read
- Check the first clip when the frame or the audio settings look wrong: everything is compared against it, and it is what a copied join inherits
- Fall back to MKV if a copy fails — it accepts almost any stream, so it usually turns a refused copy back into one
- Join from the originals rather than from earlier joins or conversions, since every re-encode is applied on top of the last one
- Do long or high-resolution joins in a desktop browser, since every clip is held in memory at once and a phone gives a tab far less of it
Limitations
What this tool deliberately does not do, and where it will struggle.
- It joins clips end to end and nothing else. There are no transitions, crossfades, or dissolves between clips, and no titles, music bed, or overlay — those are editing jobs rather than joining ones.
- Clips are joined whole. Trimming a few seconds off the front of one first is a separate step, with a separate tool linked below.
- A stream copy is lossless, but any re-encode is not. H.264, VP8, and the rest are lossy formats, so a re-encoded join is a generation further from the originals however high the quality setting.
- One video track and one audio track come across from each clip. Extra language tracks, subtitle streams, and chapters are dropped, which matters most for MKV downloads that carry several of each.
- Clips with different surround layouts are mixed down to stereo, because one track can carry only one layout and upmixing stereo to surround would invent channels that were never recorded.
- HEVC clips are joined by copying when they match, and re-encoded to H.264 when they do not, because the engine reads HEVC but cannot write it. The output of a mismatched HEVC set is therefore H.264 rather than HEVC.
- AV1 is the one codec that cannot be normalised at all. Matching AV1 clips join by copying, since that never decodes anything, but a set that disagrees would have to be decoded — and this build's AV1 decoder needs hardware WebAssembly cannot reach. That case is blocked rather than attempted.
- Twenty clips is the ceiling per join, and every one of them is held in memory alongside the result. WebAssembly is 32-bit, so a combined size beyond roughly a quarter of a gigabyte becomes unreliable regardless of the count.
- Re-encoding runs on a single thread in WebAssembly, so it is slower than the same job in a desktop copy of FFmpeg. Copying is unaffected — that path barely uses the processor at all.
- The engine is about 31 MB on first use. It is cached afterwards, but the first join in a fresh browser profile carries that download.
- MKV output cannot be previewed here because no browser plays it, though it is produced correctly. Download it and open it in a player.
- Thumbnails are drawn by the browser's own decoder, so a clip in something it cannot play — MKV, AVI, WMV — shows a placeholder instead of a still. The clip itself is read, compared, and joined exactly as any other.
- Silence generated for a mute clip is sized from the duration the file declares, which is accurate to a hundredth of a second. A set with many silent clips can therefore drift by a few hundredths overall.
FAQ
Questions that come up when several clips have to become one.
How do I merge MP4 files without losing quality?
Add the clips, leave Method on Auto, and check that the comparison says they match. When it does, the clips are joined by copying their compressed packets into one track — nothing is decoded, so there is no quality to lose and no setting that could change that. This is the normal outcome for clips from one camera or recorder, and it takes seconds rather than minutes. Quality is only ever lost when the comparison finds a genuine difference and the clips have to be re-encoded to a common set of settings.
How do I combine GoPro or dashcam files into one video?
Drop the whole folder in at once, press By name, and merge. Action cameras and dashcams split a recording into numbered files because of a filesystem limit rather than because anything about the footage changed, so every part shares a codec, a frame size, and an audio layout. That is exactly the case a stream copy is for. Natural sorting puts GX010042 before GX020042 and clip2 before clip10, so the running order is usually correct after one click.
Are my videos uploaded anywhere?
No. The engine is FFmpeg compiled to WebAssembly and it runs inside your browser tab. Each clip is read from disk into the tab's memory and the joined file is written back out as a download. Nothing about any of them crosses the network, which you can confirm by watching the network panel while a merge runs.
Can I merge videos with different resolutions?
Yes, but not for free. One video track can declare only one frame size, so mixed resolutions mean every clip is decoded, scaled to a common frame, and encoded again. You choose the frame — the largest clip's, the first clip's, or a preset — and how clips of a different shape are fitted into it: padded with bars, cropped to fill, or stretched. The comparison tells you which clip differs before you commit to the time.
Why does my merged video only play the first clip?
That is what a stream copy looks like when the clips were not as compatible as the tool doing the joining assumed — the first clip's description is written into the track, later packets do not fit it, and the player stops or freezes. It is the classic failure of joining files with a command copied off the internet. This tool compares the clips first, and reads the finished file back to check it is as long as the clips that went into it, so a short join is reported instead of handed over. If you see that warning, switch Method to Re-encode.
Can I change the order the clips play in?
Yes. The list plays top to bottom, and you can drag any row to a new position, nudge it with the arrow buttons, or sort the whole list by filename or by the date each file was written. Reverse flips the lot. Each row carries a thumbnail so you can see what is where rather than working it out from the names, and the order can be changed right up until you press Merge.
What happens if one of my clips has no sound?
Silence is generated for exactly that clip's length and joined in its place. This matters more than it sounds: without it, the clip contributes no audio at all and the sound of every clip after it starts early, so a title card at the front of a video puts the whole soundtrack out of sync. Mixing clips with and without audio also means the join has to be re-encoded, because the presence of an audio track is part of what a single track declares once.
Can I merge MOV and MP4 files together?
Usually yes, and often without re-encoding. MOV and MP4 are different wrappers around the same H.264 and AAC streams, so what matters is not the extension but whether the streams inside agree — the same frame size, pixel format, and audio parameters. The comparison checks that directly and ignores the container. Pick MP4 or MOV as the output and the clips are copied into it if they match.
How many videos can I merge, and how large can they be?
Up to twenty clips in one join. The real limit is memory rather than count: every clip is held in the tab alongside the finished file, and WebAssembly is 32-bit, so a combined size beyond roughly a quarter of a gigabyte becomes unreliable. A copy is quick almost regardless of total length, because nothing is decoded. A re-encode scales with duration and resolution and runs on a single thread, so a long, high-resolution set takes real time.
Can I add a transition or crossfade between clips?
No. Clips are joined end to end with a hard cut at each seam. Adding a crossfade would mean decoding and re-encoding every clip even when they match perfectly, which would throw away the thing that makes this tool worth using. If you need transitions, a video editor is the right tool; if you want the clips joined, this does that without cost.
Why was merging instant last time and slow now?
Because they were different jobs. A set of matching clips is copied, which is mostly a matter of writing bytes. One clip that differs — a different resolution, a sideways phone recording, a clip with no audio among clips that have it — means the whole set has to be decoded, normalised, and encoded as one video. The comparison panel names the property and the clip responsible, so you can often fix the input instead of paying for the re-encode.
Which output format should I choose?
Leave it as it is, in most cases: the output defaults to the container your first clip is already in, which is the one guaranteed to accept these streams without re-encoding. Choose MP4 explicitly when the result has to be shared, uploaded, or played on anything; MKV when a copy is being refused, because it accepts almost any stream; MOV when the destination is Final Cut or QuickTime; and WebM only when you specifically need an open format on a web page, since it always costs a full re-encode.
Related tools
More local, browser-only tools for working with video.