NAudio C#:如何从 WaveInEventArgs 获取字节数组以进行进一步操作

Posted

技术标签:

【中文标题】NAudio C#:如何从 WaveInEventArgs 获取字节数组以进行进一步操作【英文标题】:NAudio C#: How to obtain a byte array from WaveInEventArgs for further manipulation 【发布时间】:2014-09-23 08:53:57 【问题描述】:

我开发了一个正在运行的 android 应用程序,并且正在尝试制作它的 C# 版本。我一直在尝试检索缓冲区数据并将其传递到字节数组中。我已将我的项目引用到 NAudio 等。

我的项目现在使我能够读取麦克风输入并通过扬声器输出,几乎没有延迟,因为我已经以编程方式调整了延迟。但是,我在尝试检索缓冲区数据时遇到了困难,如何使用 waveInEventArgs?我确实了解来自 waveIn 的数据被传递到 waveInEventArgs.buffer 但我无法检索缓冲区数据来放置它。我该怎么办?

这是我的代码:

    private void RecorderOnDataAvailable(object sender, WaveInEventArgs waveInEventArgs)
    
        bufferedWaveProvider.AddSamples(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded);
    

    public String processAudioFrame(short[] audioFrame)
    
        double rms = 0;
        for (int i = 0; i < audioFrame.Length; i++)
        
            rms += audioFrame[i] * audioFrame[i];
        

        rms = Math.Sqrt(rms / audioFrame.Length);

        double mGain = 2500.0 / Math.Pow(10.0, 90.0 / 20.0);
        double mAlpha = 0.9;
        double mRmsSmoothed = 0;

        //compute a smoothed version for less flickering of the display
        mRmsSmoothed = mRmsSmoothed * mAlpha + (1 - mAlpha) * rms;
        double rmsdB = 20.0 * Math.Log10(mGain * mRmsSmoothed);

        //assign values from rmsdB to debels for comparison in errorCorrection() method
        double debels = rmsdB + 20;

        String value = debels.ToString();
        return value;
    

变量值将作为字符串返回,以在我在设计中实现的文本框中显示结果。

谢谢!我两天前才开始这个项目,所以非常感谢用更简单的术语解释它。

【问题讨论】:

【参考方案1】:

可能最简单的方法是使用Buffer.BlockCopy 将字节数组转换为短数组,然后将其传递给processAudioFrame 函数。像这样的:

 short[] sampleData = new short[waveInEventArgs.BytesRecorded / 2];
 Buffer.BlockCopy(waveInEventArgs.Buffer, 0, sampleData, 0, waveInEventArgs.BytesRecorded);
 var decibels = processAudioFrame(sampleData)

【讨论】:

以上是关于NAudio C#:如何从 WaveInEventArgs 获取字节数组以进行进一步操作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# NAudio 操作字节?

C# NAudio 如何强制/硬编码音频设备(声卡)?

Nadio - 多声音设备播放和录音问题

如何使用 Naudio 和 c# 修剪 mp3 帧的标题和边信息

C# NAudio:如何访问 SignalGenerator 提供的样本以将它们保存为 WAVE 格式?

在 WPF C# 中使用 NAudio 录制音频