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.mp4Prefer no terminal?
Use the Video Converter in your browser
What each flag does
| -i | Input file. Can be a video, audio, or image. Repeat for multiple inputs. |
|---|---|
| -c:v | Video codec for output. e.g. libx264, libx265, libvpx-vp9. |
| -crf | Constant Rate Factor — quality target (lower = better, larger file). 23 is visually lossless for libx264. |
| -c:a | Audio codec for output. e.g. aac, libmp3lame, copy. |
| -b:a | Audio bitrate, e.g. 192k. |
| -y | Overwrite output file without confirmation. |
| -preset medium | Encoding speed vs. compression efficiency tradeoff. Faster presets produce larger files at same CRF. |
| -movflags +faststart | Move 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.mp4h264 and aac. Seeing hevc means the video was copied rather than converted.
What to change
| Try -c copy first | A 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 copied | MP4 has no place for ProRes, so it has to be encoded. Expect the file to shrink by an order of magnitude. |
| Rotation metadata | iPhone 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.