C#录音判断是否在说话

调试这个方法的时候千万别断电调试,因为这样你是永远通过不了的,只有运行起来看打印的值,你才能看明白。  C#录音 你只要替换这个一个方法就行。 

 

private void RecordCapturedData()
        {
            byte[] CaptureData = null;
            int ReadPos;
            int CapturePos;
            int LockSize;
            mRecBuffer.GetCurrentPosition(out CapturePos, out ReadPos);
            LockSize = ReadPos - mNextCaptureOffset;
            if (LockSize < 0)
                LockSize += mBufferSize;
            // 对齐缓冲区边界,实际上由于开始设定完整,这个操作是多余的.
            LockSize -= (LockSize % mNotifySize);
            if (0 == LockSize)
                return;

            if (mWriter == null)
                return;
            // 读取缓冲区内的数据
            CaptureData = (byte[])mRecBuffer.Read(mNextCaptureOffset, typeof(byte), LockFlag.None, LockSize);
            // 写入Wav文件
            mWriter.Write(CaptureData, 0, CaptureData.Length);
            // 更新已经录制的数据长度.
            mSampleCount += CaptureData.Length;
            // 移动录制数据的起始点,通知消息只负责指示产生消息的位置,并不记录上次录制的位置
            mNextCaptureOffset += CaptureData.Length;
            mNextCaptureOffset %= mBufferSize; // Circular buffer

            double[] _waveLeft = new double[CaptureData.Length / 4];
            double[] _waveRight = new double[CaptureData.Length / 4];

            // Split out channels from sample
            int h = 0;
            for (int i = 0; i < CaptureData.Length; i += 4)
            {
                _waveLeft[h] = (double)BitConverter.ToInt16(CaptureData, i);
                _waveRight[h] = (double)BitConverter.ToInt16(CaptureData, i + 2);
                h++;
            }


            double sum = 0;
            foreach (double item in _waveLeft)
            {
                if (item > 0)
                    sum += item;
                else
                    sum += -item;
            }

            double result = (double)(((sum / _waveLeft.Length)) / 32768 * 1000);  //这个是算分倍率的一个公式 一般大于30分贝 就代表有声音

            double docap = 22000 * 2 * 4;
            timeNoSpeake += CaptureData.Length / docap;

            timeSecond += CaptureData.Length / docap;


           Console.WriteLine("分贝2:" + result + "时间:" + timeNoSpeake);   //这里是打印分贝

 

                            
            }

            #endregion
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值