结论:php-ffmpeg/php-ffmpeg 是唯一可用且官方维护的 FFmpeg PHP 封装,其他带“ffmpeg”字样的包均已废弃或不兼容现代 PHP;它不包含二进制,需单独安装系统 ffmpeg/ffprobe 并显式配置路径与参数。

直接说结论:别想着“集成多个流媒体处理库”来替代 php-ffmpeg/php-ffmpeg,它不是组件,而是唯一合理的选择;所谓“FFmpeg组件”在 Composer 里根本不存在——php-ffmpeg 就是调用系统 ffmpeg 和 ffprobe 的 PHP 封装,没有其他“FFmpeg组件”可选。
composer require php-ffmpeg/php-ffmpeg 是唯一正解
你搜到的 ffmpeg-php、php-ffmpeg-ext 或带“ffmpeg”字样的其他包,基本都已废弃或不兼容现代 PHP(尤其是 PHP 8.5.5)。它们要么编译失败,要么运行时报 Segmentation fault 或 undefined symbol。官方维护的只有 php-ffmpeg/php-ffmpeg 这一个包。
- 安装命令必须是
composer require php-ffmpeg/php-ffmpeg(注意是斜杠,不是短横线或下划线) - 包名写错(比如写成
ffmpeg/php-ffmpeg)会导致类加载失败,报Class 'FFMpeg\FFMpeg' not found - Laravel 项目通常自动加载,但非 Laravel 环境必须显式
require 'vendor/autoload.php' - 类名必须全小写加反斜杠:
FFMpeg\FFMpeg::create(),不能写成FFmpeg或Ffmpeg
为什么不能靠 Composer 安装 ffmpeg 二进制?
php-ffmpeg 是纯 PHP 包,不打包任何二进制文件。Composer 下载的只是 PHP 类,真正干活的是你系统里的 ffmpeg 和 ffprobe 可执行文件。所以:
- Linux:用
apt install ffmpeg或brew install ffmpeg(macOS)安装,再用which ffmpeg和which ffprobe查路径 - Windows:去 https://www.php.cn/link/15b513b56021f781a10e11bf6246bffe 下载静态 zip,解压后把
bin/ffmpeg.exe和bin/ffprobe.exe路径记下来 - Web 环境下别信 PATH:Apache/Nginx + PHP-FPM 启动时 PATH 常被清空,必须在代码里硬编码路径,例如:
'ffmpeg.binaries' => '/usr/local/bin/ffmpeg' - 务必验证可执行性:
file_exists('/path/to/ffmpeg')和is_executable('/path/to/ffmpeg')比猜更可靠
timeout、threads、logger 这些参数不是可选项
默认超时是 60 秒,转码一个 10 分钟视频大概率超时失败;不设线程数,ffmpeg 默认只用 1 核,效率极低;没传 logger,出错时连哪条命令挂了都不知道。
-
'timeout' => 3600:建议设为 3600(1 小时),避免长任务中断 -
'ffmpeg.threads' => 12:设为 CPU 核心数,提升编码吞吐(但别超过物理核心数) -
'ffprobe.binaries'必须和'ffmpeg.binaries'同时指定,缺一不可 - 加个
Psr\Log\NullLogger或自定义 logger,方便定位exec()执行失败的具体原因
最容易被忽略的点:你写的代码在 CLI 下能跑通,不代表 Web 下也能跑——PHP-FPM 用户权限、SELinux 策略、禁用的 exec 函数、甚至 open_basedir 限制,都会让 php-ffmpeg 静默失败。上线前务必用 file_exists() + is_executable() + 实际 exec('ffmpeg -version') 三重验证。


















