Html可视化频谱

Html可视化频谱

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>HTML5音频可视化频谱跳动代码</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    #canvas {
      display: block;
      background: linear-gradient(135deg, rgb(62, 95, 42) 0%, rgb(230, 132, 110) 100%);
    }
  </style>
</head>

<body>
  <audio id="myaudio" autoplay="autoplay" src="./bgm1.mp3"></audio>
  
  
  
  <!-- <video id="myaudio" width="800" height="350" autoplay="autoplay" loop="loop" controls="controls" src="http://cnzb24.com/home/first"></video> -->
  <!-- <audio id="myaudio" autoplay="autoplay" preload="auto" loop controls="controls" src="bgm1.mp3">  </audio> -->

  <canvas id="canvas"></canvas>
  <script>
    window.onload = function () {
      var oAudio = document.getElementById('myaudio');
      window.onclick = function () {
        if (oAudio.paused) {
          oAudio.play();
        } else {
          oAudio.pause();
        }
      }
      // 创建音频上下文对象
      var oCtx = new AudioContext();
      // console.log(oCtx);
      // 创建媒体源,除了audio本身可以获取,也可以通过oCtx对象提供的api进行媒体源操作
      var audioSrc = oCtx.createMediaElementSource(oAudio);
      // 创建分析机 
      var analyser = oCtx.createAnalyser();
      // 媒体源与分析机连接
      audioSrc.connect(analyser);
      // 输出的目标:将分析机分析出来的处理结果与目标点(耳机/扬声器)连接
      analyser.connect(oCtx.destination);

      // 效果(实现的具体方法)
      // 绘制音频图的条数(fftSize)
      /*
        根据分析音频的数据去获取音频频次界定音频图的高度
        放在与音频频次等长的8位无符号字节数组
        Uint8Array:初始化默认值为1024
      */
      // 利用cancas渐变进行音频绘制
      var ctx = canvas.getContext('2d');
      canvas.width = window.innerWidth;
      canvas.height = window.innerHeight;
      var oW = canvas.width;
      var oH = canvas.height;
      var color1 = ctx.createLinearGradient(oW / 2, oH / 2 - 30, oW / 2, oH / 2 - 100);
      var color2 = ctx.createLinearGradient(oW / 2, oH / 2 + 30, oW / 2, oH / 2 + 100);
      color1.addColorStop(0, '#000');
      color1.addColorStop(.5, '#069');
      color1.addColorStop(1, '#3b6abf');
      color2.addColorStop(0, '#000');
      color2.addColorStop(.5, '#069');
      color2.addColorStop(1, '#265f04');
      // 音频图的条数
      var count = 150;
      // 缓冲区:进行数据的缓冲处理,转换成二进制数据
      var voiceHeight = new Uint8Array(analyser.frequencyBinCount);
      // console.log(voiceHeight);

      function draw() {
        // 将当前的频率数据复制到传入的无符号字节数组中,做到实时连接
        analyser.getByteFrequencyData(voiceHeight);
        // console.log(voiceHeight);
        // 自定义获取数组里边数据的频步
        var step = Math.round(voiceHeight.length / count);
        ctx.clearRect(0, 0, oW, oH);
        for (var i = 0; i < count; i++) {
          var audioHeight = voiceHeight[step * i];
          ctx.fillStyle = color1;  // 绘制向上的线条
          ctx.fillRect(oW / 2 + (i * 10), oH / 2, 7, -audioHeight);
          ctx.fillRect(oW / 2 - (i * 10), oH / 2, 7, -audioHeight);
          ctx.fillStyle = color2;  // 绘制向下的线条
          ctx.fillRect(oW / 2 + (i * 10), oH / 2, 7, audioHeight);
          ctx.fillRect(oW / 2 - (i * 10), oH / 2, 7, audioHeight);
        }
        window.requestAnimationFrame(draw);
      }
      draw();


      /*
        analyserNode 提供了时时频率以及时间域的分析信息
            允许你获取实时的数据,并进行音频可视化
            analyserNode接口的fftSize属性
                fftSize:无符号长整型值,用于确定频域的FFT(快速傅里叶变换)
                ffiSize属性值是从32位到32768范围内的2的非零幂,默认值是2048
      */
    }
  </script>
</body>

</html>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值