当前位置:首页 > JavaScript

js 实现频谱

2026-03-14 10:56:26JavaScript

使用 Web Audio API 实现频谱分析

通过 Web Audio API 可以获取音频信号的频谱数据。以下是一个完整的实现示例:

// 创建音频上下文
const audioContext = new (window.AudioContext || window.webkitAudioContext)();

// 获取麦克风输入
navigator.mediaDevices.getUserMedia({ audio: true })
  .then(stream => {
    const source = audioContext.createMediaStreamSource(stream);
    const analyser = audioContext.createAnalyser();

    // 连接节点
    source.connect(analyser);

    // 设置FFT大小(决定频率分量的数量)
    analyser.fftSize = 256;

    // 创建用于存储频率数据的数组
    const bufferLength = analyser.frequencyBinCount;
    const dataArray = new Uint8Array(bufferLength);

    // 绘制频谱
    function draw() {
      requestAnimationFrame(draw);

      // 获取频率数据
      analyser.getByteFrequencyData(dataArray);

      // 这里可以添加绘制逻辑
      console.log(dataArray); // 输出频率数据
    }

    draw();
  })
  .catch(err => {
    console.error('获取麦克风失败:', err);
  });

使用 Canvas 可视化频谱

将频谱数据可视化为柱状图:

const canvas = document.getElementById('visualizer');
const ctx = canvas.getContext('2d');

function draw() {
  requestAnimationFrame(draw);

  analyser.getByteFrequencyData(dataArray);

  ctx.fillStyle = 'rgb(0, 0, 0)';
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  const barWidth = (canvas.width / bufferLength) * 2.5;
  let x = 0;

  for(let i = 0; i < bufferLength; i++) {
    const barHeight = dataArray[i] / 2;

    ctx.fillStyle = `rgb(${barHeight + 100}, 50, 50)`;
    ctx.fillRect(x, canvas.height - barHeight, barWidth, barHeight);

    x += barWidth + 1;
  }
}

分析音频文件频谱

对于预录制的音频文件,可以使用以下方式分析:

const audioElement = document.querySelector('audio');
const track = audioContext.createMediaElementSource(audioElement);
track.connect(analyser);
analyser.connect(audioContext.destination);

audioElement.play();

自定义频谱参数

调整频谱分析的精细度:

js 实现频谱

// 更大的FFT尺寸提供更多频率细节但性能开销更大
analyser.fftSize = 2048; 

// 获取时域数据(波形)
const timeData = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteTimeDomainData(timeData);

性能优化建议

对于实时频谱分析,建议使用 Web Worker 处理数据。避免在动画循环中创建新对象,复用数组和绘图资源。对于音乐可视化应用,可以只提取特定频段(如低音、中音、高音)的数据进行处理。

标签: 频谱js
分享给朋友:

相关文章

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…