2012-12-21 139 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。 :我在最終版本中使用了浮點...查看我的解決方案。 –