我正在尝试制作音频条可视化器。

在阅读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'
我有数据输入到dataArray中,但是getByteFrequencyData似乎没有任何作用。

我从THIS POST读到,我可能想包括一些关于最小和最大分贝范围的行,但是并没有什么区别,我仍然收到此错误。

最佳答案

变量analyser在您尝试使用的范围内不存在,因为它是函数initMp3Player的本地变量。

您需要更改frameLooper的签名:

function frameLooper(analyser){...

调用它时,传递analyser,它在调用它的位置范围内。
frameLooper(analyser);

以便在frameLooper函数中可用。

另外,您可以在更高的范围内声明analyser ...但是避免全局变量可能是一个好主意。

09-04 21:15