JMshake.prototype.canvas = null; JMshake.prototype.stop = false; function JMshake(canvas,audio){ this.canvas = canvas;//canvas this.audio = audio; } JMshake.prototype.init = function(){ } JMshake.prototype.eventBing = function(){ } JMshake.prototype.loadMusic = function(){ var that = this; var context = that.canvas.getContext("2d"); var WIDTH = that.canvas.width; var HEIGHT = that.canvas.height; //part3: 分析器 var AudCtx = new AudioContext();//音频内容 var analyser = AudCtx.createAnalyser(); var src = AudCtx.createMediaElementSource(that.audio); src.connect(analyser); analyser.connect(AudCtx.destination); analyser.fftSize = 512;//快速傅里叶变换, 必须为2的N次方 var bufferLength = analyser.frequencyBinCount;// = fftSize * 0.5 //part4: 变量 var barWidth = 3;//间隔1px var barHeight; var dataArray = new Uint8Array(bufferLength);//8位无符号定长数组 //part5: 动态监听 function renderFrame() { context.fillStyle = 'rgba(255, 255, 255, 0)'; context.clearRect(0, 0, WIDTH, HEIGHT); context.fillRect(0, 0, WIDTH, HEIGHT);//画布拓展全屏,动态调整 analyser.getByteFrequencyData(dataArray);//获取当前时刻的音频数据 //part6: 绘画声压条 var x = 0; for (var i = 0; i < bufferLength; i++) { var data = dataArray[i];//int,0~255 var percentV = data / 255;//纵向比例 var percentH = i / bufferLength;//横向比例 barHeight = HEIGHT * percentV; var r = 255 * percentV;//值越大越红 var g = 255 * percentH;//越靠右越绿 var b = 50; context.fillStyle = "rgb(" + r + "," + g + "," + b + ")"; x = i*barWidth;//间隔1px context.fillRect(x, HEIGHT - barHeight, barWidth, barHeight); } that.animation = requestAnimationFrame(renderFrame); } that.audio.oncanplaythrough = function Draw() { window.cancelAnimationFrame(that.animation); delete that.animation; renderFrame(); } }