php调用ffmpeg提取音频需先确认ffmpeg已安装且php有执行权限;常用命令为ffmpeg -y -i 输入路径 -vn -acodec libmp3lame -ar 44100 -ac 2 -b:a 128k 输出路径,务必用escapeshellarg()防护路径注入。

PHP 本身不能直接解析视频或提取音频,但可以通过执行系统命令调用 ffmpeg 工具来完成。前提是服务器已安装 ffmpeg 且 PHP 有权限执行外部命令。
确认 ffmpeg 是否可用
在 PHP 中先检测 ffmpeg 是否存在并可执行:
if (exec('which ffmpeg', $output, $return) === false || $return !== 0) {
die('ffmpeg 未安装或不可访问');
}
基础命令:提取音频为 MP3
最常用的方式是把视频中的音轨转成 MP3 文件(保留原始采样率和声道):
$videoPath = '/path/to/input.mp4';
$audioPath = '/path/to/output.mp3';
// 构建命令(-y 覆盖已有文件,-vn 不处理视频,-acodec libmp3lame 指定编码器)
$cmd = "ffmpeg -y -i " . escapeshellarg($videoPath) .
" -vn -acodec libmp3lame -ar 44100 -ac 2 -b:a 128k " .
escapeshellarg($audioPath);
exec($cmd, $output, $return);
if ($return !== 0) {
error_log("FFmpeg 执行失败: " . implode("\n", $output));
}
其他常用音频提取场景
-
提取为 WAV(无损、不压缩):适合后续编辑,命令中用
-acodec pcm_s16le和.wav后缀 -
只提取某段时间的音频:加
-ss 00:01:30 -t 60表示从 1分30秒开始截取60秒 -
保留原始音频流(不重编码):用
-c:a copy,速度快、无损,但输出格式需与源音频兼容(如源是 AAC,输出 .m4a) -
获取音频信息而不生成文件:用
ffprobe(ffmpeg 同包工具)解析时长、码率等,便于前端预估处理时间
安全与稳定性提醒
务必使用 escapeshellarg() 包裹所有路径和用户输入,防止命令注入;避免直接拼接变量。生产环境建议:
- 限制执行超时(
exec(..., $output, $return, 300)或配合proc_open控制资源) - 检查输入文件是否存在、是否为合法视频(可用
ffprobe -v quiet -show_entries format=duration -of default=nw=1验证) - 将 ffmpeg 运行日志写入文件,便于排查编码失败、不支持格式等问题
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











