QuickTime .mov files — exported from Final Cut Pro, screen recorders, DSLRs, and macOS — are not always accepted by editors, web players, or messaging apps that expect .mp4. The good news: MOV and MP4 are close cousins, both built on the ISO base media file format. In many cases FFmpeg can convert MOV to MP4 losslessly in seconds, simply by swapping the container. This guide explains exactly when that works, when you need to re-encode, and how to avoid the common gotchas. Estimated time: 5 minutes.

Tested with: FFmpeg 8.1

This guide is for general QuickTime MOV files. If your file came straight off an iPhone (often HEVC video with HDR or rotation metadata), the dedicated iPhone MOV to MP4 guide covers those cases in more depth.


What You’ll Learn

  1. Why MOV and MP4 are nearly the same format
  2. The fastest lossless conversion (-c copy)
  3. When stream copy works vs when you must re-encode
  4. The re-encode command for ProRes / PCM audio
  5. Why -movflags +faststart matters
  6. How to check what codecs are inside your MOV
  7. Troubleshooting and FAQ

1. MOV and MP4 Are Almost the Same Thing

Both .mov and .mp4 are containers — wrappers that hold video, audio, and metadata streams. They share the same underlying structure (atoms/boxes from the ISO base media file format). The difference is mostly the file extension and a few QuickTime-specific features.

.mov (QuickTime).mp4 (MPEG-4 Part 14)
Base formatISO BMFF (QuickTime)ISO BMFF
Typical videoH.264, HEVC, ProResH.264, HEVC, AV1
Typical audioAAC, PCM, ALACAAC
Best supportApple ecosystemUniversal

The practical takeaway: if the streams inside your MOV are already MP4-compatible (H.264 or HEVC video + AAC audio), you do not need to re-encode. You just relabel the container.


2. The Fastest Lossless Conversion

If your MOV holds H.264/HEVC video and AAC audio, this is the whole command:

ffmpeg -i input.mov -c copy -movflags +faststart output.mp4
  • -c copy … copies every stream as-is, no re-encoding. Finishes in seconds, zero quality loss.
  • -movflags +faststart … moves the moov atom to the front so the file starts playing before it finishes downloading.

Because the bitstream is copied verbatim, the output is bit-for-bit identical in picture and sound to the source. The only thing that changed is the container label.


3. When Copy Works vs When You Must Re-encode

Stream copy only succeeds when each stream’s codec is allowed inside an MP4 container. Use this table as a quick decision guide:

Codec in your MOVCopy to MP4?What to do
H.264 (AVC) videoYes-c copy
HEVC (H.265) videoYes (add -tag:v hvc1)-c:v copy -tag:v hvc1
ProRes videoNoRe-encode video to H.264/HEVC
AAC audioYes-c copy
ALAC (Apple Lossless)Yes (-c copy)Copy works, but re-encode to AAC for broad web/player support
PCM (uncompressed)NoRe-encode audio to AAC

If FFmpeg refuses to copy a stream, it usually prints something like Could not find tag for codec ... in stream. That is your signal to re-encode that stream.


4. The Re-encode Command (ProRes / PCM)

When the codecs are not MP4-friendly — ProRes video, or PCM audio common in pro and screen-recording workflows — re-encode to H.264 + AAC. (ALAC is valid in MP4/M4A and can be -c copy’d, but re-encoding it to AAC is recommended for general player and web compatibility.)

ffmpeg -i input.mov -c:v libx264 -crf 20 -c:a aac output.mp4
  • -c:v libx264 … encode video to H.264, the most widely supported MP4 codec.
  • -crf 20 … quality target. Lower is higher quality and larger files; 18–23 is the usual range for visually clean output.
  • -c:a aac … encode audio to AAC.

Re-encoding is lossy (the video is decoded and compressed again) and slower than copy, but it produces a file that plays everywhere. Add -movflags +faststart if the result is for web playback:

ffmpeg -i input.mov -c:v libx264 -crf 20 -c:a aac -movflags +faststart output.mp4

Re-encode only what needs it

If only the audio is incompatible (ProRes-free MOV with PCM audio), keep the video copy and re-encode just the audio — much faster than a full re-encode:

ffmpeg -i input.mov -c:v copy -c:a aac -b:a 192k -movflags +faststart output.mp4

5. Why faststart Matters

By default, FFmpeg writes the moov atom (the index that tells a player where each frame lives) at the end of the file. For local playback that is fine. But for web/streaming, playback is delayed: the player has to locate the moov atom before it can begin, which may take extra HTTP range requests, and depending on the server and player it may not start until much or all of the file has been fetched.

-movflags +faststart does a second pass at the end of muxing to relocate the moov atom to the front, so playback can start during progressive download. Always add it for files destined for the web. For a deeper look, see the moov atom guide.


6. Inspecting What’s Inside Your MOV

Before deciding copy vs re-encode, check the actual codecs with ffprobe:

ffprobe -v error -show_entries stream=index,codec_type,codec_name -of default=noprint_wrappers=1 input.mov

This lists each stream’s type (video/audio) and codec name. If you see h264 + aac, copy will work. alac can also be copied into MP4/M4A, though re-encoding it to AAC is recommended for the widest compatibility. If you see prores or pcm_s16le, plan to re-encode that stream.


7. Troubleshooting

Error 1: Could not find tag for codec prores in stream

Cause: ProRes cannot live in an MP4 container. Fix: Re-encode the video: -c:v libx264 -crf 20.

Error 2: HEVC MOV converts but won’t play on Apple devices

Cause: FFmpeg may tag HEVC as hev1; Apple players expect hvc1. Fix: Add the tag while copying:

ffmpeg -i input.mov -c:v copy -c:a copy -tag:v hvc1 -movflags +faststart output.mp4

Error 3: No audio in the output MP4

Cause: The source uses PCM, which MP4 doesn’t accept, so the stream was dropped during copy. Fix: Re-encode audio: -c:a aac -b:a 192k.

Error 4: Video stutters or buffers on a website

Cause: The moov atom is at the end of the file. Fix: Re-run with -movflags +faststart (a copy-only pass is enough if the codecs are already compatible).


FAQ

Q1. Does converting MOV to MP4 reduce quality? A. Not when you use -c copy — the streams are copied bit-for-bit. Quality only changes if you re-encode (Section 4).

Q2. How do I know whether I can copy or must re-encode? A. Run the ffprobe command in Section 6. H.264/HEVC video with AAC (or ALAC) audio can be copied; ProRes and PCM require re-encoding. ALAC copies fine, but re-encoding it to AAC is recommended for broad compatibility.

Q3. My MOV is from an iPhone — is this the right guide? A. This guide works, but iPhone footage often has HEVC, HDR, and rotation quirks. The iPhone MOV to MP4 guide handles those specifically.

Q4. Why is copy so much faster than re-encode? A. Copy just moves compressed packets into a new container. Re-encoding decodes every frame and compresses it again — orders of magnitude more work.

Q5. The file size barely changed after copy. Is that normal? A. Yes. Copy doesn’t recompress, so the size stays close to the original (container overhead aside). To make the file smaller you must re-encode — see the video compression guide.



Tested with FFmpeg 8.1 — verified with our command-check script Primary sources: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-formats.html#mov