【音频可视化】通过canvas绘制音频波形图

前言

这两天写项目刚好遇到Ai对话相关的需求,需要录音功能,绘制录制波形图,写了一个函数用canvas实现可视化,保留分享一下,有需要的直接粘贴即可,使用时传入一个1024长的,0-255大小的Uint8Array类型音频数据源

javascript 复制代码
<canvas ref="canvasRef" width="800" height="200"></canvas>
javascript 复制代码
const drawWaveform = (audioArray) => {
  const canvas = canvasRef.value;
  if (!canvas || !audioArray) return;

  const ctx = canvas.getContext('2d');
  if (!ctx) return;

  const width = canvas.width;
  const height = canvas.height;
  const bufferLength = audioArray.length;

  // 清除画布
  ctx.clearRect(0, 0, width, height);

  // 设置线条样式
  ctx.strokeStyle = '#4f35b5';
  ctx.lineWidth = 2;
  ctx.beginPath();

  const sliceWidth = width / bufferLength;
  let x = 0;

  for (let i = 0; i < bufferLength; i++) {
    const value = audioArray[i] / 255.0;  // 将0-255的值归一化为0-1
    const y = value * height;

    if (i === 0) {
      ctx.moveTo(x, y);
    } else {
      ctx.lineTo(x, y);
    }

    x += sliceWidth;
  }

  ctx.stroke();
};

通过requestAnimationFrame调用即可

示例:

javascript 复制代码
// 持续更新波形
const updateWaveform = () => {
  ensureRecorder(() => {
    audioArray.value = recorder!.getRecordAnalyseData();
    drawWaveform(audioArray.value);
    animationFrameId = requestAnimationFrame(updateWaveform);
  });
};
相关推荐
万少2 小时前
Vibe Coding不停歇,移动端 TRAE SOLO 让你用手机也能编程啦
前端·javascript·后端
kyriewen112 小时前
WebAssembly:前端界的“外挂”,让C++代码在浏览器里跑起来
开发语言·前端·javascript·c++·单元测试·ecmascript
烛衔溟3 小时前
TypeScript 接口的基本使用 —— 定义对象形状
前端·javascript·typescript
铁皮饭盒4 小时前
成为AI全栈 - 第3课:路由 RESTful Elysia 状态码 设计规范
前端·后端·全栈
顾昂_4 小时前
Web 性能优化完全指南
前端·面试·性能优化
前端程序媛-Tian5 小时前
前端 AI 提效实战:从 0 到 1 打造团队专属 AI 代码评审工具
前端·人工智能·ai
支付宝体验科技5 小时前
Ant Design Pro v6.0.0 发布
前端
T畅N5 小时前
审批流设计器(前端)
前端·elementui·vue·html·流程图·js
AlunYegeer5 小时前
JAVA,以后端的视角理解前端。在全栈的路上迈出第一步。
java·开发语言·前端
IT_陈寒6 小时前
Redis这个内存杀手,差点让我们运维半夜追杀我
前端·人工智能·后端