我正在尝试制作音频条可视化工具。
阅读Web Audio API,我有以下代码:
HTML:
<audio controls>
<source src="video/DownToEarth.mp3" type="audio/mp3">
</audio>
<canvas id="analyser_render"></canvas>
JAVASCRIPT:
var audioCtx, myAudio, canvas, ctx, source, analyser, bufferLength, dataArray, bars, bar_x, bar_width, bar_height;
window.addEventListener("load", initMp3Player, false);
function initMp3Player(){
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var myAudio = document.querySelector('audio');
var source = audioCtx.createMediaElementSource(myAudio);
var analyser = audioCtx.createAnalyser();
var bufferLength = analyser.frequencyBinCount;
var dataArray = new Uint8Array(bufferLength);
analyser.minDecibels = -90;
analyser.maxDecibels = -10;
var canvas = document.getElementById('analyser_render');
ctx = canvas.getContext('2d');
source.connect(analyser);
analyser.connect(audioCtx.destination);
frameLooper();
}
function frameLooper(){
window.requestAnimationFrame(frameLooper);
analyser.getByteFrequencyData(dataArray);
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = '#00CCFF';
bars = 100;
for (var i = 0; i < bars; i++) {
bar_x = i * 3;
bar_width = 2;
bar_height = -(dataArray[i] / 2);
ctx.fillRect(bar_x, canvas.height, bar_width, bar_height);
}
}
现在一切看起来都井然有序,但每次我尝试运行它时都会出现错误: 未捕获的TypeError:无法读取未定义的属性'getByteFrequencyData' 我有数据进入INTO dataArray,但是getByteFrequencyData似乎没有得到任何东西。
我从THIS POST读到我可能想要包含一些关于最小和最大分贝范围的行,但这并没有产生一点差异,我仍然收到这个错误。
答案 0 :(得分:1)
变量analyser
在您尝试使用它的范围内不存在,因为它是函数initMp3Player
的本地变量。
您需要更改frameLooper
的签名:
function frameLooper(analyser){...
当你调用它时,在你调用它的地方传递analyser
,它是在范围中。
frameLooper(analyser);
以便frameLooper
功能可以使用它。
或者,您可以在更高的范围内声明analyser
......但是避免全局变量可能是个好主意。