ffmpeg 立体声到单声道的转换在通过管道输出和写入文件时会产生不同的结果

ffmpeg 立体声到单声道的转换在通过管道输出和写入文件时会产生不同的结果

我利用 ffmpeg 读取立体声音频文件并将其转换为单声道,将音频数据以 格式输出f32lestdout。例如:

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

相关内容