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 获取字节数组以进行进一步操作的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Naudio 和 c# 修剪 mp3 帧的标题和边信息