我正在使用Google Chrome中的Web audio API的DelayNode
为传入的音频WebRTC流添加延迟。
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()
对于接收轨道audioLevel
返回0。
我已经尝试了许多不同的方法来绕过接收到的流,所以我只听到延迟的版本,但要么我根本听不到任何音频,要么getStats()
audioLevel
为0。我正在寻找一种实现,它可以保留WebRTCgetStats()
中的非零audioLevel
,同时只有延迟的流通过音频输出设备播放。简单地说:
如何在不清零WebRTCgetStats()
接收轨道audioLevel
的情况下仅播放延迟流
我在stackblitz上创建了这个问题的最小复制,在这里我创建了一个环回WebRTC连接,其中发送方和接收方是同一个浏览器。检查控制台日志以查看从getStats()
返回的接收轨道audioLevel
。
注意:如果你使用我的stackblitz,我建议你使用耳机以避免反馈循环。
我没有解决您提出的问题的方法,但作为获取级别信息的变通方法,您可以将AnalyserNode添加到音频上下文中,并使用它提供的时域或频域数据自己计算音频级别。