CRF模式更适合画质优先场景,因它动态分配码率使观感更均衡;默认值23,20–22属视觉无损,生产建议从crf 22起步,配合preset medium或slow,并需加movflags +faststart和显式指定profile main、level 4.0以保障兼容性。

直接用 libx264 时,--crf 比 -b:v 更适合画质优先场景
如果你的目标是“画质提升”,而不是固定带宽下的传输适配,就别硬套 -b:v 1500k 这类固定码率参数。CRF(Constant Rate Factor)模式才是 H.264 编码中真正面向主观质量的控制方式,它让编码器动态分配码率,复杂画面多给、平坦区域少给,整体观感更均衡。
常见错误是把 CRF 当成“画质数值”盲目调低:CRF 范围通常是 0–51,值越小画质越高但体积越大;23 是 x264 默认值,20–22 已属视觉无损区间,再往下体积翻倍、收益极小。生产环境建议从 --crf 22 起步测试,配合 --preset medium 平衡速度与效率。
-
--crf 18:仅限存档级需求,文件体积可能比crf 23大 2–3 倍 - 不要混用
--crf和-b:v,FFmpeg 会报错或静默忽略后者 - CRF 对音频无影响,务必单独配置
-c:a aac -b:a 128k避免音质拖后腿
--preset 不是“越快越好”,slow 在批量转码时反而更省资源
很多人一看到“高并发”就本能选 --preset ultrafast,结果发现 CPU 利用率没降、输出还更大——因为 ultrafast 跳过大量帧间分析,导致压缩率暴跌,同等画质下需要更高码率补偿,最终加重 I/O 和存储压力。
真实负载场景下,--preset slow 虽然单任务耗时增加 30%–50%,但平均码率下降 20%+,意味着单位时间能处理更多总字节数(尤其 SSD + 多核服务器),且更利于后续 CDN 缓存和带宽节省。
立即学习“PHP免费学习笔记(深入)”;
- 实时上传响应场景(如用户即传即播):用
--preset fast或medium - 后台批量转码(夜间任务、离线处理):优先
--preset slow,配合--tune film提升细节保留 - 避免在 PHP 中用
exec()直接调用--preset placebo,它对性能损耗过大,得不偿失
必须加 -movflags +faststart,否则 Web 端首帧加载慢
H.264 编码本身不决定播放启动速度,但 MP4 容器的元数据位置会。默认 FFmpeg 输出的 MP4 把 moov 盒子放在文件末尾,浏览器必须下载完整文件才能开始解码——用户点开视频要等十几秒,不是编码问题,是封装问题。
加上 -movflags +faststart 后,FFmpeg 会在写入视频流前先预占空间并把 moov 放到开头,实现“边下边播”。这个参数不影响画质、不增加 CPU 开销,只多一次文件重排,但对用户体验是刚性要求。
- PHP 调用时务必包含该参数:
ffmpeg -i input.mp4 -c:v libx264 -crf 22 -preset slow -movflags +faststart output.mp4 - 如果使用
-f hls输出 M3U8,则无需此参数,HLS 本身是分片结构 - 已生成的 MP4 可用
ffmpeg -i bad.mp4 -c copy -movflags +faststart fixed.mp4补救,无需重编码
--profile 和 --level 错配会导致 iOS/Android 播放失败
很多“转码成功但手机打不开”的问题,根源不在画质,而在 H.264 的 Profile/Level 兼容性。例如 --profile high --level 5.1 在部分 Android 旧机型上直接黑屏,iOS Safari 对 Level 4.2 以上支持也不稳定。
Web 和移动端通用底线是 --profile main --level 4.0:覆盖 99% 的设备,且对 x264 编码器负担更小。如果必须用 High Profile(如需 B-frame 支持),请同步压低 Level 至 4.0 或 4.1,避免触发解码器能力边界。
- 不要依赖 FFmpeg 自动推断:
-profile:v high不等于安全,必须显式指定--level 4.0 - 检查源视频分辨率/帧率是否超出 Level 限制:Level 4.0 最大支持 1920×1080@30fps,超了就得降帧或缩放
- 用
ffprobe -v quiet -show_entries stream=profile,level input.mp4验证输出是否达标
-c:v libx264 -crf 22 -preset slow -profile:v main -level 4.0 -movflags +faststart。其余参数如 -x264opts 或 --tune 属于边际优化,先跑通这组再微调。



















