H.264 / AVC
H.264(也称为 AVC — Advanced Video Coding)是全球使用最广泛的视频编码器。它提供出色的压缩率,同时拥有广泛的硬件和软件支持。
使用 libx264 编码
bash
# 基本编码
ffmpeg -i input.avi -c:v libx264 -preset fast -crf 23 \
-c:a aac -b:a 128k output.mp4
# 高质量
ffmpeg -i input.avi -c:v libx264 -preset slow -crf 18 \
-c:a aac -b:a 256k output_high_quality.mp4
# 小文件
ffmpeg -i input.avi -c:v libx264 -preset ultrafast -crf 28 \
-c:a aac -b:a 96k output_small.mp4Preset 选项
从最快到最慢(压缩率最高):
| Preset | 编码速度 | 压缩率 |
|---|---|---|
ultrafast | 5 倍 | 低 |
superfast | 4 倍 | |
veryfast | 3 倍 | |
faster | 2 倍 | |
fast | +20% | |
medium | 基准 | |
slow | -20% | |
slower | -40% | |
veryslow | -70% | 最佳 |
Profile 与 Level
bash
# Baseline(最大兼容性 — 老设备)
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 \
-profile:v baseline -level 3.0 \
output_baseline.mp4
# High profile(现代设备,最佳质量)
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 选项
bash
# 调优电影(减少颗粒感)
ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 20 \
-tune film output.mp4
# 调优动画(平面颜色效果更好)
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 22 \
-tune animation output.mp4
# 调优颗粒(保留胶片颗粒)
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 18 \
-tune grain output.mp4
# 调优低延迟(直播)
ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -crf 23 \
-tune zerolatency output.mp4
# 调优 PSNR(测量)
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 \
-tune psnr output.mp4硬件编码
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固定码率(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目标文件大小
bash
# 编码到目标文件大小(例如:5 分钟 100MB)
# 码率 = (目标MB * 8192) / 时长秒数
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