FFmpeg recipe

FFmpeg: Convert MOV to MP4 (H.264 + AAC)

Re-encodes MOV to a universally-compatible MP4 with H.264 + AAC. The default CRF 23 preserves visual quality.

Command

ffmpeg -i input.mov -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k -movflags +faststart -y output.mp4
Prefer no terminal?
Use the Video Converter in your browser
Open Video Converter →

What each flag does

-iInput file. Can be a video, audio, or image. Repeat for multiple inputs.
-c:vVideo codec for output. e.g. libx264, libx265, libvpx-vp9.
-crfConstant Rate Factor — quality target (lower = better, larger file). 23 is visually lossless for libx264.
-c:aAudio codec for output. e.g. aac, libmp3lame, copy.
-b:aAudio bitrate, e.g. 192k.
-yOverwrite output file without confirmation.
-preset mediumEncoding speed vs. compression efficiency tradeoff. Faster presets produce larger files at same CRF.
-movflags +faststartMove the metadata to the start of the file so streaming players can begin playback before the full download.

Notes & gotchas

  • For HEVC sources inside MOV, this is one-way: H.264 is ~1.5–2× the file size at equivalent quality.
  • If the source is already H.264 inside MOV, prefer stream-copy: -c copy -movflags +faststart.

Check it worked

ffprobe -v error -show_entries stream=codec_name -of csv=p=0 output.mp4

h264 and aac. Seeing hevc means the video was copied rather than converted.

What to change

Try -c copy firstA MOV already holding H.264 can be rewrapped instantly with no quality loss. Only fall back to re-encoding if that fails.
ProRes cannot be copiedMP4 has no place for ProRes, so it has to be encoded. Expect the file to shrink by an order of magnitude.
Rotation metadataiPhone MOV stores orientation as a flag. Add -metadata:s:v rotate=0 with a transpose filter if the result plays sideways.

If it fails

Could not find tag for codec hevc in stream #0, codec not currently supported in container.

Why: You used -c copy on an iPhone MOV holding HEVC, and the MP4 muxer refused the tag.

Fix: Re-encode the video with -c:v libx264, or keep the copy and add -tag:v hvc1 if you genuinely want HEVC inside the MP4.

The MP4 plays on the Mac but not on Windows or Android.

Why: The video is still HEVC. Only the container changed.

Fix: Convert the video stream rather than copying it, which is what the command above does.

Related recipes