2

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

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

Wave32To16Stream 类似乎在这种情况下爆炸了: if (sourceStream.WaveFormat.Encoding != WaveFormatEncoding.IeeeFloat) throw new ApplicationException("Only 32 bit Floating point supported");

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

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

我也愿意采用某种方式将其编码为 mp3,但我已经尝试了所有我能想到的参数排列以使其接受波形文件。有趣的是 Audacity(它使用 lame_enc 对 mp3 进行编码)能够从波形创建 mp3(但也许 Audacity 在将其传递给 lame 之前会自动将其转换为 16 位)。

4

3 回答 3

3

Sox 可以为您转换。

http://sox.sourceforge.net/

合适的命令行:

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

sox 任意文件 -b 16 输出率 -I 22050 抖动 -s

注意重采样和抖动都需要一些空间。如果 SoX 报告在处理过程中发生了任何削波,则应重新进行转换并进行一些衰减,例如

sox 任意文件 -b 16 输出文件增益 -1 速率 44100 抖动 -s

于 2010-09-29T12:26:36.903 回答
3

格式 0x0003 实际上是 ieeeFloat,你不应该得到这个异常。最好检查它读取的值。您不能使用位移来转换值,您必须将浮点数转换为短整数。一个简单的演员就可以完成工作。

于 2010-09-29T12:44:45.323 回答
1

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

如果 32 位浮点范围大于 -1..1,那么您需要找到最小值和最大值并计算一个比例因子,以使样本在 INT16 范围内。

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

于 2010-09-29T13:12:37.967 回答