PHP调用FFmpeg无法保存视频的问题求助
解决PHP-FFmpeg保存视频时的ExecutionFailureException问题
看起来你遇到的是FFmpeg命令执行失败的核心问题——PHP-FFmpeg的错误日志只给出了执行的命令,但没显示FFmpeg本身的报错细节,这才是排查的关键。下面是一步步的排查和解决思路:
1. 先获取FFmpeg的原始错误输出
首先修改你的代码,添加异常捕获来拿到FFmpeg的详细错误信息,这能帮你直接定位根本问题:
require '/vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create(); $ffprobe = FFMpeg\FFProbe::create(); $video = $ffmpeg->open('Sample.mp4'); $video->filters()->resize(new FFMpeg\Coordinate\Dimension(320, 240))->synchronize(); try { $video->save(new FFMpeg\Format\Video\X264('aac'), 'export-x264.mp4'); } catch (Alchemy\BinaryDriver\Exception\ExecutionFailureException $e) { // 打印FFmpeg的错误输出和执行的命令 echo "<pre>"; echo "FFmpeg Error Output:\n" . $e->getProcess()->getErrorOutput() . "\n\n"; echo "Executed Command:\n" . $e->getProcess()->getCommandLine(); echo "</pre>"; exit; }
运行后,你会看到FFmpeg具体的报错(比如编码库缺失、文件找不到、权限不足等)。
2. 根据错误信息针对性解决
常见的几种情况和对应方案:
- 输入文件路径问题:如果报错提示
No such file or directory,检查Sample.mp4的路径是否正确。建议使用绝对路径(比如/var/www/html/Sample.mp4)来避免相对路径的坑。 - 编码库缺失:如果报错提到
encoder 'libx264' is experimental or deprecated或者Unknown encoder 'aac',说明你的FFmpeg缺少对应的编码库:- 对于Debian/Ubuntu系统,安装带完整编码的FFmpeg:
sudo apt-get install ffmpeg libavcodec-extra - 对于CentOS/RHEL,先安装EPEL和RPM Fusion仓库,再安装FFmpeg:
sudo yum install ffmpeg ffmpeg-devel - 验证是否支持:在终端执行
ffmpeg -codecs | grep libx264和ffmpeg -codecs | grep aac,能看到输出说明支持。
- 对于Debian/Ubuntu系统,安装带完整编码的FFmpeg:
- 输出/临时目录权限:
- 虽然你设置了文件/文件夹755,但要确认输出目录的所有者是web服务器用户(比如
www-data),否则755权限下其他用户无法写入。可以用sudo chown www-data:www-data /path/to/output-dir修改所有者。 - 日志里提到了
/tmp/ffmpeg-passes...,检查/tmp目录权限是否为777(默认是),如果不是,执行sudo chmod 777 /tmp。
- 虽然你设置了文件/文件夹755,但要确认输出目录的所有者是web服务器用户(比如
- FFmpeg参数兼容性:如果你的FFmpeg版本较旧,PHP-FFmpeg默认的X264参数可能不兼容。试试简化格式设置:
$format = new FFMpeg\Format\Video\X264(); $format->setAudioCodec('aac') ->setVideoBitrate(1000) ->setAudioBitrate(128); $video->save($format, 'export-x264.mp4');
3. 额外排查点
- 确认服务器上的FFmpeg可执行路径正确:PHP-FFmpeg默认用
/usr/bin/ffmpeg,如果你的FFmpeg在其他路径(比如/usr/local/bin/ffmpeg),需要在创建FFmpeg实例时指定:$ffmpeg = FFMpeg\FFMpeg::create([ 'ffmpeg.binaries' => '/usr/local/bin/ffmpeg', 'ffprobe.binaries' => '/usr/local/bin/ffprobe' ]); - 检查PHP的open_basedir限制:如果php.ini里设置了open_basedir,确保输入文件、输出目录和FFmpeg路径都在允许的范围内。
内容的提问来源于stack exchange,提问作者Jack The Baker
相关产品推荐
相关产品推荐

