crf是ffmpeg的编码参数,php仅负责安全调用;推荐crf值21–23兼顾画质与体积,需搭配-preset medium、-vf scale=1280:-2及权限/环境校验。

PHP 7.4 本身不处理视频,CRF 参数是 FFmpeg 的编码控制逻辑,PHP 只负责调用它。要让转码后画质更好,关键不是 PHP 版本,而是正确传入 FFmpeg 的 -crf 值,并搭配合理参数组合。
CRF 数值怎么选才更清晰
CRF 范围通常是 0–51,数值越小画质越高、文件越大:
- 18–20:近无损,适合存档或二次编辑,体积明显增大
- 21–23:人眼难辨损失,兼顾画质与体积,是绝大多数场景的推荐起点
- 24–26:网络分发常用,轻度压缩,适合带宽受限但对观感要求不苛刻的场合
- 超过 28 后画质下降较明显,不建议用于主输出
PHP 中调用 FFmpeg 设置 CRF 的安全写法
不能只写 exec("ffmpeg -i ..."),必须捕获错误并校验结果:
- 用
2>&1合并错误流,确保 $output 能拿到报错信息 - 必须检查
$return_code,0 才代表成功,非 0 就是失败(比如权限不足、路径不存在、编码器未启用) - 避免用
system(),它会把 FFmpeg 输出直接刷到浏览器,生产环境易泄露敏感路径
示例代码:
exec('ffmpeg -i "/upload/src.mp4" -c:v libx264 -crf 21 -preset medium -vf "scale=1280:-2" -c:a aac "/output/dest.mp4" 2>&1', $output, $return_code);
if ($return_code !== 0) {
error_log("CRF转码失败:" . implode("\n", $output));
// 可返回错误提示给前端
}
配合 CRF 提升实际观感的必要参数
单独设 CRF 不够,以下三项协同才能稳定输出高质量画面:
- -preset medium:编码速度与压缩率的黄金平衡点;用 ultrafast 会明显牺牲质量,slow 虽好但耗时翻倍
-
-vf scale=1280:-2:等比缩放到宽度 1280,
-2自动保证高度为偶数(FFmpeg 强制要求),避免黑边或报错 - 确保输入源分辨率足够:对 720p 源用 CRF 18 并不会比 CRF 23 更“清晰”,只是细节保留更多;若源片模糊或低分辨率,再低的 CRF 也无法凭空增强画质
注意 PHP 运行环境是否支持
即使命令写对,也可能因环境限制失败:
- 确认 PHP 进程用户(如 www-data)对输入文件有读权限,对输出目录有写权限
- 检查 php.ini 中
disable_functions是否禁用了exec或shell_exec - 确保服务器已安装完整版 FFmpeg(含 x264 支持),运行
ffmpeg -encoders | grep x264可验证
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











