分类目录

链接

2023 年 3 月
 12345
6789101112
13141516171819
20212223242526
2728293031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > 前端 > 正文
h5吹气互动(利用recorderjs获取输入音量大小)
前端 暂无评论 阅读(255)

h5吹气互动原理是利用获取麦克风音量,用一段逻辑来判断。研究了半天~

最开始用的是下面这种方法(在ios下失效):

<!doctype html>
<html style="font-size: calc((100vw / 375)*10)">
<head>
    <meta charset="utf-8" ></meta>
    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />
    <title>Disney Spring Web - voice!</title>
    <script src="./recorder.mp3.min.js"></script>   
</head>
<body>
    <div class="container" id="container"> 
        <div id="status">0</div>
        <div id="log">log...</div>
    </div> 
</body>
</html>

 

let mystatus = document.getElementById('status');
        let log = document.getElementById('log');

        window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;

        navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia ||navigator.mediaDevices.getUserMedia;

        if(!navigator.getUserMedia){
            mystatus.innerHTML = "您的浏览器不支持获取音频。";
            log.innerHTML+="您的浏览器不支持获取音频。";
        }

        function onSuccess(stream){
            log.innerHTML+="onSuccess";
            mystatus.innerHTML = "获取音量中...";

            audioContext = window.AudioContext || window.webkitAudioContext;
            context = new audioContext(); //创建一个管理、播放声音的对象

            liveSource = context.createMediaStreamSource(stream); //将麦克风的声音输入这个对象
            var levelChecker = context.createScriptProcessor(4096,1,1); //创建一个音频分析对象,采样的缓冲区大小为4096,输入和输出都是单声道
            liveSource.connect(levelChecker); //将该分析对象与麦克风音频进行连接
            levelChecker.connect(context.destination);
            levelChecker.onaudioprocess = function(e) { //开始处理音频
                var buffer = e.inputBuffer.getChannelData(0); //获得缓冲区的输入音频,转换为包含了PCM通道数据的32位浮点数组

                console.log(buffer);
                //创建变量并迭代来获取最大的音量值
                var maxVal = 0; 
                for (var i = 0; i < buffer.length; i++) {
                    if (maxVal < buffer[i]) {
                        maxVal = buffer[i];
                    }
                }
                //显示音量值
                mystatus.innerHTML = "您的音量值:"+Math.round(maxVal*100);
                if(maxVal>.5){
                    //当音量值大于0.5时,显示“声音太响”字样,并断开音频连接
                    mystatus.innerHTML = "您的声音太响了!!";
                    liveSource.disconnect(levelChecker);
                }
            };
        }

        function onError(e){
            log.innerHTML+=e;
            mystatus.innerHTML = "获取音频时好像出了点问题。";
        }

        try{
            navigator.getUserMedia({audio: true}, onSuccess, onError);

        }catch(err){
            log.innerHTML+=err;
        }

 

最后使用了开源的recorderjs:

recorderjs 开源地址: https://github.com/xiangyuecn/Recorder

var rec;
function startRec(){
    rec=Recorder({
        type:"mp3"
        ,sampleRate:16000
        ,bitRate:16 
        ,onProcess:function(buffers,powerLevel,bufferDuration,bufferSampleRate){ 
            var buffer = buffers[buffers.length-1]; 
            console.log(buffer); 
            // var buffer = buffers.getChannelData(0); //获得缓冲区的输入音频,转换为包含了PCM通道数据的32位浮点数组
            //创建变量并迭代来获取最大的音量值

            var maxVal = 0; 
            for (var i = 0; i < buffer.length; i++) {
                if (maxVal < buffer[i]) {
                    maxVal = buffer[i];
                }
            }
            //显示音量值
            console.log(maxVal);
            mystatus.innerHTML += "<br />您的音量值:"+Math.round(maxVal/100);
            if(maxVal>300){ 
                //mystatus.innerHTML = "吹气成功!!"; 
                  rec.stop();
            }

        }

    });//使用默认配置,mp3格式
    
    //打开麦克风授权获得相关资源
    rec.open(function(){ 
        //开始录音
        rec.start();
    },
    function(msg,isUserNotAllow){
        //用户拒绝了权限或浏览器不支持
        alert((isUserNotAllow?"用户拒绝了权限,":"")+"无法录音:"+msg);
    });
};

//开始
startRec();

//3秒后自动结束,
setTimeout(function(){
    rec.stop();
}, 3000);

 

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:h5吹气互动(利用recorderjs获取输入音量大小) | Bruce's Blog

发表评论

留言无头像?