You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,能看到输出说明支持。
  • 输出/临时目录权限:
    • 虽然你设置了文件/文件夹755,但要确认输出目录的所有者是web服务器用户(比如www-data),否则755权限下其他用户无法写入。可以用sudo chown www-data:www-data /path/to/output-dir修改所有者。
    • 日志里提到了/tmp/ffmpeg-passes...,检查/tmp目录权限是否为777(默认是),如果不是,执行sudo chmod 777 /tmp。
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:42:30