我一直在尝试将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:
}
非常感谢任何帮助!
答案 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,295
,16-bit
样本可以高达65,536
。因此,您必须缩小32-bit
样本以适应16-bit
样本的范围。或多或少,你正在做这样的事情......
SixteenBitSample = ( ThirtyTwoBitSample / 4294967295 ) * 65536;
编辑:
对于立体声到单声道部分,如果两个声道具有相同的数据,只需转储其中一个,否则,将波形加在一起,如果它们超出样本范围(65,536
),则你必须按照上面的等式缩小它们。
希望有所帮助。