You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取多振荡器音量并接入可视化器遇问题: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();
}

关键修改说明

  1. 移除了原代码中volume.connect(ctx.destination)和osc.connect(analyser)的错误连接
  2. 改为volume.connect(analyser) + analyser.connect(ctx.destination),让信号先经过Gain调整音量,再进入Analyser采集,最后输出到设备
  3. 去掉了已废弃的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:10:38