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:
}

任何帮助将不胜感激!

4

2 回答 2

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);
    }
}
于 2012-12-29T00:02:58.717 回答
1

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

SixteenBitSample = ( ThirtyTwoBitSample / 4294967295 ) * 65536;

编辑:

对于立体声到单声道部分,如果两个通道具有相同的数据,只需转储其中一个,否则,将波形加在一起,如果它们超出采样范围 ( 65,536),那么您将不得不按比例缩小它们类似于上面的等式。

希望有帮助。

于 2012-12-21T18:56:10.860 回答