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