php 8.3 中需通过安全调用系统 ffmpeg 实现视频滤镜,核心是使用 escapeshellarg() 转义路径、白名单控制滤镜类型、捕获返回码,并推荐异步处理大视频。

确认 ffmpeg 已安装并可被 PHP 调用
PHP 本身不处理视频,必须依赖系统级 ffmpeg。需确保:
- 服务器已安装 ffmpeg(运行 ffmpeg -version 验证)
- PHP 进程有权限执行外部命令(exec、shell_exec 等函数未被禁用)
- Web 服务器用户(如 www-data、nginx)对输入/输出目录有读写权限
常用滤镜命令示例(PHP 中拼接调用)
以下命令可在终端直接测试,再封装进 PHP:
-
加灰度效果:
ffmpeg -i input.mp4 -vf "hue=s=0" -c:a copy output.mp4 -
加模糊(高斯):
ffmpeg -i input.mp4 -vf "gblur=sigma=2" -c:a copy output.mp4 -
加文字水印:
ffmpeg -i input.mp4 -vf "drawtext=text='MyLogo':x=10:y=10:fontsize=24:fontcolor=white" -c:a copy output.mp4 -
调色(亮度/对比度):
ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2" -c:a copy output.mp4
注意:-c:a copy 表示音频流不重编码,加快处理速度;若需同步处理音频,可改用 -c:a aac。
PHP 安全调用 ffmpeg 的推荐写法
避免直接拼接用户输入,防止命令注入。推荐方式:
- 使用 escapeshellarg() 对路径和参数转义
- 固定滤镜逻辑,只允许预设参数(如 “grayscale”、“blur”),不开放任意 ffmpeg 参数
- 设置超时和错误捕获
示例代码片段:
$input = '/var/www/videos/original.mp4';
$output = '/var/www/videos/filtered.mp4';
$filter = 'grayscale'; // 只接受白名单值
$cmdMap = [
'grayscale' => '-vf "hue=s=0"',
'blur' => '-vf "gblur=sigma=1.5"',
'watermark' => '-vf "drawtext=text=\'Demo\':x=20:y=20:fontsize=16"'
];
if (!isset($cmdMap[$filter])) {
die('不支持的滤镜类型');
}
$cmd = sprintf(
'ffmpeg -i %s %s -c:a copy %s 2>&1',
escapeshellarg($input),
$cmdMap[$filter],
escapeshellarg($output)
);
exec($cmd, $outputLines, $returnCode);
if ($returnCode !== 0) {
error_log("FFmpeg 执行失败: " . implode("\n", $outputLines));
die('视频处理失败,请稍后重试');
}
注意事项与避坑点
- 不要在 Web 请求中长时间阻塞执行:大视频可能耗时数分钟,建议结合队列(如 Redis + Worker)异步处理
- 临时文件与磁盘空间:ffmpeg 会占用大量临时 I/O,确保磁盘充足并定期清理
- PHP 运行超时:调整 set_time_limit(0) 或使用 CLI 模式运行(更合适)
- Windows 环境:路径分隔符、空格、编码需额外注意,推荐统一用 Linux 服务器部署
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











