javascript - WEB音频API错误: Cannot read Property 'getByteFrequencyData'

标签 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);
    }
}

现在一切看起来都井然有序,但每次我尝试运行它时,我都会继续收到错误: 未捕获类型错误:无法读取未定义的属性“getByteFrequencyData” 我有数据进入 dataArray,但 getByteFrequencyData 似乎没有从中获取任何内容。

我读自 THIS POST我可能想包含一些关于最小和最大分贝范围的行,但这并没有产生任何区别,我仍然收到此错误。

最佳答案

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

您需要更改frameLooper的签名:

function frameLooper(analyser){...

当你调用它时,传递analysisr,它在你调用它的地方范围

frameLooper(analyser);

以便它在您的 frameLooper 函数中可用。

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

关于javascript - WEB音频API错误: Cannot read Property 'getByteFrequencyData' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27282372/

相关文章:

javascript - 无法设置未定义 JS 的属性 'name'

android - 如何以低延迟使用 Android 音频

java - 需要此流程的帮助(AudioInputStream -> byte Array -> AudioOutputStream)

css - 我有 Bootstrap 问题

javascript - 检查是否设置了最小宽度

javascript - 如何用 jquery 对话框替换 javascript 警报?

javascript - Vue.js axios 从本地存储(localforage)获取值返回promise对象而不是值

android - 如何在音频播放器上禁用主题 - jQuery Mobile & MediaElement

php - 如何使用 php 创建日期范围?

web - solid 和 ipfs 的区别