我一直在使用环回捕获模式捕获音频。捕获的波形是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位然后再将其传递给跛脚)。
答案 0 :(得分:3)
格式0x0003实际上是ieeeFloat,你不应该得到这个例外。更好地检查它读取的值。您无法通过位移转换值,您必须从float转换为short。一个简单的演员可以完成工作。
答案 1 :(得分:2)
Sox可以为你转换它。
合适的命令行:
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范围内采样的比例因子。
您可能需要添加一些抖动。