直接使用 -ar 44100 会导致 AAC 音质发闷,因 FFmpeg 默认线性插值重采样高频衰减严重;必须配合 -af "aresample=resampler=soxr"、-c:a aac 和 -ac 2 等参数协同生效。

为什么直接 -ar 44100 会导致 AAC 音质发闷
原始音频采样率是 48kHz 或 96kHz 时,硬加 -ar 44100 不会自动触发高质量重采样。FFmpeg 默认用线性插值(swr 的 linear 模式),高频衰减明显,人声齿音、吉他泛音全糊掉。这不是 AAC 编码器的问题,而是重采样环节被跳过了。
PHP 调用 FFmpeg 时必须显式设置的 AAC 音频参数
用 exec() 或 shell_exec() 拼命令,或用 PHP-FFMpeg 封装,以下三点缺一不可:
-
-c:a aac:强制音频编码器为 AAC(不写可能 fallback 到 mp3 或 ac3) -
-ar 44100或-ar 48000:必须与重采样滤镜配合,单独写无效 -
-af "aresample=resampler=soxr":高精度重采样(FFmpeg ≥ 4.4),否则默认 linear 滤镜毁细节 -
-ac 2:多声道源(如 5.1)不转双声道,AAC 编码会降级到 LC profile,部分播放器解码异常 -
-b:a 192k(音乐)或-b:a 96k(语音):比特率不能拍脑袋定,128k 对高动态内容已显单薄
PHP-FFMpeg 封装里怎么安全传 AAC 参数
它不是“设完参数就跑”,很多选项必须按顺序绑定到音频对象上,否则静默失效:
- 先调
$video->setAudioOnly(true),彻底禁用视频流;否则即使加了-vn,某些版本仍尝试编码视频轨道并失败 - 创建
FFMpeg\Format\Audio\Aac实例后,必须调->setAudioSampleRate(44100),这会自动注入-ar和适配的重采样滤镜 - 手动加滤镜要用
->addFilter('aresample=resampler=soxr'),->setAudioFilters()不认这个字符串格式 - 务必设超时:
'timeout' => 600,大文件重采样卡在 I/O 时,PHP 进程会挂住不返回
生成 MP4 后还要检查 moov atom 位置
FFmpeg 默认把 moov 放文件末尾,网页 <video> 标签无法秒开、拖拽卡顿。必须补一步 faststart:
立即学习“PHP免费学习笔记(深入)”;
ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4
这步不能省,尤其当 PHP 生成的是供前端直接引用的静态 URL。没做这个,用户点播放要等十几秒才出画面——问题不在 AAC,但在封装层。



















