【发布时间】: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