转码与压缩
视频转码是将视频从一种编码格式转换为另一种格式的过程,常用于压缩文件大小、提高兼容性或优化播放性能。
HEVC 转 H.264
将 HEVC(H.265)编码的视频转换为 H.264 编码,提高兼容性。
bash
ffmpeg -i input.mp4 -c:v libx264 -crf 18 -preset slow -c:a copy output.mp4参数说明
-c:v libx264: 视频编码格式为 H.264-crf 18: 恒定质量因子,值越小质量越高(18-28 为合理范围)-preset slow: 编码速度预设(ultrafast → veryslow,越慢质量越好)-c:a copy: 音频直接复制,不重新编码
视频压缩
在保证画质的前提下压缩视频文件大小。
基础压缩命令
bash
ffmpeg -i input.mp4 -vcodec libx264 -crf 23 -preset slow -acodec aac -b:a 128k output.mp4参数详解
| 参数 | 说明 | 推荐值 |
|---|---|---|
-vcodec libx264 | 视频编码格式(H.264) | libx264 |
-crf | 恒定质量因子(0-51) | 18-23(越小越清晰) |
-preset | 编码速度预设 | slow / veryslow(质量优先) |
-acodec aac | 音频编码格式 | aac |
-b:a | 音频比特率 | 128k(可调高提高音质) |
CRF 值选择指南
| CRF 值 | 质量 | 适用场景 |
|---|---|---|
| 18-20 | 极高 | 存档、专业用途 |
| 21-23 | 高 | 高质量视频、推荐值 |
| 24-28 | 中等 | 平衡质量和大小 |
| 29+ | 低 | 低质量、文件很小 |
Preset 选择指南
| Preset | 速度 | 压缩率 | 适用场景 |
|---|---|---|---|
ultrafast | 最快 | 最低 | 快速预览 |
superfast | 很快 | 较低 | 快速转码 |
veryfast | 快 | 较低 | 日常使用 |
faster | 较快 | 中等 | 平衡选择 |
fast | 快 | 中等 | 平衡选择 |
medium | 中等 | 中等 | 默认值 |
slow | 慢 | 较高 | 推荐 |
slower | 很慢 | 高 | 高质量 |
veryslow | 极慢 | 最高 | 极限压缩 |
质量与文件大小平衡
- 极限画质保留:
-crf 18+-preset veryslow - 平衡选择:
-crf 23+-preset slow(推荐) - 快速压缩:
-crf 23+-preset medium
机器转码
自动化转码配置,适用于服务器批量处理。
bash
ffmpeg -y -i http://example.com/video.mov \
-c:a copy \
-c:v libx264 \
-vf scale=-1:-1,format=yuv420p \
-profile:v high \
output.mp4参数说明
-y: 自动覆盖输出文件-vf scale=-1:-1: 保持原始分辨率(-1 表示自动计算)format=yuv420p: 设置像素格式为 yuv420p(兼容性最好)-profile:v high: H.264 编码配置文件(high profile)
不同编码格式转换
H.264 转 HEVC(H.265)
bash
ffmpeg -i input.mp4 -c:v libx265 -crf 23 -preset slow -c:a copy output.mp4VP9 编码
bash
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 output.webmAV1 编码(最新)
bash
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -b:v 0 output.mp4硬件加速转码
NVIDIA GPU 加速(NVENC)
bash
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -crf 23 output.mp4Intel Quick Sync(QSV)
bash
ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv -crf 23 output.mp4Apple VideoToolbox(macOS)
bash
ffmpeg -hwaccel videotoolbox -i input.mp4 -c:v h264_videotoolbox -b:v 5M output.mp4批量转码脚本
Shell 脚本示例
bash
#!/bin/bash
# 批量转码脚本
INPUT_DIR="./videos"
OUTPUT_DIR="./output"
CRF=23
PRESET="slow"
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*.mp4; do
filename=$(basename "$file")
output="$OUTPUT_DIR/${filename%.mp4}_compressed.mp4"
echo "处理: $filename"
ffmpeg -i "$file" \
-vcodec libx264 \
-crf "$CRF" \
-preset "$PRESET" \
-acodec aac \
-b:a 128k \
"$output"
echo "完成: $output"
done注意事项
CRF 值选择:
- 18-23:高质量,适合存档
- 23-28:平衡质量和文件大小
- 28+:低质量,文件很小
Preset 选择:
- 时间充裕:使用
slow或veryslow - 快速处理:使用
medium或fast
- 时间充裕:使用
兼容性:
- 使用
yuv420p像素格式确保最大兼容性 - H.264 编码格式兼容性最好
- 使用
性能优化:
- 批量处理可以使用脚本循环
- 大文件处理建议使用
-preset slow或veryslow - 有 GPU 的情况下使用硬件加速
下一步:学习裁剪与比例相关内容。
