using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NAudio.Wave;
using System.IO;

namespace WindowsVIKI
{
    public class NAudioRecorder
    {
        public WaveIn waveSource = null;
        public WaveFileWriter waveFile = null;
        private string fileName = string.Empty;

        /// <summary>
        /// 开始录音
        /// </summary>
        public void StartRec()
        {
            try
            {
                waveSource = new WaveIn();
                waveSource.WaveFormat = new WaveFormat(16000, 16, 1); // 16bit,16KHz,Mono的录音格式
                waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
                waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
                waveFile = new WaveFileWriter(fileName, waveSource.WaveFormat);
                waveSource.StartRecording();
            }
            catch { }
        }

        /// <summary>
        /// 停止录音
        /// </summary>
        public void StopRec()
        {
        //  waveSource.StopRecording();

            if (waveSource != null)
            {
                waveSource.Dispose();
                waveSource = null;
            }

            if (waveFile != null)
            {
                waveFile.Dispose();
                waveFile = null;
            }
        }

        /// <summary>
        /// 停止录音
        /// </summary>
        public void PauseRec()
        {
            waveSource.StopRecording();
        }

        /// <summary>
        /// 录音结束后保存的文件路径
        /// </summary>
        /// <param name="fileName">保存wav文件的路径名</param>
        public void SetFileName(string fileName)
        {
            this.fileName = fileName;
        }

        /// <summary>
        /// 开始录音回调函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
        {
            if (waveFile != null)
            {
                waveFile.Write(e.Buffer, 0, e.BytesRecorded);
                waveFile.Flush();
                try
                {
                    if(Form1._record_status  == Form1.RecordStatus.On){
                        Form1.wss_viki.Send(e.Buffer);
                    }
                }
                catch (Exception ex) {
                    Form1._record_status = Form1.RecordStatus.Off;
                }
            }

        }

        /// <summary>
        /// 录音结束回调函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void waveSource_RecordingStopped(object sender, StoppedEventArgs e)
        {
            if (waveSource != null)
            {
                waveSource.Dispose();
                waveSource = null;
            }

            if (waveFile != null)
            {
                waveFile.Dispose();
                waveFile = null;
            }
        }

    }
}



	/// <summary>
	/// 录音对象
	/// </summary>
	NAudioRecorder recorder;
	    
	outputFolder = System.Windows.Forms.Application.StartupPath;
	Directory.CreateDirectory(outputFolder);
	var currentFileName = String.Format("viki-{0:yyy-MM-dd HH-mm-ss}.wav", DateTime.Now);
	audioFile = Path.Combine(outputFolder + "/record_file/", currentFileName);
	recorder = new NAudioRecorder();
	recorder.SetFileName(audioFile);


引用控件下载:NAudio.dll