Convert a video between MP4, WebM, OGG, MOV, AVI and MKV, each naming the codecs it really writes and each producing a file that actually plays. One quality dial normalised into four different encoder scales.
Initializing in your browser…
Reads your file's real frame rate with FFmpeg, then converts to 24, 30, 60, 120 fps or any custom rate. Frame duplication, blending, or true motion interpolation, with CRF quality control and a verified output readout.
Cut a rectangle out of every frame, with the selection drawn over the picture itself and held in source pixels. Numeric entry, shape and platform presets, and the even-number rounding H.264 forces printed before it is applied rather than after.
Cut a clip out of a video, choosing whether the cut lands on the exact frame (re-encodes to MP4) or leaves the streams untouched (instant and lossless, but only at a keyframe). The result says which ran and reads the real length back off the file.
The same 2 second clip converted into all six offered containers, one after another.
Input
counter.mp4 640x480 H.264 + AAC
Output
MP4 and MOV and MKV: H.264 + AAC. WebM: VP8 + Opus. OGG: Theora + Vorbis. AVI: MPEG-4 + MP3
Three of those six produced nothing at all before this pass: WebM crashed the WebAssembly core and OGG and AVI stopped silently, and the three that worked were the three whose command line happened to carry a thread count. WebM is VP8 rather than the VP9 the page used to promise, because the VP9 encoder in this build cannot finish at all, and OGG really is Theora now rather than the VP8 the code was quietly asking for.
A file extension is a container, not a codec. What people call "an MP4" is an MP4 container holding an H.264 video stream and an AAC audio stream, and the two choices are independent: an MKV can hold the same H.264 and AAC, a WebM holds VP8 or VP9 with Opus, and an Ogg holds Theora with Vorbis. Converting between formats means choosing the container and accepting a codec pairing that container can legally hold. This page now names the pairing it will really write, for one reason: it used to name a different one. The OGG entry said "Theora + Vorbis" while the code asked the encoder for VP8, which is not a combination Ogg is normally used for. There is one list now, the encoder reads it, and the page prints from it. Three of the six formats also produced nothing at all. Measured on 2026-09-07 in the shipped build: MP4, MOV and MKV converted; WebM died with "memory access out of bounds"; OGG and AVI stopped silently after printing their stream mapping. The three that worked were the three whose command line happened to carry a thread count, and the three that failed were the three that did not. Worse, a crash leaves the WebAssembly instance unusable, so the next conversion failed too whatever format it was.
Convert to MP4. H.264 with AAC is decoded in hardware by every browser, phone and television made in the last decade.
WebM with VP8 and Opus is royalty free and plays natively in every current browser.
AVI with MPEG-4 and MP3 is a 1992 container with a 1998 codec. Expect roughly twice the size of H.264 at the same quality, which is the price of that compatibility.
MKV holds almost any codec and is the usual choice for a personal archive. Browsers will not play it, so keep an MP4 if the file also has to be shared.
The whole transcode happens in your browser through ffmpeg compiled to WebAssembly, and the file is never uploaded. Transcoding decodes the source to raw frames and encodes them again, so any lossy to lossy conversion loses a generation; converting once is fine and round-tripping a file through several formats is visibly worse after a few cycles.
WebM here is VP8 rather than VP9, and that is a measurement rather than a preference. The VP9 encoder in this WebAssembly build cannot complete: with four threads it failed with "memory access out of bounds", with one thread and the realtime deadline it failed the same way, and with one thread and libvpx's default effort it raised "operation does not support unaligned accesses" and had still not finished a two second clip after fifteen minutes. VP8 with Opus finished the same clip in half a second, is an entirely ordinary WebM, and is played natively by every current browser. A format that produces nothing is not a format.
The quality control is one dial across four different scales, which is worth knowing about. H.264 uses CRF from 0 to 51 where lower is better and 23 is the default. VP8 uses CRF from 4 to 63, a different length of scale, and needs a bitrate ceiling alongside it. MPEG-4 Part 2 has no CRF at all: it has a quantiser from 1 to 31, again lower being better. And Theora runs 0 to 10 where HIGHER is better, the opposite direction from all three of the others. The dial is normalised into each encoder's own units and the page prints the flag and the number it landed on, so "Balanced" is CRF 23 for H.264, CRF 20 for VP8, q:v 5 for MPEG-4 and q:v 7 for Theora.
Every output but Ogg is passed through a filter that rounds both frame sides down to an even number, because 4:2:0 chroma cannot store an odd one; Theora can, so it is left alone. Nothing downloads automatically: when the conversion finishes the page shows the container, the codecs, the file size, how long it took, a player for the result and the exact ffmpeg command line.
Because the VP9 encoder in this browser build does not work. Three different flag combinations were tried and all three failed, two with a WebAssembly memory fault and one with an alignment fault after fifteen minutes without finishing a two second clip. VP8 with Opus finished the same clip in half a second and is a perfectly standard WebM that every current browser plays. The page names VP8 rather than promising VP9 and delivering nothing.
Yes, once. The source is decoded and encoded again, so a lossy to lossy conversion loses a generation. One conversion is usually invisible at a sensible quality setting; converting the same file back and forth several times is not.
It depends on the container, which is why the page prints the number. The four encoders here use four different scales: H.264 CRF 0 to 51 lower is better, VP8 CRF 4 to 63 lower is better, MPEG-4 quantiser 1 to 31 lower is better, and Theora 0 to 10 where higher is better. The dial is translated into each one and the flag and value are shown.
Not here. Remuxing is possible in principle when the target container can legally hold the source codecs, but this tool always re-encodes so that the result is guaranteed to be a normal file for its container. The Video Trimmer has a stream copy mode if you need one.
Because Theora is a 2004 codec and H.264 is not. At comparable quality Theora needs considerably more bitrate. Ogg exists here for old free-software players; there is rarely a reason to choose it otherwise.
Video is decoded and re-encoded on your own device. Large files never leave your machine.