2012-12-21 137 views
2

我一直在尝试将32位立体声wav转换为16位单声道wav。我使用naudio捕捉声音,并认为只使用四个更重要的字节中的两个就可以工作。Naudio - 将32位wav转换为16位wav

下面是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

我终于找到了解决方案。我只需要将转换后的值乘以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

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

SixteenBitSample = (ThirtyTwoBitSample/4294967295) * 65536; 

编辑:

对于立体声到单声道部分,如果这两个通道具有相同的数据,只是把它们扔掉的一个,否则,将波形加在一起,如果它们落在样本范围之外(65,536),则必须按照上述公式将其缩小。

希望有所帮助。

+0

16位采样被签名; 32位样本不可能是首位整数(浮点代替) –

+0

感谢您的帮助!我一定是做错了,因为它不像你说的那样工作。对于立体声到单声道,我成功地在我的应用程序中使用了立体声信号,这更好。谢谢! –

+0

@RomanR。 :我在最终版本中使用了浮点...查看我的解决方案。 –