Naudio - 将32位wav转换为16位wav

时间:2012-12-21 18:22:43

标签: c# audio converter bit naudio

我一直在尝试将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 个答案:

答案 0 :(得分:3)

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

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 :(得分:1)

32-bit样本可以高达4,294,967,29516-bit样本可以高达65,536。因此,您必须缩小32-bit样本以适应16-bit样本的范围。或多或少,你正在做这样的事情......

SixteenBitSample = ( ThirtyTwoBitSample / 4294967295 ) * 65536;

编辑:

对于立体声到单声道部分,如果两个声道具有相同的数据,只需转储其中一个,否则,将波形加在一起,如果它们超出样本范围(65,536),则你必须按照上面的等式缩小它们。

希望有所帮助。