PHP仅拼接并执行ffmpeg命令,分辨率由-vf scale参数控制(如scale=1280:-2),码率由-b:v与-maxrate等组合调控,真正编解码由ffmpeg完成;需用escapeshellarg()转义路径、检查return_code、设置超时与权限。

直接用 ffmpeg 命令控制分辨率和码率,PHP 不参与编码逻辑
PHP 本身没有视频编解码能力,所谓“设置分辨率”“设置码率”,本质是拼好 ffmpeg 命令并交给系统执行。你写的 PHP 代码只是字符串组装器和执行触发器,真正起作用的是 -vf scale 和 -b:v 这类参数。
-vf scale 控制分辨率:宽高比、自适应、硬限制要分清
常见写法有三种,效果差异明显:
-
-vf "scale=1280:-2":宽度固定为 1280,高度按原始宽高比自动计算(-2 表示保持偶数,适配 H.264 编码要求) -
-vf "scale=640:360:force_original_aspect_ratio=decrease":最大不超过 640×360,等比缩放后居中填充黑边(推荐用于多尺寸统一输出) -
-vf "scale=320:240:force_original_aspect_ratio=disable":强制拉伸到 320×240,可能变形(慎用)
注意:scale 必须放在 -c:v libx264 之前,否则滤镜不生效;如果输入视频本身分辨率低于目标值,scale 会放大而非裁剪,画质可能变糊。
-b:v 和 -maxrate 配合才能稳住码率
只设 -b:v 1000k 不够,H.264 编码器默认用 CBR(恒定码率),但实际波动大,容易卡顿或爆带宽:
立即学习“PHP免费学习笔记(深入)”;
- 加
-maxrate 1200k -bufsize 2000k才能启用 VBR(可变码率)并限制峰值 - 搭配
-preset medium或-preset slow,越慢的 preset 压缩率越高,相同码率下画质越好 - 音频码率别忽略:
-b:a 128k是底线,低于 96k 可能出现人声发闷
错误示范:ffmpeg -i in.mp4 -b:v 500k out.mp4 → 实际码率可能在 300–800k 波动,移动端播放易缓冲。
PHP 调用时必须处理路径、空格和错误反馈
用户上传的文件名带空格、中文或特殊字符,不转义就会命令失败:
- 用
escapeshellarg()包裹所有路径和参数值:escapeshellarg($input_path) - 重定向 stderr 并检查
$return_code:exec("ffmpeg -i ... 2>&1", $output, $return_code) - 避免超时:Web 请求默认 30 秒,大视频转码必超时,要么调
set_time_limit(0),要么扔进队列异步跑 - 别用
exec()直接输出全部日志——FFmpeg 日志量极大,$output数组可能撑爆内存
最易被忽略的一点:PHP 进程运行身份(如 www-data)必须对输入/输出目录有读写权限,且 ffmpeg 二进制路径要写全(比如 /usr/bin/ffmpeg),不能只写 ffmpeg。



















