免责声明:我对 NAudio 没有太多经验。
这在某种程度上取决于您想如何处理音频数据。
如果您只是想存储或转储数据(无论是文件目标还是只是控制台),那么您不需要BufferedWaveProvider
。只需直接在事件处理程序中做任何您想做的事情sourceStream_DataAvailable()
。但请记住,您接收的数据是原始字节,即实际构成录制音频的单个帧(也称为样本)的字节数取决于波形格式:
var bytesPerFrame = sourceStream.WaveFormat.BitsPerSample / 8
* sourceStream.WaveFormat.Channels
如果您想分析数据(例如,使用 FFT 进行傅立叶分析),那么我建议使用 NAudioISampleProvider
。该接口隐藏了所有原始字节、位深度的内容,让您可以轻松地逐帧访问数据。
首先创建一个ISampleProvider
从你的BufferedWaveProvider
像这样:
var samples = waveBuffer.ToSampleProvider();
然后您可以使用以下命令访问示例框架Read()
方法。确保检查数据是否确实可用BufferedBytes
您的财产BufferedWaveProvider
:
while (true)
{
var bufferedFrames = waveBuffer.BufferedBytes / bytesPerFrame;
if (bufferedFrames < 1)
continue;
var frames = new float[bufferedFrames];
samples.Read(frames, 0, bufferedFrames);
DoSomethingWith(frames);
}
因为您想同时做两件事——同时记录和分析音频数据——所以您应该为此使用两个单独的线程。
有一个使用 NAudio 的小型 GitHub 项目 https://github.com/bert2/DtmfDetection用于录制音频数据的 DTMF 分析。您可能想了解一些如何将它们整合在一起的想法。文件DtmfDetector\Program.cs https://github.com/bert2/DtmfDetection/blob/master/DtmfDetector/Program.cs有一个良好的起点。
为了快速启动并为您提供“更连贯”的输出,请尝试以下操作:
将此字段添加到您的类中:
ISampleProvider samples;
将此行添加到您的方法中startRecording()
:
samples = waveBuffer.ToSampleProvider();
Extend sourceStream_DataAvailable()
像这样:
void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
{
waveBuffer.AddSamples(e.Buffer, 0, e.BytesRecorded);
waveBuffer.DiscardOnBufferOverflow = true;
var bytesPerFrame = sourceStream.WaveFormat.BitsPerSample / 8
* sourceStream.WaveFormat.Channels
var bufferedFrames = waveBuffer.BufferedBytes / bytesPerFrame;
var frames = new float[bufferedFrames];
samples.Read(frames, 0, bufferedFrames);
foreach (var frame in frames)
Debug.WriteLine(frame);
}