我利用 ffmpeg 读取立体声音频文件并将其转换为单声道,将音频数据以 格式输出f32le
到stdout
。例如:
ffmpeg -i ff-16b-2c-44100hz.flac -ac 1 -ar 44100 -f f32le "pipe:1" > out.bin
它用于-ac 1
将输出减少为单声道,设置格式-f f32le
并将其通过管道传输到pipe:1
写入的标准输出out.bin
在 Audacity 中加载out.bin
(文件 > 导入 > 原始数据)显示值高于 1.0 且低于 -1.0。看来将音频转换为单声道会增加其增益。
执行相同的立体声到单声道转换但直接使用 ffmpeg 将其写入文件,可以产生更好的结果,而不会增加音频的增益。
ffmpeg -i ff-16b-2c-44100hz.flac -ac 1 -ar 44100 out.flac
以下是 Audacity 内部加载的结果比较:[1]:https://i.stack.imgur.com/iBA6O.png
知道为什么会发生这种情况吗?是否存在我缺少的配置选项,以使管道版本不增加增益?
答案1
音频重采样器正在应用不同的矩阵系数(可见-loglevel debug
)。f32le 在顶部,s32le/s16le 在底部:
[auto_resampler_0 @ 0x55de59fe8bc0] [SWR @ 0x55de59fe8fc0] FC: FL:0.707107 FR:0.707107
[auto_resampler_0 @ 0x56515b7fdbc0] [SWR @ 0x56515b7fdfc0] FC: FL:0.500000 FR:0.500000
因此,下混的 f32le 输出会产生更高的增益。我不知道为什么会这样。也许我可以稍后再研究一下。
一种解决方法是使用平底锅过滤器:
ffmpeg -i ff-16b-2c-44100hz.flac -af "pan=mono|c0=0.5*FL+0.5*FR" -ar 44100 -f f32le "pipe:1" > out.bin
在这种情况下,它应该与使用平移增益重新标准化相同:
ffmpeg -i ff-16b-2c-44100hz.flac -af "pan=mono|c0<FL+FR" -ar 44100 -f f32le "pipe:1" > out.bin