Webrtc Web音频将延迟节点添加到传入流



我正在使用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);
};
};

这只是一个小问题。我想将原始流静音,这样我就不会听到双重音频(原始流和延迟流(。但是,当我将原始流静音以便只听到延迟的流时,RTCPeerConnectiongetStats()对于接收轨道audioLevel返回0。

我已经尝试了许多不同的方法来绕过接收到的流,所以我只听到延迟的版本,但要么我根本听不到任何音频,要么getStats()audioLevel为0。我正在寻找一种实现,它可以保留WebRTCgetStats()中的非零audioLevel,同时只有延迟的流通过音频输出设备播放。简单地说:

如何在不清零WebRTCgetStats()接收轨道audioLevel的情况下仅播放延迟流

我在stackblitz上创建了这个问题的最小复制,在这里我创建了一个环回WebRTC连接,其中发送方和接收方是同一个浏览器。检查控制台日志以查看从getStats()返回的接收轨道audioLevel

注意:如果你使用我的stackblitz,我建议你使用耳机以避免反馈循环。

我没有解决您提出的问题的方法,但作为获取级别信息的变通方法,您可以将AnalyserNode添加到音频上下文中,并使用它提供的时域或频域数据自己计算音频级别。

最新更新