What QuickTime’s MOV container holds that MP4 cannot
MOV and MP4 are closer relatives than their reputations suggest. MP4 is standardised as the ISO base media file format, and that standard was derived directly from Apple’s QuickTime File Format in the late 1990s. Both files are trees of nested boxes, both put a moov box in charge of describing the tracks, and both can hold the same H.264 video and AAC audio. That shared ancestry is why renaming a .mov to .mp4 occasionally seems to work.
Occasionally is the problem. QuickTime kept a much wider door open. A MOV can carry ProRes, Apple Animation with a real alpha channel, Motion JPEG, uncompressed PCM audio, timecode tracks and edit lists that MP4 either forbids or that no ordinary player expects to find there. A screen recording made by macOS routinely contains PCM audio; a clip exported from Final Cut is often ProRes. Rename either of those and the file becomes something with an MP4 extension that no MP4 decoder will touch.
That is the reasoning behind converting rather than rewrapping here. The sibling MKV to MP4 converter tries a lossless stream copy first and only re-encodes when the copy fails, which suits MKV because the codecs inside are usually MP4-legal already. This tool re-encodes unconditionally, because for MOV the odds of hitting something a rewrap cannot handle are high, and because the most common reason for converting is not the container at all.
HEVC is usually the real reason the file will not play
Since iOS 11 an iPhone set to “High Efficiency” records HEVC, also called H.265, inside that MOV wrapper. HEVC does its job well: roughly half the bitrate of H.264 for comparable quality, which is how a phone fits 4K video in a reasonable amount of storage. It is also patent-encumbered in a way H.264 is not, so support is patchy in exactly the places you need it. Windows asks for a codec extension, older Android builds decline, and plenty of smart TVs, projectors, car head units and web upload forms only understand H.264.
Nothing about the container fixes that. Move HEVC into an MP4 and it is still HEVC, and the Windows PC still shrugs. Converting the video stream to H.264 is what actually solves the problem, which is why that happens here whatever the input codec turns out to be. H.264 in MP4 with AAC audio remains the widest-support combination in existence, and +faststart is enabled so the moov box is rewritten to the front of the file and playback can begin before the download finishes.
CRF 18, 23 and 28
The quality picker maps to a single libx264 argument, the constant rate factor. High quality sets CRF 18, Balanced sets 23, and Smaller file sets 28. Nothing else moves between them.
CRF is a quality target rather than a bitrate target, so the encoder spends whatever bits each scene needs and a static talking-head clip ends up far smaller than the same length of handheld motion. A few points of CRF changes the output size substantially, which is what makes these three options meaningfully far apart rather than three shades of the same thing. Balanced is libx264’s own default and the right pick almost always. Reach for High quality when the file is a source for further editing, since compression artefacts compound each time footage is re-encoded.
The encoder runs at the fast preset in all three cases. A slower preset would find a slightly smaller file at the same CRF, but presets like slow or veryslow are simply not practical here, for a reason worth its own section. Audio is re-encoded to AAC at 128 kbps every time, which is a large saving on a screen recording that arrived as PCM and a fair trade on camera audio.
One CPU core, inside a browser tab
The engine is FFmpeg compiled to WebAssembly, and it is the single-threaded build on purpose. The multithreaded core requires the COOP and COEP response headers, and those headers break the ad iframes that pay for this site, so the threaded version is off the table permanently. Practically, that means one CPU core is doing work your desktop FFmpeg would spread over all of them. A short 1080p clip finishes quickly; a long 4K recording takes real time, and it is fine to leave the tab in the background while it works.
The upside is the one that matters for personal footage. Your video is never uploaded, so there is no 100 MB free tier, no queue, and no copy of your family clips sitting in someone’s temporary storage. The core itself is fetched once from a CDN on the first conversion, and after that your browser cache handles it.
Steps, and reading the result
- Drop a
.movfile in, an iPhone recording, a QuickTime screen capture, an exported edit. - Leave quality on Balanced unless one of the cases above applies.
- Convert, then download. The output keeps the original filename with an
.mp4extension.
Two things sometimes look wrong afterwards. If the video plays on its side, the rotation was recorded as container metadata and Rotate Video sets it explicitly. If HDR footage from a recent iPhone looks flat or unexpectedly dark, that is the missing tone mapping: no HDR to SDR conversion is applied, so the wide-gamut source is interpreted as ordinary video. Keep the original for anything where that matters, and convert a copy for sharing.