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

如何从NAudio WaveIn构造16位样本?,naudio,Naudio,我正在使用NAudio读取麦克风,使用以下代码: WaveIn waveInStream; WaveFileWriter waveFileWriter; private void Form1_Load(object sender, EventArgs e) { waveInStream = new WaveIn(); waveInStream.DataAvailable += new EventHandler<WaveInE

我正在使用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();
    }
WaveIn-waveInStream;
波形发生器;
私有void Form1\u加载(对象发送方、事件参数e)
{
waveInStream=新的WaveIn();
waveInStream.DataAvailable+=新事件处理程序(waveInStream_DataAvailable);
waveInStream.StartRecording();
waveFileWriter=新的waveFileWriter(“D:\\output.wav”,waveInStream.WaveFormat);
}
无效waveInStream_数据可用(对象发送方,WaveInEventArgs e)
{
UInt64 allVals=0;
对于(int i=0;iallVals+=(UInt64)((int)e.Buffer[0]16位样本是有符号的,零表示静默,因此使用无符号值计算平均值的尝试无效。您应该使用
Int16
样本的绝对值


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

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


如果您对位移位不满意,另一种将字节转换为样本的方法是使用
位转换器
类(您显示的代码不工作)。

谢谢!我知道我有一些理论上的误解。谢谢!我知道我有一些理论上的误解。