Convert MOV to MP4 with FFmpeg (no re-encoding)
Convert .mov to .mp4 for web delivery without re-encoding the video stream. Stream-copy approach, faststart for web playback, and the audio codec compatibility table.
When to use this
You convert MOV to MP4 when delivering video for web playback or sharing across platforms — most browsers and players handle MP4 universally, while MOV (QuickTime) has narrower native support outside Apple's ecosystem. The container is just metadata; if the codecs inside are compatible (H.264 + AAC), no re-encoding is needed and the conversion is near-instant. The only common case requiring re-encoding: ProRes or DNxHR video inside MOV, which browsers don't support.
Command variants
ffmpeg -i input.mov \
-c copy \
-movflags +faststart \
output.mp4Use this when the MOV contains H.264 + AAC (the common case). Near-instant conversion — just remuxing.
ffmpeg -i input.mov \
-c:v libx264 -preset medium -crf 21 \
-c:a aac -b:a 192k \
-movflags +faststart \
output.mp4Use this when input is ProRes / DNxHR / ALAC. Slower but produces web-compatible MP4.
ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name input.movCheck the video codec before deciding stream-copy vs re-encode. Returns "h264" → stream-copy works. Returns "prores" / "dnxhr" → must re-encode.
What each parameter does
-c copyStream-copy ALL streams (video + audio) without re-encoding. Container changes but bytes inside don't. Near-instant.
-movflags +faststartMove the moov atom (file metadata) to the start of the file so web browsers can begin playback before downloading the entire file. Critical for web delivery.
libx264 / aacStandard web-compatible codecs. Use these when input codecs aren't web-compatible.
What this outputs
A .mp4 file. Stream-copy produces a file with identical video/audio bytes to the source — same size, same quality, just rewrapped. Re-encoded output may be slightly smaller or larger depending on the source codec's efficiency.
Pitfalls
- ProRes and DNxHR (common in production MOV files) are not browser-compatible. Always probe first; stream-copy will succeed but the resulting MP4 won't play in browsers.
- ALAC audio inside MOV won't survive in MP4 — convert to AAC during the same pass.
- Without +faststart, web players must download the entire file before starting playback. The flag adds a final pass to relocate the moov atom (a few seconds for large files) but the playback experience is dramatically better.
- MOV files can contain reference movies (pointers to external files). Stream-copy will preserve the references but they'll break if the external files aren't accessible. Always work from self-contained MOV files.
- Some MOV files use timecode tracks that confuse MP4 players. Strip with -map 0:v -map 0:a if needed.
At production scale
Stream-copy MOV→MP4 is essentially free at scale (network I/O bound, not compute). Re-encoded conversion is at libx264 medium-preset speeds, ~2-5× real-time on modern CPU. A petabyte-scale archive migration from MOV to MP4 (covered in our archive migration architecture) typically uses stream-copy for the codec-compatible portion (~70-80% of files) and re-encodes the rest in batched workflows.
MpegFlow detects codec-compatibility automatically and routes stream-copy jobs to a dedicated worker pool that's I/O-optimized rather than compute-optimized. Saves significant cost on large library migrations where most files don't need re-encoding.
- FFmpeg
- format-conversion
- mp4
- mov
- Transcoding
- Archive migration