c# 窗體 錄制音頻文件程序


.NET的音頻處理類庫 NAudio

是一款開源的用於.NET平台下的音頻處理類庫,提供了很多方法來操控音頻數據。

NAudio類庫在VS2017版本上NuGet包下載並引用到項目。

 

我做了一個音頻錄制程序,特別簡單,效果圖如下

 

點擊開始錄制,程序運行時在特定的文件目錄中生成一個.wav音頻文件,停止錄制后就可以查看錄制的音頻了

在這個程序例子中,你將看到如何創建一個非常簡單的WinForms應用程序,將音頻記錄到WAV文件中。

首先,選擇錄制音頻的放置位置。它將轉到桌面上文件夾中調用recorded.wavNAudio文件:

var outputFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "NAudio");
            Directory.CreateDirectory(outputFolder);
            var outputFilePath = Path.Combine(outputFolder, "recorded.wav");
View Code  

 

接下來,創建錄制設備。我將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在我們的錄制設備上處理該事件。我們DisposeWaveFileWriter它修正了頭在我們的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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM