首页 > 其他分享 >js 根据声音绘制声音图

js 根据声音绘制声音图

时间:2023-07-17 15:12:51浏览次数:33  
标签:声音 cxt js width radius let navigator height 绘制

js 获取麦克风,根据声音大小绘制图形   条状图

//麦克风测试
    showaudiotset() {
      let that = this;//setInfo.mikeId 当前麦克风设备id
      let curaudio = that.mikeArr.filter(
        (v) => v.deviceId == that.setInfo.mikeId
      )[0];
      // 老的浏览器可能根本没有实现 mediaDevices,所以我们可以先设置一个空的对象
      if (navigator.mediaDevices === undefined) {
        navigator.mediaDevices = {};
      }
      if (navigator.mediaDevices.getUserMedia === undefined) {
        navigator.mediaDevices.getUserMedia = function (constraints) {
          // 首先,如果有getUserMedia的话,就获得它
          var getUserMedia =
            navigator.webkitGetUserMedia ||
            navigator.mozGetUserMedia ||
            navigator.msGetUserMedia;
          // 一些浏览器根本没实现它 - 那么就返回一个error到promise的reject来保持一个统一的接口
          if (!getUserMedia) {
            return Promise.reject(
              new Error("getUserMedia is not implemented in this browser")
            );
          }
          // 否则,为老的navigator.getUserMedia方法包裹一个Promise
          return new Promise(function (resolve, reject) {
            getUserMedia.call(navigator, constraints, resolve, reject);
          });
        };
      }
      const constraints = {
        audio: {
          deviceId: curaudio.deviceId,
          groupId: curaudio.groupId
        },
        video: false
      };
      let promise = navigator.mediaDevices.getUserMedia(constraints);
      promise.then((stream) => {
        var context = new window.AudioContext();
        var source = context.createMediaStreamSource(stream);
        var analyser = context.createAnalyser();
        source.connect(analyser);
        analyser.fftSize = 2048;
        analyser.minDecibels = -100;
        analyser.maxDecibels = 100;
        analyser.smoothingTimeConstant = 0;
        var maxDecibels = 0;
        let themecolor = this.$store.state.themeObj.themecolor || "#960200";
        let canvas = document.getElementById("audio_canvas");
        if (this.time2) {
          clearInterval(this.time2);
        }
        this.time2 = setInterval(() => {
          var dataArr = new Uint8Array(analyser.frequencyBinCount);
          analyser.getByteFrequencyData(dataArr);
          var mcVolume =
            dataArr.reduce(function (a, b) {
              return a + b;
            }) / analyser.frequencyBinCount;
          maxDecibels = maxDecibels > mcVolume ? maxDecibels : mcVolume;
          var p = parseInt((mcVolume / maxDecibels) * 100);
          let domwidth = 300;
          let domheight = 30;
          canvas.width = domwidth;
          canvas.height = domheight;
          let width = canvas.width,
            height = canvas.height,
            g = canvas.getContext("2d");
          let num = 15;
          let space = 12;
          let barwidth = (width - (num - 1) * space) / num;
          g.clearRect(0, 0, width, height);
          let shounum = parseInt((p * num) / 255 + "");
          for (let i = 0; i < num; i++) {
            let x = space * i + i * barwidth;
            let colorstr = "#DDDDDD";
            if (i < shounum) {
              colorstr = themecolor;
            }
            this.fillRoundRect(
              g,
              x,
              0,
              barwidth,
              height,
              barwidth / 2,
              colorstr
            );
          }
        }, 200);
      });
    },
    fillRoundRect(cxt, x, y, width, height, radius, /*optional*/ fillColor) {
      //圆的直径必然要小于矩形的宽高
      radius = Math.min(width / 2, height / 2, radius);
      if (radius < 0) {
        radius = 0;
      }
      cxt.save();
      cxt.translate(x, y);
      //绘制圆角矩形的各个边
      this.drawRoundRectPath(cxt, width, height, radius);
      cxt.fillStyle = fillColor || "#000";
      cxt.fill();
      cxt.restore();
    },
    drawRoundRectPath(cxt, width, height, radius) {
      cxt.beginPath();
      //从右下角顺时针绘制,弧度从0到1/2PI
      cxt.arc(width - radius, height - radius, radius, 0, Math.PI / 2);

      //矩形下边线
      cxt.lineTo(radius, height);

      //左下角圆弧,弧度从1/2PI到PI
      cxt.arc(radius, height - radius, radius, Math.PI / 2, Math.PI);

      //矩形左边线
      cxt.lineTo(0, radius);

      //左上角圆弧,弧度从PI到3/2PI
      cxt.arc(radius, radius, radius, Math.PI, (Math.PI * 3) / 2);

      //上边线
      cxt.lineTo(width - radius, 0);

      //右上角圆弧
      cxt.arc(width - radius, radius, radius, (Math.PI * 3) / 2, Math.PI * 2);

      //右边线
      cxt.lineTo(width, height - radius);
      cxt.closePath();
    },

 

标签:声音,cxt,js,width,radius,let,navigator,height,绘制
From: https://www.cnblogs.com/guozhongbo/p/17560153.html

相关文章

  • Reactjs学习笔记
    本篇是关于React的简介ReactJS是Facebook推出的一款前端框架,2013年开源,提供了一种函数式编程思想,拥有比较健全的文档和完善的社区,在React16的版本中对算法进行了革新,称之为ReactFiber。开发环境搭建需要nodeJS解析器,以及npm(node的包管理工具)如何引用React1.使用.js来引入......
  • MySQL中对JSON数据操作(较全)
    MySQL对JSON数据操作链接:(160条消息)【MySQL】对JSON数据操作(全网最全)_mysqljson_0世界和平0的博客-CSDN博客创建json格式字段CREATETABLE`dept`(`id`int(11)NOTNULL,`dept`varchar(255)DEFAULTNULL,`json_value`jsonDEFAULTNULL,PRIMARYKEY(`id......
  • 直播app开发搭建,JS生成随机数,生成指定位数的随机数
    直播app开发搭建,JS生成随机数,生成指定位数的随机数//获取随机数,小数第一位可能为0console.log(Math.random()); //获取10位随机数,如果小数第一位为0则只有9位数console.log(Math.floor(Math.random()*Math.pow(10,10))); //随机数+1,解决小数第一位为0的情况//但是会导致随机......
  • java怎么将json数组设置编码格式
    项目方案:JavaJSON数组编码格式设置1.项目背景和目标本项目旨在探讨如何使用Java编程语言将JSON数组设置为指定的编码格式。JSON(JavaScriptObjectNotation)是一种常用的数据交换格式,它使用文本格式来表示数据,易于人类阅读和编写,同时也易于机器解析和生成。在实际项目中,我们经常......
  • js复制网页上的内容到剪切板
    js复制网页上的内容到剪切板2023-07-17测试,原来的代码已经没用了,现用下面的代码,在firefox和edge上测试成功functionaaa(){vartxt=$('#hfDesc').val();navigator.clipboard.writeText(txt).then(()=>{......
  • Vue3 遍历显示Json数组
    在Vue项目中遍历显示Json数组以列表的形式显示的页面上 main.js全局json对象//全局jsonconstglobalData=reactive({extTelTalkData:[{userExten:"1000",userName:"刘亦菲",callStatus:"通话"},......
  • 复杂数据回显 返回json 字符串转换成单选
     <el-table        :data="tableData"        border        style="width:882px;margin-left:8px;">        <el-table-column        prop="label"        label="......
  • js 数组join,内容用序号连接
    要将数组内容用序号连接,你可以使用JavaScript的`Array.prototype.map()`方法和`Array.prototype.join()`方法来实现。下面是一个示例代码:```javascriptconstarr=["apple","banana","orange"];constjoinedString=arr.map((item,index)=>`${index+1}.${item}`)......
  • js:http-vue-loader从浏览器直接引入vue文件
    docgithub:https://github.com/FranckFreiburger/http-vue-loaderindex.html<!doctypehtml><htmllang="en"><head><scriptsrc="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script><s......
  • js 文件 朗读功能实现
    创建一个加载器使用window的speechSynthesis对象letbofangqi=window.speechSynthesis()再创建一个阅读器实例对象letreader=newSpeechSynthesisUtterance()设置阅读器的阅读方式:reader.text='这里是需要阅读的文本'reader.rate='1.5'//这个是倍速reader.lang='zh-......