H.264 / AVC
H.264 (also known as AVC — Advanced Video Coding) is the most widely used video codec worldwide. It offers excellent compression with broad hardware and software support.
Encoding with libx264
bash
# Basic encoding
ffmpeg -i input.avi -c:v libx264 -preset fast -crf 23 \
-c:a aac -b:a 128k output.mp4
# High quality
ffmpeg -i input.avi -c:v libx264 -preset slow -crf 18 \
-c:a aac -b:a 256k output_high_quality.mp4
# Small file size
ffmpeg -i input.avi -c:v libx264 -preset ultrafast -crf 28 \
-c:a aac -b:a 96k output_small.mp4Preset Options
From fastest to slowest (and most compressed):
| Preset | Encoding Speed | Compression |
|---|---|---|
ultrafast | 5x | Low |
superfast | 4x | |
veryfast | 3x | |
faster | 2x | |
fast | +20% | |
medium | Baseline | |
slow | -20% | |
slower | -40% | |
veryslow | -70% | Best |
Profile & Level
bash
# Baseline (maximum compatibility — older devices)
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 \
-profile:v baseline -level 3.0 \
output_baseline.mp4
# High profile (modern devices, best quality)
ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 18 \
-profile:v high -level 4.1 \
output_high.mp4
# Main profile
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 \
-profile:v main \
output_main.mp4Tune Options
bash
# Tune for film (reduce grain artifacts)
ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 20 \
-tune film output.mp4
# Tune for animation (better at flat colors)
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 22 \
-tune animation output.mp4
# Tune for grain (preserve film grain)
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 18 \
-tune grain output.mp4
# Tune for low-latency (live streaming)
ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -crf 23 \
-tune zerolatency output.mp4
# Tune for PSNR (measurement)
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 \
-tune psnr output.mp4Hardware Encoding
bash
# NVIDIA NVENC
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p7 -cq 23 \
-c:a aac output_nvenc.mp4
# macOS VideoToolbox
ffmpeg -i input.mp4 -c:v h264_videotoolbox -b:v 8M \
-c:a aac output_videotoolbox.mp4
# Intel VAAPI
ffmpeg -i input.mp4 -vaapi_device /dev/dri/renderD128 \
-vf "hwupload,scale_vaapi=w=1920:h=1080" \
-c:v h264_vaapi output_vaapi.mp4Constant Bitrate (CBR)
bash
ffmpeg -i input.mp4 -c:v libx264 -preset fast -b:v 4M \
-maxrate 4M -bufsize 8M \
-c:a aac -b:a 128k output_cbr.mp4Target File Size
bash
# Encode to target file size (e.g., 100MB for 5 minutes)
# bitrate = (target_MB * 8192) / duration_seconds
ffmpeg -i input.mp4 -c:v libx264 -preset fast \
-b:v 682k -maxrate 682k -bufsize 1M \
-c:a aac -b:a 128k \
-fs 100M output.mp4