Angular Web音频API getByteTimeDomainData返回平面128(全部为零)
我使用Web Audio API只是显示麦克风活动指示灯,向用户显示他们的麦克风已连接且正在接收输入 这是一个Angular web项目,我正在使用一个计时器使用getByteTimeDomainData()对输入进行快照 当我运行时,无论我发出多少噪音,我拍摄的每个快照都是128(零) 代码:Angular Web音频API getByteTimeDomainData返回平面128(全部为零),angular,web-audio-api,Angular,Web Audio Api,我使用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)