读取多振荡器音量并接入可视化器遇问题:getFloatTimeDomainData忽略增益
问题:AnalyserNode无法读取经过Gain节点调整后的振荡器音量
核心问题出在音频节点的连接顺序上:你当前把振荡器直接连接到了AnalyserNode,导致Analyser采集的是Gain节点之前的原始信号,完全没经过音量衰减处理,自然会忽略volume.gain.value的设置。
解决方案:调整音频节点的连接链路
要让Analyser读取到经过音量调整后的信号,必须把Analyser节点放在Gain节点之后,正确的信号流应该是:振荡器 → Gain节点(调整音量) → Analyser节点(采集数据) → 音频输出
修改后的funkcja函数代码如下:
function funkcja() { var osc = ctx.createOscillator(); osc.type = 'sine'; var volume = ctx.createGain(); // 调整连接顺序:振荡器先连Gain,Gain连Analyser,Analyser连输出 osc.connect(volume); volume.connect(analyser); analyser.connect(ctx.destination); volume.gain.value = 0.01; osc.frequency.setValueAtTime(400.0, ctx.currentTime); if (osc.start) osc.start(); }
关键修改说明
- 移除了原代码中
volume.connect(ctx.destination)和osc.connect(analyser)的错误连接 - 改为
volume.connect(analyser)+analyser.connect(ctx.destination),让信号先经过Gain调整音量,再进入Analyser采集,最后输出到设备 - 去掉了已废弃的
noteOn方法,只保留标准的start()
多振荡器扩展方案
如果要实现多个振荡器的音量可视化,只需要给每个振荡器都创建独立的Gain节点,然后将所有Gain节点都连接到同一个AnalyserNode即可:
function createOscillator(freq, gainValue) { var osc = ctx.createOscillator(); osc.type = 'sine'; var volume = ctx.createGain(); osc.connect(volume); volume.connect(analyser); volume.gain.value = gainValue; osc.frequency.setValueAtTime(freq, ctx.currentTime); osc.start(); } // 创建多个不同音量的振荡器 createOscillator(400, 0.01); createOscillator(600, 0.05); createOscillator(800, 0.1);
内容的提问来源于stack exchange,提问作者Zamaskowany
相关产品推荐
相关产品推荐

