要实时绘制音乐频谱图,首先需要获取音频数据。可以使用 Web Audio API 提供的 AnalyserNode 对象来获取音频数据。然后使用 Canvas 绘制频谱图。

以下是实现的步骤:

  1. 创建 AudioContext 对象和 AnalyserNode 对象。
const audioContext = new AudioContext();
const analyserNode = audioContext.createAnalyser();
  1. 将 AnalyserNode 对象连接到音频源。
const audioSource = audioContext.createMediaElementSource(audio);
audioSource.connect(analyserNode);
  1. 设置 AnalyserNode 对象的参数。
analyserNode.fftSize = 2048;
analyserNode.smoothingTimeConstant = 0.8;
  1. 创建 Canvas 对象。
const canvas = document.createElement('canvas');
const canvasContext = canvas.getContext('2d');
  1. 在 requestAnimationFrame 中实时绘制频谱图。
function draw() {
  requestAnimationFrame(draw);

  const bufferLength = analyserNode.frequencyBinCount;
  const dataArray = new Uint8Array(bufferLength);
  analyserNode.getByteFrequencyData(dataArray);

  canvasContext.clearRect(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];
    canvasContext.fillStyle = `rgb(${barHeight + 100},50,50)`;
    canvasContext.fillRect(x, canvas.height - barHeight / 2, barWidth, barHeight / 2);
    x += barWidth + 1;
  }
}

draw();

完整代码示例:

const audioContext = new AudioContext();
const analyserNode = audioContext.createAnalyser();
analyserNode.fftSize = 2048;
analyserNode.smoothingTimeConstant = 0.8;

const audio = new Audio('music.mp3');
audio.crossOrigin = 'anonymous';
audio.controls = true;
audio.autoplay = true;
audio.loop = true;

const audioSource = audioContext.createMediaElementSource(audio);
audioSource.connect(analyserNode);
analyserNode.connect(audioContext.destination);

const canvas = document.createElement('canvas');
const canvasContext = canvas.getContext('2d');
document.body.appendChild(canvas);

function draw() {
  requestAnimationFrame(draw);

  const bufferLength = analyserNode.frequencyBinCount;
  const dataArray = new Uint8Array(bufferLength);
  analyserNode.getByteFrequencyData(dataArray);

  canvasContext.clearRect(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];
    canvasContext.fillStyle = `rgb(${barHeight + 100},50,50)`;
    canvasContext.fillRect(x, canvas.height - barHeight / 2, barWidth, barHeight / 2);
    x += barWidth + 1;
  }
}

draw();
JavaScript 实时音频频谱图绘制教程 - 使用 Web Audio API 和 Canvas

原文地址: https://www.cveoy.top/t/topic/ocyw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录