美文网首页
小程序实时采集声波

小程序实时采集声波

作者: 又菜又爱分享的小肖 | 来源:发表于2021-11-30 21:15 被阅读0次

最近公司想做一个小程序, 有个功能就是声控, 判断用户声音的大小, 去让机器执行多大的频率.
怎么做?
官网网站并没有明确的api给你提供, 正当我疑惑的时候, 我查看官方文档看到 frameBuffer, 查了很多资料,渐渐找到了解决方式

image.png

onFrameRecorded 传过来的是MP3帧,但是,这个帧有的时候是不完整的帧,好像是小程序的性能问题或者之类的其他问题。
使用js-mp3,把MP3帧解码成PCM数据,然后再按照pcm数据,来计算分贝数。

npm i js-mp3
  • 踩坑的地方:
    1.famebuffer设置的太小,造成传过来的arrayBuffer里面没有一个完整的mp3帧,结果就是Decode失败。以为是小程序的黑箱问题。
    2.js-mp3声称自己不支持mpeg2,感觉心里凉了半截,后来“高坚果”给了一个表格:


    image.png

    原来是采样率设置问题,修改为44.1khz采样率,搞定。

  1. 效率很差。因为中间经过了mp3压缩,然后再解码,再判断分贝大小,所以,效率真的很差。不过能解决问题的办法都是好办法

代码如下:
先让uni.getRecorderManager()变成全局

var _this = this;
_this.rec = uni.getRecorderManager();

再通过Mp3压缩进行计算

_this.rec.onFrameRecorded(function(res) {
                // console.log(res);
                if (res.isLastFrame) return; // 为true当前帧是否正常录音结束前的最后一帧
                const { frameBuffer } = res
                var decoder = Mp3.newDecoder(frameBuffer); // 压缩
                if (decoder != null) { 
                    var pcmArrayBuffer = decoder.decode()
                    var pcmArr = new Int16Array(pcmArrayBuffer)
                    var size = pcmArr.length
                    var sum = 0;
                    for (var i = 0; i < size; i++) {
                        sum += Math.abs(pcmArr[i]);
                    }
                    var powerLevel = sum * 500.0 / (size * 16383);
                    if (powerLevel >= 100) {
                        powerLevel = 100
                    }
                    if (powerLevel <= 5) {
                        powerLevel = 2
                    }
                    powerLevel = parseInt(powerLevel);
                    var db = Math.floor(120 * (powerLevel / 100));
                    powerLevel = Math.floor(-108 + 108 * 2 * (powerLevel / 100));
                    if(db >= 40){ // 大于等于40为交流声, 显示
                        console.log(db);
                    }
                    
                }
            })
            }

完整代码可访问github, 如果对你有帮助, 点个赞呗
https://github.com/xxj435/smi_demo

相关文章

网友评论

      本文标题:小程序实时采集声波

      本文链接:https://www.haomeiwen.com/subject/cwtjxrtx.html