C# 以MP3的格式將錄製的音頻數據寫入文件流

using NAudio.Lame;
using NAudio.Wave;
using System;
using System.IO;

 public  class Sound_Record
    {
        public WaveIn waveSource = null;
        static LameMP3FileWriter waveFile;
        string Sound_Card_name = " ";//錄製設備名
        FileStream  nStream;
        BufferedStream buffers;
        //MMDevice enumerator;
        /// <summary>
        /// 開始錄音
        /// </summary>
        public void StartRec()
        {
            waveSource = new WaveIn();
            waveSource.WaveFormat = new WaveFormat(44100,16, 2); 
            waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
            waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
           	nStream = new FileStream(@"love.mp3", FileMode.Create);
            buffers = new BufferedStream(nStream, 2048);
            //將數據寫入文件流以MP3的格式
            waveFile = new LameMP3FileWriter(buffers, waveSource.WaveFormat,128);
			//遍歷本機的可錄製音頻數據的設備,查找自己選定的進行設置
			//如果不進行選定則只要是打開的錄製設備都進行音頻錄製
            for (int deviceid = 0; deviceid < WaveIn.DeviceCount; deviceid++)
            {
                var capabilities = WaveIn.GetCapabilities(deviceid);
                
                if (capabilities.ProductName.StartsWith(Sound_Card_name))
                {
                //設置錄製的設備是哪一個
                    waveSource.DeviceNumber = deviceid;
                }
            }
            waveSource.StartRecording();
        }

        /// <summary>
        /// 停止錄音
        /// </summary>
        public void StopRec()
        {
            waveSource.StopRecording();
            if (waveFile != null)
            {
                waveFile.Dispose();
                waveFile = null;
            }

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

      
        // 要錄製的設備名
        public void Sound_Card(String sound_cards)
        {
            Sound_Card_name = sound_cards;
        }

        /// <summary>
        /// 開始錄音回調函數
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
        {
            if (waveFile != null)
            {
            //這裏可以拿到PCM流數據
              waveFile.Write(e.Buffer, 0, e.BytesRecorded);
            } 
        }
        

        /// <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;
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章