Angular Web音频API getByteTimeDomainData返回平面128(全部为零)

Angular Web音频API getByteTimeDomainData返回平面128(全部为零),angular,web-audio-api,Angular,Web Audio Api,我使用Web Audio API只是显示麦克风活动指示灯,向用户显示他们的麦克风已连接且正在接收输入 这是一个Angular web项目,我正在使用一个计时器使用getByteTimeDomainData()对输入进行快照 当我运行时,无论我发出多少噪音,我拍摄的每个快照都是128(零) 代码: 我通过扬声器得到疯狂的反馈。我知道我经过的河流是正确的。在这个代码之外,我得到了用户的设备,我可以观察到这个设备就是我的麦克风。我创建了一个媒体流,并将麦克风音频曲目添加到其中,然后再将该流传递到此组件

我使用Web Audio API只是显示麦克风活动指示灯,向用户显示他们的麦克风已连接且正在接收输入

这是一个Angular web项目,我正在使用一个计时器使用getByteTimeDomainData()对输入进行快照

当我运行时,无论我发出多少噪音,我拍摄的每个快照都是128(零)

代码:


我通过扬声器得到疯狂的反馈。我知道我经过的河流是正确的。在这个代码之外,我得到了用户的设备,我可以观察到这个设备就是我的麦克风。我创建了一个媒体流,并将麦克风音频曲目添加到其中,然后再将该流传递到此组件。另外,当我使用上面的代码行时,我可以听到我在所有反馈中发出的噪音。

我不熟悉angular,但从代码看,您似乎定期调用
GetCurrentAveragementInputLevel
。这将每次使用相应的
AnalyzerNode
创建一个新的音频上下文。然后你马上要2048个时域数据样本。在这一点上,分析仪实际上不太可能从麦克风接收到任何数据,因此您只需要得到2048个零的缓冲区

要解决此问题,只需创建一次上下文、分析器(包括设置分析器的参数)和麦克风,可能是在
setupMicInputListener
中。然后让
getCurrentAveragementInputLevel
调用
getByteTimeDomainData
。我想如果麦克风不静音,你会看到非零值


对于Chrome,一般来说,您确实需要有一个节点最终连接到目标,但也有例外,Analyzer节点就是例外之一。但是要确保输出没有连接到任何东西,这样才能工作。

我实际上注意到了这一点,并修改了我的逻辑。真想不到我在这件事上耽搁了这么久。谢谢你看。很高兴你把它修好了!
private setupMicInputListener(stream: MediaStream): void {
    const threshold = 10;
    const timerSource = timer(0, 100);
    timerSource.subscribe((val) => {
      const audioLevel = this.getCurrentAverageMicInputLevel(stream);
      console.log(audioLevel);
      this.audioInputDetected = audioLevel > threshold;
    });
  }

  private getCurrentAverageMicInputLevel(stream: MediaStream): number {
    const audioContext = new window.AudioContext();
    const analyser = audioContext.createAnalyser();
    const microphone = audioContext.createMediaStreamSource(stream);
    microphone.connect(analyser);

    analyser.smoothingTimeConstant = 0.8;
    analyser.fftSize = 2048;
    const buffer = new Uint8Array(analyser.fftSize);
    analyser.getByteTimeDomainData(buffer);
    let values = 0;

    const length = buffer.length;
    for (let i = 0; i < length; i++) {
      values += (buffer[i]);
    }

    const averageLevel = values / length;

    return averageLevel;
  }
microphone.connect(audioContext.destination)