我正在Google Chrome中使用Web Audio API的DelayNode
向传入的纯音频WebRTC流添加延迟。
DelayNode
这正在解决一个小问题。我想使原始流静音,以免听到双重音频(原始流和延迟流)。但是,当我使原始流静音时,我只听到延迟的流时,connectionRecv.onaddstream = (event) => {
const recvAudio = new Audio();
recvAudio.srcObject = event.stream.clone();
recvAudio.autoplay = true;
recvAudio.onloadedmetadata = () => {
// controls if original stream should also be played
// true causes WebRTC getStats() receive track audioLevel == 0
recvAudio.muted = muteOriginalStream;
const recvAudioSource = audioContext.createMediaStreamSource(recvAudio.srcObject as MediaStream);
const delayNode = audioContext.createDelay();
delayNode.delayTime.value = 1; // delay by 1 second
recvAudioSource.connect(delayNode);
delayNode.connect(audioContext.destination);
};
};
RTCPeerConnection
对于接收轨道getStats()
返回0。
我已经尝试了许多种围绕接收流的管道传输方式,所以我只听到了延迟的版本,但是我根本听不到任何音频,或者audioLevel
getStats()
为0。我在寻找一种实现,它保留WebRTC audioLevel
中的非零audioLevel
,而仅延迟流正在通过音频输出设备播放。简而言之:
我如何只播放延迟的流而不将WebRTC getStats()
接收音轨getStats()
归零?
我已经在stackblitz audioLevel
上创建了该问题的最小复制,在其中我创建了环回WebRTC连接,其中发送方和接收方是同一浏览器。检查控制台日志,以查看从here返回的接收轨道audioLevel
。
注意:如果您使用我的堆叠闪电弹,我建议您使用耳机来避免反馈回路。
我没有针对您所陈述问题的解决方案,但是作为替代方法以获取电平信息,您可以在音频上下文中添加getStats()
并使用时域或频域数据它可以自己计算音频电平。