PHP通过exec等函数调用FFmpeg的pad滤镜为视频加边框,需确保FFmpeg已安装、PHP有执行权限,并用escapeshellarg过滤路径;示例命令:ffmpeg -i input.mp4 -vf "pad=width=iw+60:height=ih+60:x=30:y=30:color=black" -c:a copy output.mp4。

PHP 8.5 本身不直接处理视频,加边框需调用外部命令行工具 FFmpeg。PHP 只负责拼接并执行 FFmpeg 命令,关键在参数是否正确。
确认系统已安装 FFmpeg 并可被 PHP 调用
先确保服务器(Linux/macOS/Windows)已安装 FFmpeg,且 PHP 进程有权限执行它:
- 终端运行
ffmpeg -version看是否输出版本信息 - PHP 中用
exec('which ffmpeg', $out); var_dump($out);检查路径(Linux/macOS) - Windows 下注意 PATH 或写绝对路径,如
C:\ffmpeg\bin\ffmpeg.exe - Web 服务器(如 Apache/Nginx)的运行用户需有执行权限,避免因权限被拒绝静默失败
用 FFmpeg 的 pad 滤镜添加纯色边框
最常用方式是 pad 滤镜:在原视频四周扩展画布,并指定填充色。例如加 30px 黑色边框:
ffmpeg -i input.mp4 -vf "pad=width=iw+60:height=ih+60:x=30:y=30:color=black" -c:a copy output.mp4
PHP 中安全执行(需过滤输入路径,防止命令注入):
立即学习“PHP免费学习笔记(深入)”;
- 用
escapeshellarg()包裹文件路径 - 不要拼接用户输入到滤镜字符串中;颜色、尺寸等建议从白名单取值
- 示例代码片段:
$input = escapeshellarg('/path/to/input.mp4');
$output = escapeshellarg('/path/to/output.mp4');
$cmd = "ffmpeg -i {$input} -vf \"pad=width=iw+60:height=ih+60:x=30:y=30:color=black\" -c:a copy {$output} 2>&1";
exec($cmd, $outputLines, $returnCode);
if ($returnCode !== 0) {
error_log("FFmpeg failed: " . implode("\n", $outputLines));
}
加带圆角或渐变边框?需更复杂滤镜链
纯 pad 是矩形实色。若要圆角,得组合 drawbox + overlay 或用 geq 手动绘图,但性能低、易出错。更实用的折中方案:
- 用
drawbox在原视频上绘制四条线模拟边框(适合细边框):-vf "drawbox=x=0:y=0:w=iw:h=10:color=red:t=fill,drawbox=x=0:y=0:w=10:h=ih:color=red:t=fill,..." - 预先用图像工具生成一张带圆角透明边框的 PNG 图层,再用
overlay叠加:-i border.png -vf "overlay=(W-w)/2:(H-h)/2" - 注意 PNG 需与视频分辨率一致,且含 alpha 通道,叠加时加
format=rgba确保兼容
PHP 8.5 特别注意事项
PHP 8.5 尚未发布(截至 2024 年中,最新稳定版为 PHP 8.3),你很可能指的是 PHP 8.2/8.3。不过无论哪个版本:
- 禁用
shell_exec或system的服务器环境无法执行 FFmpeg,需联系运维启用或改用队列异步处理 - 大视频处理耗时长,务必设置超时:
set_time_limit(0),并考虑用proc_open()实时捕获进度 - 避免在 Web 请求中直接转码,推荐将任务推入 Redis 队列,由后台 Worker 执行
- 输出文件路径确保 Web 服务器有写权限,且磁盘空间充足



















