如何用JavaScript实时绘制音乐频谱图?
要实时绘制音乐频谱图,可以使用HTML5中的Web Audio API和Canvas API结合起来实现。以下是一个简单的实现步骤:
- 创建音频上下文和分析器
首先,使用Web Audio API创建一个音频上下文,然后创建一个AnalyserNode分析器,用于分析音频数据。
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var analyser = audioCtx.createAnalyser();
- 获取音频数据
接下来,获取音频数据并将其传递给分析器进行分析。可以通过创建一个AudioBufferSourceNode节点来播放音频,并使用XMLHttpRequest从服务器获取音频数据。
var audioSource = audioCtx.createBufferSource();
var audioRequest = new XMLHttpRequest();
audioRequest.open('GET', 'audio.mp3', true);
audioRequest.responseType = 'arraybuffer';
audioRequest.onload = function() {
var audioData = audioRequest.response;
audioCtx.decodeAudioData(audioData, function(buffer) {
audioSource.buffer = buffer;
audioSource.connect(analyser);
analyser.connect(audioCtx.destination);
audioSource.start(0);
});
}
audioRequest.send();
- 绘制频谱图
在每个音频帧中,获取分析器中的频谱数据,并使用Canvas API绘制频谱图。可以使用Canvas API的fillRect函数绘制频谱图。
function draw() {
requestAnimationFrame(draw);
var freqData = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(freqData);
var canvas = document.getElementById('canvas');
var canvasCtx = canvas.getContext('2d');
canvasCtx.fillStyle = 'rgb(0, 0, 0)';
canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
var barWidth = canvas.width / freqData.length;
var barHeight;
var x = 0;
for (var i = 0; i < freqData.length; i++) {
barHeight = freqData[i];
canvasCtx.fillStyle = 'rgb(' + (barHeight+100) + ',50,50)';
canvasCtx.fillRect(x, canvas.height-barHeight/2, barWidth, barHeight/2);
x += barWidth;
}
}
draw();
在这个例子中,使用Canvas API绘制一个矩形来代表每个频率的音量大小。通过循环遍历每个频率的音量数据,并将其转换为矩形高度,然后使用Canvas API绘制矩形。这个绘制过程在requestAnimationFrame函数中执行,以便在每个音频帧中更新频谱图。
完整代码如下:
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var analyser = audioCtx.createAnalyser();
var audioSource = audioCtx.createBufferSource();
var audioRequest = new XMLHttpRequest();
audioRequest.open('GET', 'audio.mp3', true);
audioRequest.responseType = 'arraybuffer';
audioRequest.onload = function() {
var audioData = audioRequest.response;
audioCtx.decodeAudioData(audioData, function(buffer) {
audioSource.buffer = buffer;
audioSource.connect(analyser);
analyser.connect(audioCtx.destination);
audioSource.start(0);
});
}
audioRequest.send();
function draw() {
requestAnimationFrame(draw);
var freqData = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(freqData);
var canvas = document.getElementById('canvas');
var canvasCtx = canvas.getContext('2d');
canvasCtx.fillStyle = 'rgb(0, 0, 0)';
canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
var barWidth = canvas.width / freqData.length;
var barHeight;
var x = 0;
for (var i = 0; i < freqData.length; i++) {
barHeight = freqData[i];
canvasCtx.fillStyle = 'rgb(' + (barHeight+100) + ',50,50)';
canvasCtx.fillRect(x, canvas.height-barHeight/2, barWidth, barHeight/2);
x += barWidth;
}
}
draw();
需要注意的是,为了在浏览器中使用Web Audio API,需要使用支持的浏览器版本。在Chrome、Firefox、Safari、Edge和Opera浏览器中,Web Audio API已经得到支持
原文地址: https://www.cveoy.top/t/topic/flLK 著作权归作者所有。请勿转载和采集!