FFMPEG终端运行正常但PHP脚本调用转MP4失败如何解决
问题排查与解决方案
1. 排查权限问题
- 确认ffmpeg路径正确性:终端执行
which ffmpeg,对比输出路径是否和代码里的/usr/bin/ffmpeg一致 - 测试web运行用户的ffmpeg执行权限:假设你的web服务运行用户是www-data,终端执行
sudo -u www-data /usr/bin/ffmpeg -version,如果无法输出版本信息,执行chmod +x /usr/bin/ffmpeg添加执行权限 - 确认上传目录权限:给uploadvideo目录开放web用户的读写权限,执行
chown -R www-data:www-data uploadvideo和chmod 755 uploadvideo,避免转码后输出文件无法写入
2. 排查PHP函数禁用
查看php.ini配置文件中的disable_functions项,确认exec函数没有被列入禁用列表,如果被禁用需要移除后重启PHP-FPM或web服务。
3. 修正命令拼接逻辑
你当前的命令拼接没有对文件名做转义,当上传的文件名包含空格、特殊字符、中文时会导致命令执行失败,同时缺失音频编码参数可能导致MP4文件兼容性问题,修改exec相关代码如下:
// 转义文件名参数避免特殊字符报错 $input_file = escapeshellarg($uploaded_file); $output_file = escapeshellarg("./uploadvideo/".$video_mp4); // 增加音频编码参数,同时接收执行返回状态 exec($ffmpeg . ' -i ' . $input_file . ' -c:v libx264 -c:a aac ' . $output_file . ' -y 1>convert.txt 2>&1', $output_arr, $return_code); // 后续可以通过返回值判断执行结果 if ($return_code === 0 && file_exists($output_file) && filesize($output_file) > 0) { // 转码成功逻辑 } else { // 转码失败,可查看convert.txt文件中的具体报错信息 }
4. 错误排查技巧
如果修改后仍然无法执行,直接打开根目录下的convert.txt文件,里面会记录ffmpeg执行的完整日志,可根据具体报错信息定位问题,比如缺少libx264编码依赖、源视频文件损坏等。
内容的提问来源于stack exchange,提问作者margie
相关产品推荐
相关产品推荐

