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

Webrtc Web Audio add Delay Node to incoming stream

我在 Google Chrome.[=25= 中使用网络音频 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() returns 0 用于接收轨道 audioLevel.

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

如何在不清零 WebRTC getStats() 接收轨道的情况下只播放延迟流 audioLevel?

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

返回的接收轨道 audioLevel

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

我没有针对您所述问题的解决方案,但作为获取关卡信息的解决方法,您可以在音频上下文中添加一个AnalyserNode,然后使用它提供的时域或频域数据自己计算音频电平。