永发信息网

c#录音功能怎么实现

答案:2  悬赏:60  手机版
解决时间 2021-01-02 23:19
  • 提问者网友:趣果有间
  • 2021-01-02 09:14
c#录音功能怎么实现
最佳答案
  • 五星知识达人网友:从此江山别
  • 2021-01-02 10:52
class RecordingAudio
    {
        static int sum = 0;
        static Timer timer;

        /// 
        /// 获取当前是否是正在录制状态
        /// 

        public static bool IsRecordingAudio { get; private set; }


        [DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
        public static extern int mciSendString(
         string lpstrCommand,
         string lpstrReturnString,
         int uReturnLength,
         int hwndCallback
        );

        /// 
        /// 开始录制
        /// 

        public static void Start()
        {
            mciSendString("set wave bitpersample 16", "", 0, 0);
            mciSendString("set wave samplespersec 22050", "", 0, 0);
            mciSendString("set wave channels 1", "", 0, 0);
            mciSendString("set wave format tag pcm", "", 0, 0);
            mciSendString("open new type WAVEAudio alias movie", "", 0, 0);
            mciSendString("record movie", "", 0, 0);

            timer = new Timer(200);
            timer.Elapsed += timer_Tick;
            sum = 0;
            timer.Enabled = true;

            IsRecordingAudio = true;
        }

        private static void timer_Tick(object sender, ElapsedEventArgs e)
        {
            sum++;
        }

        /// 
        /// 停止录制,返回录制时间(进1原则)
        /// 

        /// 
        public static int Stop()
        {
            FileUtils.CheckAndCreateFolder();

            mciSendString("stop movie", "", 0, 0);
            mciSendString("save movie " + "resource/" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".wav", "", 0, 0);
            mciSendString("close movie", "", 0, 0);

            IsRecordingAudio = false;
            timer.Enabled = false;
            timer.Dispose();
            int s = sum * 200;
            return s % 1000 == 0 ? s / 1000 : s / 1000 + 1;///进1原则
        }
    }
全部回答
  • 1楼网友:低音帝王
  • 2021-01-02 11:23
c#中使用directsound录音 一.声卡录音的基本原理 为了实现一个录音的基本过程,至少需要以下对象的支持: 1. 录音设备,对我们的pc设备就是声卡。这个录音设备可以进行的操作应该有开始和关闭。 2. 缓冲区,也就是录制的声音放在哪里的问题。 二.directsound对录音的描述模型 1. directsound对录音的支持类 &#216; capture,设备对象,可以看作是声卡的描述。 &#216; capturebuffer,缓冲区对象,存放录入的音频数据。 &#216; notify,事件通知对象,由于录音是一个长时间的过程,因此使用一个缓冲队列(多个缓冲区)接收数据,每当一个缓冲区满的时候,系统使用这个对象通知应用程序取走这个缓冲区,并继续录音。 以上三个对象是进行录音操作的主要对象,由于在c++中对directsound的操作directx帮助文档中已经有很详细的说明,这里就不再赘述了。本文是针对managed code。除了以上三个主要的directsound类,还需要以下几个辅助类。 &#216; waveformat,描述了进行录制的声音波形的格式,例如采样率,单声道还是立体声,每个采样点的长度等等。 &#216; thread,线程类,由于录音的过程是需要不断处理缓冲区满的事件,因此新建一个线程对此进行单独处理。 &#216; autoresetevent,通知的事件,当缓冲区满的时候,使用该事件作为通知事件。 三.代码解析(soundrecord类) 1.需要引用的程序集 using system; using system.windows.forms; using system.threading; using system.io; // 对directsound的支持 using microsoft.directx; using microsoft.directx.directsound; 2. soundrecord的成员数据 public const int cnotifynum = 16; // 缓冲队列的数目 private int mnextcaptureoffset = 0; // 该次录音缓冲区的起始点 private int msamplecount = 0; // 录制的样本数目 private int mnotifysize = 0; // 每次通知大小 private int mbuffersize = 0; // 缓冲队列大小 private string mfilename = string.empty; // 文件名 private filestream mwavefile = null; // 文件流 private binarywriter mwriter = null; // 写文件 private capture mcapdev = null; // 音频捕捉设备 private capturebuffer mrecbuffer = null; // 缓冲区对象 private notify mnotify = null; // 消息通知对象 private waveformat mwavformat; // 录音的格式 private thread mnotifythread = null; // 处理缓冲区消息的线程 private autoresetevent mnotificationevent = null; // 通知事件 3. 对外操作的函数 /// /// 构造函数,设定录音设备,设定录音格式. /// </summary&
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯