Web音频Api和Javascript:从麦克风获取正确的选择

Web音频Api和Javascript:从麦克风获取正确的选择,javascript,audio,web-audio-api,mediarecorder,wavesurfer.js,Javascript,Audio,Web Audio Api,Mediarecorder,Wavesurfer.js,我正在做一些实验,并根据麦克风实时接收到的数据进行一些可视化 在这种情况下,我想创建如下的可视化: 或者是Mac OS的录音机 下面我有一个完整的代码笔示例,请查看,但我的问题是我正在使用此示例: obj.analyser.getByteFrequencyData(obj.frequencyArray) 对于这种特殊情况,获得峰值并生成波形图是否正确?就像或者也许我需要更多地了解音频或者使用一些数学知识,我不知道我被卡住了 下面是我完整的代码笔示例: 编辑: 添加更多信息: 基于Brad

我正在做一些实验,并根据麦克风实时接收到的数据进行一些可视化

在这种情况下,我想创建如下的可视化:

或者是Mac OS的录音机

下面我有一个完整的代码笔示例,请查看,但我的问题是我正在使用此示例:

obj.analyser.getByteFrequencyData(obj.frequencyArray)
对于这种特殊情况,获得峰值并生成波形图是否正确?就像或者也许我需要更多地了解音频或者使用一些数学知识,我不知道我被卡住了

下面是我完整的代码笔示例:

编辑: 添加更多信息: 基于Brad在我的示例getByteTimeDomainData()中的答案

我研究了getByteTimeDomain的方法,并将其用于创建示波器可视化。我在这个例子中改变了这个方法,它看起来不像。在字节数组中,最小值为100,在没有声音时为高 但也许是我的实现。 顺便说一句,我取的是ByteFrequencyArray的最大数量,因为我不知道从这里取峰值的正确策略是什么,也许还有其他方法?代码示例如下:

obj.analyser.getByteTimeDomainData(obj.frequencyArray)


for (var i = 0; i< obj.frequencyArray.length;  i++) {
        if(obj.frequencyArray[i] > max) {
          max = obj.frequencyArray[i];
        } 
      }

var freq = Math.floor(max);

obj.bars.push({
    x: obj.width,
    y: (obj.height / 2) - (freq / 2),
    height: max,
    width: 5
})
obj.Analyzer.getByteTimeDomainData(obj.frequencyArray)
对于(var i=0;i最大值){
max=目标频率阵列[i];
} 
}
var freq=数学地板(最大值);
推({
x:obj.width,
y:(物体高度/2)-(频率/2),
身高:最大,
宽度:5
})

)

您在屏幕截图中看到的实际上是时域


为此,您需要使用或。

谢谢您的回答!,但是你能解释更多吗,我想学习和理解其中的区别,因为我研究了getByteTimeDomain的方法,并用于创建示波器可视化。我在这个例子中改变了这个方法,它看起来不像。从字节数组中看,最小值为100,当没有声音@deividsito时为高,从
getByteTimeDomain
返回的字节实际上应该在
127
附近徘徊。实际压力波摆动为正负,因此,如果您试图将其量化为只能表示
0
255
之间整数的字节,请将有效零压力值设置为
127
。负压可向下摆动至
0
,而正压可向上摆动至
255
。要么做数学运算,将字节值缩放到您想要的范围,要么使用
getFloatTimeDomainData()
,这将为您提供
-1.0
1.0
。Ok@Brad感谢您的解释:),让我试试,谢谢!Ok@Brad我还有一个问题,当我一直收到我收到的随时间推移的值数组时,根据fftsize 512或1024等,我迭代这个数组并取这个数组的最大值来绘制这个随时间推移的值。这是正确的还是我需要对数组值进行平均?谢谢@根据定义,Deivisito平均值将接近零。最大值和最小值应在大小上相似(但最小值为负值)。对于一个基本的可视化来说,max很好。