首页 > 其他分享 >音频可视化

音频可视化

时间:2025-01-19 17:56:48浏览次数:3  
标签:canvas const 音频 height 可视化 barCount Math

第一步创建一个音频上下文(也就是一个管理音频的构造函数)
 

audioContext = new (window.AudioContext || window.webkitAudioContext)();

第二步通过音频上下文创建出处理音频数据的“人”

analyser = audioContext.createAnalyser();

第三步创建一个读取音频数据的“人”
 

const source = audioContext.createMediaElementSource(audio.value);

第四步读取音频数据的 “人” 将数据交给处理数据的“人”
 

source.connect(analyser);

第五步 处理的数据的“人”将处理好的音频数据进行输出外放
 

analyser.connect(audioContext.destination);

 第六步就是Canvas绘图
 

const drawVisualizer = () => {
  if (!visualizer.value || !analyser) return;

  const canvas = visualizer.value;
  const ctx = canvas.getContext("2d");

  // 设置canvas尺寸
  canvas.width = canvas.offsetWidth;
  canvas.height = canvas.offsetHeight;

  const draw = () => {
    animationId = requestAnimationFrame(draw);

    // 获取解析出上下文的数据并存在dataArray中
    analyser.getByteFrequencyData(dataArray);

    // 初始化清空画布
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    // 设置柱状图参数
    const barCount = 160;
    const barSpacing = 2;
    const barWidth = 2;
    const baseHeight = 3;

    // 计算总宽度并居中
    const totalWidth = (barWidth + barSpacing) * barCount;
    const startX = (canvas.width - totalWidth) / 2;

    // 绘制音频柱状图
    for (let i = 0; i < barCount; i++) {
      // 平滑数据
      const startIndex = Math.floor((i * dataArray.length) / barCount);
      const endIndex = Math.floor(((i + 1) * dataArray.length) / barCount);
      let sum = 0;
      for (let j = startIndex; j < endIndex; j++) {
        sum += dataArray[j];
      }
      const value = sum / (endIndex - startIndex);

      // 计算高度,添加安全检查
      const percent = Math.min(Math.max(value / 255, 0), 1); // 确保百分比在 0-1 之间
      const height = Math.max(baseHeight, canvas.height * 0.85 * percent);

      // 计算位置,添加安全检查
      const x = Math.max(0, startX + i * (barWidth + barSpacing));
      const y = Math.min(canvas.height - height, canvas.height); // 确保 y 不会小于 0

      // 绘制发光效果
      ctx.shadowBlur = 12;
      ctx.shadowColor = "#00ffea";

      try {
        // 创建渐变时添加错误处理
        if (isFinite(y) && y >= 0 && y <= canvas.height) {
          const gradient = ctx.createLinearGradient(x, y, x, canvas.height);
          gradient.addColorStop(0, "#00ffea");
          gradient.addColorStop(1, "#00ffea33");
          ctx.fillStyle = gradient;
        } else {
          // 如果值无效,使用固定颜色
          ctx.fillStyle = "#00ffea";
        }

        // 绘制主体
        ctx.fillRect(x, y, barWidth, height);

        // 绘制顶部小圆点
        ctx.beginPath();
        ctx.arc(x + barWidth / 2, y, barWidth / 2, 0, Math.PI * 2);
        ctx.fillStyle = "#00ffea";
        ctx.fill();

        // 添加星星效果(随机)
        if (Math.random() < 0.01) {
          ctx.beginPath();
          const starX = Math.random() * canvas.width;
          const starY = Math.random() * canvas.height;
          ctx.arc(starX, starY, 0.8, 0, Math.PI * 2);
          ctx.fillStyle = "#00ffea44";
          ctx.fill();
        }
      } catch (error) {
        console.error("绘制错误:", error);
        continue; // 跳过当前柱子的绘制
      }
    }
  };

  draw();
};

标签:canvas,const,音频,height,可视化,barCount,Math
From: https://blog.csdn.net/m0_65227631/article/details/145234167

相关文章

  • 如何在仿真分析,预测中 应用风力发电、光伏发电数据、用电负荷数据集,构建一个全面的时
    风力发电、光伏发电数据、用电负荷数据集,用于仿真分析,预测等。[1]光伏数据,光伏出力年光伏数据集,包含光伏发电功率、多种类型光照辐射强度数据(DNI,DHI,GHI),附带多种数据,可用于光伏场景生成与缩减、光伏特性分析、光伏优化调度等。[2]光伏预测功率数据2007-2020光伏预测功......
  • 计算机毕业设计Python+Django农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农
    温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO......
  • 大数据毕业设计:python热门音乐数据分析系统+可视化+Flask框架 MySQL数据库 豆瓣音乐
    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌>......
  • Adobe AU(Audition)专业音频编辑软件下载安装(附win/mac安装包)
    AdobeAU软件简介AdobeAU(Audition)是由Adobe公司开发的专业音频编辑软件,广泛用于音频录制、编辑、混音和恢复等工作。软件的设计旨在为音乐制作人、广播制作人、视频编辑师及音频行业的其他专业人士提供全方位的音频后期处理解决方案。随着数字音频技术的发展,AdobeAU的软件......
  • AI 音频工具合集
    ......
  • Arduino 平台下 ESP32-P4 MP3音频文件播放
    ESP32-P4开发板arduino平台下从SD_MMC读取MP3文件播实验程序,初步验证成功。开发板使用斑梨电子JC1060P470_P4,板载ES8311音频解码器和四线SD卡模块。ES8311在Arduino下驱动使用了github上某国外猿的驱动代码,并搭配ESP32-AudioI2S库I2Saudio示例实现。原来想直接使用psch......
  • Transformer 可视化分析 + 大模型推理策略:非常新颖的题材,发展也是一步一个脚印,没有那
    Transformer可视化分析+大模型推理策略:非常新颖的题材,发展也是一步一个脚印,没有那种一蹴而就的浮躁感背景介绍为什么Transformer理解单个词语意思+理解词语顺序+理解上下文,就能摆脱模式识别,灵活的读懂意思?Transformer分为四部分:文字编码、自注意力机制、神经网......
  • ffmpeg简易播放器(2)--了解音频格式
    声音是个啥初中物理学过,声音是由物体振动产生的,声音是一种机械波,传播的介质是空气。声音的频率决定了声音的音调,频率越高,音调越高。声音的振幅决定了声音的大小,振幅越大,声音越大。也就是说,声音实质上是一个连续的信号,他有着频率以及振幅这两个基本属性。而我们的音频文件无非就......
  • 一直收费的音频处理软件,如今已开源!
        有小伙伴向我询问有没有安卓端音量增强放大的软件,我隐约记得曾推荐过相关软件,仔细查找后发现了一款国外软件“FxSound”的软件。软件介绍    目前市面上很多音效增强类软件都是收费的,FxSound也不例外,它在2022年1月之前已经收费了23年,而在2022年1月,作者宣......
  • 【分享】 100+ 套开源大数据可视化大屏Html5模板,全网最炫!
    今天给大家分享100+套开源大数据可视化炫酷大屏Html5模板,全网最新、最多、最全、最酷、最炫的大数据可视化模板!项目介绍BigDataView提供了100+套大数据可视化炫酷大屏Html5模板,涵盖了社区、物业、政务、交通、金融银行等多个行业。这些模板被认为是全网最新、最多、最全、最酷......