如何调用浏览器录音功能,加生成.wav

 实现思路

       首先写一个立即调用函数,通过调用window.navigator.mediaDevices.getUserMedia获取用户同意权限,获取之后返回权限数据 创建MediaRecorder返回给他,做一个记录操作数据

HTML

<div id="startRecord">点我录音</div>
<div id="topRecord">结束录音</div>

1.获取用户权限

    //页面加载完毕后调用
    const stream = await (async function () {
          if (window.navigator.mediaDevices.getUserMedia) {
            return await window.navigator.mediaDevices
              .getUserMedia({ audio: true })
              .then((mediaStream) => {
                //以拥有录音权限 返回出去
                return mediaStream;
              })
              .catch((err) => {
                console.log("拒绝", err);
              });
          } else {
            console.error("浏览器不支持 getUserMedia");
          }
        })();

2.获取事件按钮

  const recordBtn = document.querySelector("#startRecord");//点击开始
  const topRecord = document.querySelector("#topRecord"); // 点击结束
  const mediaStream = new MediaRecorder(stream); // 注册实例化

3开始录音

recordBtn.onclick = function () {
          mediaStream.start();
          console.log("录音中...");
          console.log(mediaStream.state);
 };

4.结束录音

 topRecord.onclick = function () {
          if (mediaStream.state === "recording") {
            mediaStream.stop();
            console.log("录音结束");
            console.log(mediaStream.state);
          }
};

5.结束后调 mediaStream.ondataavailable 获取数据流生成wav文件

mediaStream.ondataavailable = function (value) {
          mediaStream.onstop = function () {//点击stop结束后
            let blob = new Blob([value.data], { type: "audio/ogg; codecs=opus" });
            console.log("blob: ", blob);
            var audioURL = URL.createObjectURL(blob);
            let a = document.createElement("a"); // 创建一个a标签
            a.href = audioURL;
            a.download = Date.now() + ".wav"; //下载文件
            a.click(); // 创建点击事件
          };
};

最后附上全部源码

<!DOCTYPE html>
<html>
<body>
    <div>
      <button id="startRecord">点我录音</button>
      <button id="topRecord">点我结束录音</button>
    </div>

    <script>
      window.onload = async function () {
        // 立即执行函数 获取用户权限
        const stream = await (async function () {
          if (window.navigator.mediaDevices.getUserMedia) {
            return await window.navigator.mediaDevices
              .getUserMedia({ audio: true }) // audio开启获取录音权限
              .then((mediaStream) => {
                //以拥有录音权限 返回出去
                return mediaStream;
              })
              .catch((err) => {
                console.log("拒绝", err);
              });
          } else {
            console.error("浏览器不支持 getUserMedia");
          }
        })();
        const recordBtn = document.querySelector("#startRecord");//点击开始
        const topRecord = document.querySelector("#topRecord"); // 点击结束
        const mediaStream = new MediaRecorder(stream); // 注册实例化
       
        //录音开始
        recordBtn.onclick = function () {
          mediaStream.start();
          console.log("录音中...");
          console.log(mediaStream.state);
        };
        // 结束录音
        topRecord.onclick = function () {
          if (mediaStream.state === "recording") {
            mediaStream.stop();
            console.log("录音结束");
            console.log(mediaStream.state);
          }
        };
        mediaStream.ondataavailable = function (value) {
          mediaStream.onstop = function () {
            let blob = new Blob([value.data], { type: "audio/ogg; codecs=opus" });
            console.log("blob: ", blob);
            var audioURL = URL.createObjectURL(blob);
            let a = document.createElement("a"); // 创建一个a标签
            a.href = audioURL;
            a.download = Date.now() + ".wav"; //下载文件
            a.click(); // 创建点击事件
          };
        };
      };
    </script>
  </body>
</html>