.NET的音頻處理類庫 NAudio
是一款開源的用於.NET平台下的音頻處理類庫,提供了很多方法來操控音頻數據。
NAudio類庫在VS2017版本上NuGet包下載並引用到項目。
我做了一個音頻錄制程序,特別簡單,效果圖如下
點擊開始錄制,程序運行時在特定的文件目錄中生成一個.wav音頻文件,停止錄制后就可以查看錄制的音頻了
在這個程序例子中,你將看到如何創建一個非常簡單的WinForms應用程序,將音頻記錄到WAV文件中。
首先,選擇錄制音頻的放置位置。它將轉到桌面上文件夾中調用recorded.wav
的NAudio
文件:

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(); } };
女朋友3D魔方相冊鏈接
https://www.cnblogs.com/wl192/p/11511200.html