【问题标题】:Webrtc Web Audio add Delay Node to incoming streamWebrtc Web Audio 将延迟节点添加到传入流
【发布时间】:2020-07-16 06:25:39
【问题描述】:

我正在使用 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。我正在寻找对于保留来自 WebRTC getStats() 的非零 audioLevel 的实现,而只有延迟的流通过音频输出设备播放。简单来说:

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

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

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

【问题讨论】:

    标签: google-chrome webrtc signal-processing html5-audio web-audio-api


    【解决方案1】:

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

    【讨论】:

    • 谢谢凯文,这就是我们最终要做的。我们意识到,audioLevel 的统计数据似乎是实验性的,无论如何其他浏览器都不支持。
    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 2018-01-25
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多