WEB音频API错误:无法读取属性'getByteFrequencyData'

时间:2014-12-03 21:51:57

标签: javascript audio web

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

阅读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读到我可能想要包含一些关于最小和最大分贝范围的行,但这并没有产生一点差异,我仍然收到这个错误。

1 个答案:

答案 0 :(得分:1)

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

您需要更改frameLooper的签名:

function frameLooper(analyser){...

当你调用它时,在你调用它的地方传递analyser,它是在范围中。

frameLooper(analyser);

以便frameLooper功能可以使用它。

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