如何实时获取麦克风的输入音量?

ssr奥利奥 2017-12-28 05:25:10

像是这样的,用百分比显示当前麦克风的输入音量
...全文
1154 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wy_zhou 2019-11-05
  • 打赏
  • 举报
回复
请问二楼的前辈,有没有VB.net 的代码,现在正在写一个通过检测麦克风的输入数值在屏幕上划波纹的东西,请指教,谢谢!
秋的红果实 2017-12-28
  • 打赏
  • 举报
回复
收藏了,学习下
wanghui0380 2017-12-28
  • 打赏
  • 举报
回复
这个你需要先用音频捕获工具得到pcm数据 然后根据下面公式计算 一。声压方式计算
引用
SPL=20LOG(10)[p(e)/p(ref)]   其单位是分贝。   在空气中参考声压p(ref)一般取为2*10E-5帕,这个数值是正常人耳对1千赫声音刚刚能觉察其存在的声压值,也就是1千赫声音的可听阈声压。一般讲,低于这一声压值,人耳就再也不能觉察出这个声音的存在了。显然该可听阈声压的声压级即为零分贝。 p(e) = I * ρv =(P^2) = 音量的平方
。 二.方差方式
引用
function vol2 = calcVolume2(data, len) sum = sum(data) / len ; sqr = sum(data.*data) / len; vol2 = sqrt( sqr - sum * sum);
当然pcm数据本身因为你设置的采集率和通道的关系,每一个采集点的byte[]不一样,我下面只用16bit单通/8bit双通使用方差方式计算(这两种都是byte[2]是一个采集点,所以可以通用)
/// <summary>
        /// 计算音量 适用16bit单通/8bit双通
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static double getVolume(byte[] buffer)
        {
            try
            {
                double sumVolume = 0.0;
                double avgVolume = 0.0;
                double volume = 0.0;
                int length = buffer.Length;
                for (int i = 0; i < length; i += 2)
                {
                    int v1 = buffer[i] & 0xFF;
                    int v2 = buffer[i + 1] & 0xFF;
                    int temp = v1 + (v2 << 8);// 小端
                    if (temp >= 0x8000)
                    {
                        temp = 0xffff - temp;
                    }
                    sumVolume += Math.Abs(temp);
                }
                avgVolume = sumVolume / length / 2;
                volume = Math.Log((1 + avgVolume), 10) * 10;
                return volume;
            }
            catch (Exception ex)
            {
               // logger.Error(ex);
                return 0;
            }
        }

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧