将32位波形转换为16位波形

时间:2010-09-29 11:42:27

标签: .net audio mp3 wav lame

我一直在使用环回捕获模式捕获音频。捕获的波形是32位波形。我正在努力将其转换为16位波形,因此像lame这样的编码器可以处理它(它表示不支持的数据格式:0x0003)。

我已经尝试将波流本身的位(不是我的强点)从32位移位到16位但结果仍然听起来失真。

Wave32To16Stream类似乎在这种情况下爆炸:             if(sourceStream.WaveFormat.Encoding!= WaveFormatEncoding.IeeeFloat)抛出新的ApplicationException(“仅支持32位浮点数”);

理想情况下我想直接捕获到16位,是否有办法设置捕获位深度?如果没有,有人可以帮我转换波流吗?

可以在此处找到捕获波形的示例:http://dl.dropbox.com/u/454409/test.wav(10mb)

我也会采取某种方式将其编码为mp3并使用lame,我已经尝试了每个参数排列,我可以想到让它接受wave文件。有趣的是Audacity(它使用lame_enc来编码mp3)能够从波形创建一个mp3(但是Audacity可能会自动将它转换为16位然后再将其传递给跛脚)。

3 个答案:

答案 0 :(得分:3)

格式0x0003实际上是ieeeFloat,你不应该得到这个例外。更好地检查它读取的值。您无法通过位移转换值,您必须从float转换为short。一个简单的演员可以完成工作。

答案 1 :(得分:2)

Sox可以为你转换它。

http://sox.sourceforge.net/

合适的命令行:

  
    

http://sox.sourceforge.net/Docs/FAQ

  
     

sox any-file -b 16 outfile rate -I   22050 dither -s

     

N.B。重新取样和抖动   需要一些空间。如果SoX报道   任何剪辑都发生在   然后处理转换应该   重做有一些衰减,例如

     

sox any-file -b 16 outfile gain -1   率44100 dither -s

答案 2 :(得分:1)

如果您的32位格式是浮点数,那么样本值很可能是-1到1.要转换为16位(整数),您需要乘以32767并转换为INT16。

如果32位浮点范围大于-1..1,则需要找到最小值和最大值,并计算得到INT16范围内采样的比例因子。

您可能需要添加一些抖动。