PHP 7.4 需调用系统 ffmpeg 提取音频轨道,须先安装配置 ffmpeg 并确保 Web 用户权限;使用 escapeshellarg() 构建安全命令,如 ffmpeg -i input.mp4 -vn -acodec libmp3lame -y output.mp3;支持多格式、多音轨及时间截取,生产环境需校验文件、设超时、异步处理并记录日志。

PHP 7.4 本身不能直接提取音频轨道,它需要调用系统级的 ffmpeg 命令行工具来完成。关键在于:确保服务器已安装并配置好 ffmpeg,再用 PHP 的执行函数(如 exec 或 shell_exec)调用命令。
确认 ffmpeg 已正确安装并可访问
在 PHP 中执行前,先验证系统是否能识别 ffmpeg:
- SSH 登录服务器,运行
which ffmpeg或ffmpeg -version,确认输出版本信息 - 如果提示
command not found,需先安装 ffmpeg(Ubuntu/Debian:`sudo apt install ffmpeg`;CentOS/RHEL:`sudo yum install epel-release && sudo yum install ffmpeg`) - 若 PHP 运行在 Web 环境(如 Apache/Nginx),注意 Web 用户(如 www-data、nginx、apache)是否有权限执行 ffmpeg;必要时在
/etc/sudoers中为该用户免密授权(不推荐生产环境直接开放,应限制命令路径)
使用 exec() 提取音频轨道(推荐 MP3 格式)
以下是最常用且兼容性好的方式,将视频中的第一音轨转为 MP3:
$videoPath = '/path/to/input.mp4';
$audioPath = '/path/to/output.mp3';
// 构建 ffmpeg 命令:-vn 跳过视频,-acodec libmp3lame 指定编码器,-y 自动确认覆盖
$cmd = "ffmpeg -i " . escapeshellarg($videoPath) . " -vn -acodec libmp3lame -y " . escapeshellarg($audioPath);
// 执行并捕获输出(便于调试)
$output = [];
$returnCode = 0;
exec($cmd . ' 2>&1', $output, $returnCode);
if ($returnCode === 0) {
echo "音频提取成功:$audioPath";
} else {
echo "执行失败,错误码:$returnCode<br>详细信息:" . implode("\n", $output);
}
注意:escapeshellarg() 必须使用,防止路径含空格或特殊字符导致命令注入或执行失败。
立即学习“PHP免费学习笔记(深入)”;
提取其他格式或指定音轨(如 AAC、WAV、第二音轨)
根据需求调整参数:
- 提取为 AAC(更高效,适合 iOS):
-acodec aac -strict experimental(旧版 ffmpeg 需加-strict) - 提取为 WAV(无损,体积大):
-acodec pcm_s16le -ar 44100 -ac 2 - 提取第 2 条音轨(从 0 开始计数):
-map 0:a:1(完整示例:ffmpeg -i input.mp4 -map 0:a:1 -vn -acodec libmp3lame output.mp3) - 只提取某段时间(如第 10–30 秒):
-ss 10 -to 30,建议放在-i前以提升速度
安全与稳定性建议
生产环境中需额外注意:
- 对上传的视频文件做严格校验:扩展名、MIME 类型(
finfo_file())、文件头、大小限制(避免超长视频耗尽资源) - 设置执行超时:
set_time_limit(300);防止卡死;也可用proc_open()更精细控制进程和资源 - 避免在 Web 请求中长时间阻塞,大文件建议改用队列(如 Redis + Worker)异步处理
- 日志记录每次命令、耗时、返回码,便于排查问题



















