Skip to content

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.mp4

Preset Options

From fastest to slowest (and most compressed):

PresetEncoding SpeedCompression
ultrafast5xLow
superfast4x
veryfast3x
faster2x
fast+20%
mediumBaseline
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.mp4

Tune 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.mp4

Hardware 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.mp4

Constant 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.mp4

Target 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

Released under the MIT License.