Naudio - 将32位wav文件转换为16位wav文件。

4

我一直在尝试将32位立体声wav转换为16位单声道wav。我使用naudio捕获声音,并认为只使用两个或四个更重要的字节就可以解决问题。

以下是DataAvailable实现:

void _waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
     byte[] newArray = new byte[e.BytesRecorded / 2];
     short two;
     for (int i = 0, j = 0; i < e.BytesRecorded; i = i + 4, j = j + 2)
     {
          two = (short)BitConverter.ToInt16(e.Buffer, i + 2);


          newArray[j] = (byte)(two & 0xFF);
          newArray[j + 1] = (byte)((two >> 8) & 0xFF);
     }
     //do something with the new array:
}

任何帮助都将不胜感激!
2个回答

3

我终于找到了解决方案。我只需要将转换后的值乘以32767并将其转换为short类型:

void _waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
    byte[] newArray16Bit = new byte[e.BytesRecorded / 2];
    short two;
    float value;
    for (int i = 0, j = 0; i < e.BytesRecorded; i += 4, j += 2)
    {
        value = (BitConverter.ToSingle(e.Buffer, i));
        two = (short)(value * short.MaxValue);

        newArray16Bit[j] = (byte)(two & 0xFF);
        newArray16Bit[j + 1] = (byte)((two >> 8) & 0xFF);
    }
}

1
一个 32 位 的样本可以高达 4,294,967,295,而一个 16 位 的样本可以高达 65,536。因此,您需要将 32 位 的样本缩小到适合 16 位 样本范围内。或多或少,您正在做这样的事情...
SixteenBitSample = ( ThirtyTwoBitSample / 4294967295 ) * 65536;

编辑:

对于立体声转单声道部分,如果两个通道具有相同的数据,则只需丢弃其中一个,否则将波形相加,如果它们超出了采样范围(65,536),那么您将不得不按照上述方程式进行类似的缩放。

希望这可以帮助到您。


16位样本为有符号数;32位样本首先不太可能是整数(而是浮点数)。 - Roman R.
谢谢你的帮助!我一定是做错了什么,因为它没有按照你说的那样工作。对于立体声转单声道,我成功地在我的应用程序中使用了立体声信号,这样更好。谢谢! - Eduard Niesner
@RomanR.:我在最终版本中使用了浮点数……请查看我的解决方案。 - Eduard Niesner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接