如何从NAudio WaveIn构建16位样本?

时间:2012-04-19 03:12:18

标签: naudio

我正在使用NAudio使用以下代码阅读麦克风:

    WaveIn waveInStream;
    WaveFileWriter waveFileWriter;

    private void Form1_Load(object sender, EventArgs e)
    {
        waveInStream = new WaveIn();
        waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);
        waveInStream.StartRecording();
        waveFileWriter = new WaveFileWriter("D:\\output.wav", waveInStream.WaveFormat);
    }

    void waveInStream_DataAvailable(object sender, WaveInEventArgs e)
    {
        UInt64 allVals = 0;
        for (int i = 0; i < e.BytesRecorded; i += 2)
        {
            allVals += (UInt64)(((int)e.Buffer[0] << 16) | ((int)e.Buffer[1]));
        }
        UInt64 avg = allVals / ((UInt64)e.BytesRecorded * 2);
        avg /= 1000;
        textBox1.AppendText(avg.ToString() + "\r\n");
        waveFileWriter.Write(e.Buffer, 0, e.BytesRecorded);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        waveInStream.StopRecording();
        waveInStream.Dispose();
        waveFileWriter.Close();
    }

我没有使用平均代码。但我怀疑我正在使用正确的字节顺序正确构造16位值。我尝试了两种方法,但我没有得到与房间声音水平成比例的值。

1 个答案:

答案 0 :(得分:2)

16位样本已签名,零代表静默,因此您尝试使用无符号值计算平均值将无效。您应该使用Int16样本的绝对值。

如果您不熟悉位移,则将字节转换为样本的另一种方法是使用BitConverter类(您显示的代码不起作用)。