.NET的音频处理类库 NAudio
是一款开源的用于.NET平台下的音频处理类库,提供了很多方法来操控音频数据。
NAudio类库在VS2017版本上NuGet包下载并引用到项目。
我做了一个音频录制程序,特别简单,效果图如下
点击开始录制,程序运行时在特定的文件目录中生成一个.wav音频文件,停止录制后就可以查看录制的音频了
在这个程序例子中,我们将看到如何创建一个非常简单的WinForms应用程序,将音频记录到WAV文件中。
首先,让我们选择录制音频的放置位置。它将转到桌面上文件夹中调用recorded.wav
的NAudio
文件:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
var outputFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "NAudio"); Directory.CreateDirectory(outputFolder); var outputFilePath = Path.Combine(outputFolder, "recorded.wav");
接下来,让我们创建录制设备。我将WaveInEvent
在这种情况下使用。我们也可以使用WaveIn
或确实使用WasapiCapture
。
var waveIn = new WaveInEvent();
我会声明一个WaveFileWriter
但是在我们开始录制之前它不会被创建:
WaveFileWriter writer = null ;
让我们设置我们的表格。它将有两个按钮 - 一个启动,一个停止录制。我们将声明一个closing
标志,以便我们在表单关闭时停止录制。
现在我们需要一些事件处理程序。当我们点击时Record
,我们将创建一个新的WaveFileWriter
,指定要创建的WAV文件的路径和我们正在录制的格式。这必须与录制设备格式相同,因为我们将接收录制数据的格式所以我们用waveIn.WaveFormat
。
然后我们开始录制waveIn.StartRecording()
并适当地设置按钮启用状态。
private void btnstart_Click(object sender, EventArgs e) { writer = new WaveFileWriter(outputFilePath, waveIN.WaveFormat); waveIN.StartRecording(); label1.Enabled = true; timer1.Start(); btnstart.Enabled = false; btnstop.Enabled = true; }
我们还需要DataAvailable
输入设备上的事件处理程序。这将在我们开始录制后定期开始。我们可以将事件args中的缓冲区写入编写器。确保你写a.BytesRecorded
字节,而不是a.Buffer.Length
waveIn.DataAvailable + =(s,a)=> { writer.Write(a.Buffer, 0, a.BytesRecorded); };
我经常在录制WAV时添加的一个安全功能是限制WAV文件的大小。它们快速增长,无论如何都不能超过4GB。在这里,我要求录音在60秒后停止:
waveIN.DataAvailable += (s, a) => { writer.Write(a.Buffer, 0, a.BytesRecorded); if (writer.Position > waveIN.WaveFormat.AverageBytesPerSecond * 60) { waveIN.StopRecording(); label1.Enabled = false; timer1.Stop(); label1.Hide(); } };
现在我们需要处理停止录制按钮。这很简单,我们只是打电话waveIn.StopRecording()
。但是,我们可能仍会在DataAvailable
回调中收到更多数据,所以不要再处理你WaveFileWriter
。
waveIN.StopRecording();
我们还将添加一个安全措施,如果您在录制时尝试关闭表单,我们将调用StopRecording
并设置一个标志,以便我们知道我们也可以处理输入设备:
if (closing) { waveIN.Dispose(); }
为了安全地处理我们WaveFileWriter
(我们需要做的是为了生成有效的WAV文件),我们应该RecordingStopped
在我们的录制设备上处理该事件。我们Dispose
将WaveFileWriter
它修正了头在我们的WAV文件,以便它是有效的。然后我们设置按钮状态。最后,如果我们关闭表单,则应该处理输入设备。
waveIN.RecordingStopped += (s, a) => { writer?.Dispose(); writer = null; btnstart.Enabled = true; btnstop.Enabled = false; if (closing) { waveIN.Dispose(); } };
例子程序分享链接:https://pan.baidu.com/s/1q-7lyIme65C6t6i2CwKXaw
提取码:a7mg