Skip to content

Merge Video Files Online — Free, No Re-Encode

Join clips that share a codec, frame size and container into one file, copied across byte for byte.

ENGINEFFMPEG WASM
ACCEPTSMP4 MOV MKV WEBM
MAX SIZE1536 MB
UPLOADNEVER
01Drop two or more clips into the drop zone, or click to browse — each one is read as it lands.
02Use Move up and Move down to set the join order. If a clip differs from the first, the table names the file and the property and the join stays off.
03Click Join clips — the button counts what is in the queue — then Download to save the single joined file.

About Merge Video

This tool joins clips end to end and never re-encodes anything, which means it is fast and lossless and also means it cannot join everything. The clips are copied into one file exactly as they are, so they have to share a video codec, a frame size, a pixel format, an audio codec, sample rate and channel count — or all be silent — a container the copy can be written into, and the timing base that container counts in. Two MP4s that agree on everything else and count time differently were measured on this build to produce a join whose picture runs out of step with its own sound, so that is checked too. Anything that does not match is refused, by file name and by the property that differs, before a single byte is written. That refusal is the point of the page rather than an error path, and there is a measurement behind it. FFmpeg's concat demuxer, handed clips that do not match, does not fail: it reports success and writes a file with clips missing. Measured on the build this page runs, an MP4 and an MKV holding identical H.264 video at the same size and pixel format with identical AAC audio produced exit code zero and a file containing only the first clip. Nothing in that pair differs except the container and the timing base it counts in — 1/57600 against 1/1000, measured side by side — which is why both are checked as well as everything inside them. Two independent guards enforce this. Every clip is read as it lands and compared against the first, so the mismatch table appears while you are still building the queue; and the join itself re-checks for the same reasons and then measures the finished file against the total length of its parts, failing if it comes up short or runs long. There is deliberately no fall back to re-encoding. A clip in the wrong container or codec can usually be rewrapped losslessly by the Video to MP4 tool, though the tool doing the rewrap picks its own timing base for the file it writes — measured here, an MKV rewrapped to MP4 came out counting in 1/16000 where the untouched MP4 counted in 1/57600, so the pair can come back and be refused on that row instead; a clip at a different frame size has to be re-encoded to match, which nothing here does in one step. Naming what differs and pointing at the fix is a better answer than a re-encode you did not ask for.

Questions

Why won't it join my clips?

Because they differ in something a lossless join cannot bridge, and the table names the file and the property. Clips have to share a video codec, frame size, pixel format and audio codec, sample rate and channel count — or all be silent — as well as a container and the timing base that container counts in. Nothing here re-encodes to make them match.

Two files are both H.264 MP4-style video. Why does the container matter?

Because it was measured to matter. An MP4 and an MKV holding identical H.264 video at the same size and pixel format with identical AAC audio were joined on this build and produced exit code zero and a file containing only the first clip. Nothing differed except the container and the timing base it counts in — 1/57600 against 1/1000 — so both are checked too.

What happens if I join clips that do not match anyway?

You cannot, and that is deliberate. FFmpeg's concat demuxer, handed mismatched clips, reports success and writes a file with clips missing rather than failing. Two guards stop that reaching you: every clip is compared as it lands, and the join itself measures the finished file against the total length of its parts and fails if it comes up short or runs long.

How do I make mismatched clips joinable?

A clip in the wrong container or codec can usually be rewrapped losslessly by the Video to MP4 tool, but the rewrap writes its own timing base — measured here, an MKV rewrapped to MP4 came out counting in 1/16000 against an untouched MP4's 1/57600 — so the pair can come back refused on that row instead. Clips exported by the same camera, app or settings are the ones that join for nothing. A clip at a different frame size has to be re-encoded to match the others, which nothing here does in one step — that one needs an editor.

Does joining re-encode or lose quality?

Never. The clips are copied into one file exactly as they are, which is why it is near-instant on clips an editor would spend minutes re-rendering. Use the arrows on each row to set the order — they join end to end, top to bottom.

Is my file uploaded to a server?

No. Transmute processes everything locally in your browser using JavaScript and WebAssembly. Your files never leave your device — there is no server, no upload, no cloud processing.

Related