php通过调用ffmpeg实现视频变速,使用setpts调整视频时间戳、atempo调整音频速度,需注意atempo范围限制(0.5–2.0)、级联处理及escapeshellarg安全防护。

PHP 本身不能直接处理视频帧或调整播放速度,但可以通过执行系统命令调用 ffmpeg 来实现视频变速(如 0.5× 慢放、2× 快放)。关键在于构造正确的 ffmpeg 命令,并用 PHP 的 exec、shell_exec 或 proc_open 安全调用它。
确认 ffmpeg 已安装并可被 PHP 访问
在调用前,确保:
- 服务器已安装 ffmpeg(运行
ffmpeg -version验证) - PHP 进程有权限执行外部命令(检查
disable_functions是否禁用了exec等) - Web 服务器用户(如 www-data、nginx)对输入/输出目录有读写权限
使用 setpts 实现视频变速(推荐用于精确控制)
ffmpeg 中最常用且兼容性好的方式是使用 setpts(调整视频时间戳)和 atempo(调整音频速度)组合。例如将视频变为 1.5 倍速:
ffmpeg -i input.mp4 -filter_complex "setpts=PTS/1.5;atempo=1.5" -c:a aac -c:v libx264 output.mp4
PHP 调用示例:
$input = '/path/to/input.mp4';
$output = '/path/to/output_fast.mp4';
$speed = 1.5;
$cmd = sprintf(
'ffmpeg -i %s -filter_complex "setpts=PTS/%s;atempo=%s" -c:a aac -c:v libx264 %s 2>&1',
escapeshellarg($input),
escapeshellarg($speed),
escapeshellarg($speed),
escapeshellarg($output)
);
$outputLog = shell_exec($cmd);
if (file_exists($output) && filesize($output) > 0) {
echo "变速完成:{$output}";
} else {
echo "失败,日志:{$outputLog}";
}
注意音频变速的限制与绕过方法
atempo 滤镜只支持 0.5–2.0 倍速。若需更高倍速(如 4×),需级联多个 atempo:
-
atempo=2.0,atempo=2.0→ 实现 4× -
atempo=0.5,atempo=0.5→ 实现 0.25×
对应 PHP 构造时可写成:
$audioFilters = [];
while ($speed > 2.0) {
$audioFilters[] = 'atempo=2.0';
$speed /= 2.0;
}
if ($speed != 1.0) {
$audioFilters[] = "atempo=" . $speed;
}
$af = implode(',', $audioFilters);
$vf = "setpts=PTS/" . $originalSpeed; // originalSpeed 是原始设定倍数
$cmd = "ffmpeg -i {$input} -filter_complex \"{$vf};{$af}\" ...";
安全与稳定性建议
生产环境务必注意:
- 始终用
escapeshellarg()包裹路径和参数,防止命令注入 - 设置超时(如用
proc_open+stream_set_timeout),避免卡死 - 检查返回码和输出日志,区分“转码失败”和“文件损坏”
- 大视频建议异步处理(如写入队列,由后台脚本执行),避免 PHP 请求超时
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











