webRTC 真的有可能无噪音地传输高质量音频吗?

Is it really possible for webRTC to stream high quality audio without noise?

我已经使用最高质量设置和多个 STUN/TURN 服务器进行了测试,但没有找到真正的高质量流。

根据我的经验,webRTC 始终具有波动和有限的带宽以及无法达到 mp3/Shoutcast/Icecast 无线电流质量的高水平背景噪声。

有没有人找到一种方法来使用 webRTC 提供真正的高带宽音频流,或者目前实际上不可能吗?

首先,值得一提的是,Web RTC 建立在底层网络连接之上,如果它很差,那么任何更高层都无法避免这种情况。

查看您突出显示的特定比较,有几个因素对 VoIP 语音质量至关重要(假设您专注于问题中的语音):

  • 延迟:为了避免延迟和回声,语音通信需要低端到端延迟。高质量 VoIP 系统的目标通常是低于 200 毫秒的延迟。
  • 抖动 - 这本质上是一次延迟的变化,即端到端延迟如何随时间变化。
  • 数据包丢失 - 与数据相比,语音实际上可以合理地容忍数据包丢失。 VoIp 目标通常在 1% 或更少的范围内。

将其与 steamed 广播等进行比较,关键是延迟 - 等待几秒钟才能开始播放流并不罕见。

这允许接收器填充更大的等待解码和回放的数据包缓冲区,并使其更能容忍延迟(抖动)的变化。

举一个简单的例子,如果你的连接有一个短暂的半秒中断,这会立即影响双向 VoIP 呼叫,但它可能根本不会影响流式音频,假设网络完全恢复并且缓冲区当时有几秒钟的内容。

因此,与流式音频相比,您看到的质量差异很可能与通信的真实性质有关,而不是与 WebRTC 固有的错误有关——或者更准确地说,即使 WebRTC 是完美的,实时两个VoIP 很容易受到网络条件的影响。

作为。请注意,清晰的视频需要更多的带宽,并且还受到网络的影响,但人们往往更能容忍视频 'stutters' 而不是多媒体通话中的语音质量问题(此时 amyay)。

WebRTC 的默认音频设置非常低。它默认为 42 kb/s 左右的单声道音频,因为它似乎是为语音设计的。我通过配置一些设置提高了质量。

  1. 在 getUserMedia() 约束中禁用 autoGainControlechoCancellationnoiseSuppression
navigator.mediaDevices.getUserMedia({
  audio: {
    autoGainControl: false,
    channelCount: 2,
    echoCancellation: false,
    latency: 0,
    noiseSuppression: false,
    sampleRate: 48000,
    sampleSize: 16,
    volume: 1.0
  }
});
  1. stereomaxaveragebitrate 属性添加到 SDP:
let answer = await peer.conn.createAnswer(offerOptions);
answer.sdp = answer.sdp.replace('useinbandfec=1', 'useinbandfec=1; stereo=1; maxaveragebitrate=510000');
await peer.conn.setLocalDescription(answer);

这为立体声提供了 520kbps 的潜在最大比特率,即每个通道 260kbps!

实际比特率取决于您的网络速度和信号强度。

有关 SDP 的更多信息:

The Session Description Protocol (SDP) [RFC4566] describes various aspects of multimedia session such as media capabilities, transport addresses and related metadata in a transport agnostic manner, for the purposes of session announcement, session invitation and parameter negotiation.

https://tools.ietf.org/id/draft-nandakumar-rtcweb-sdp-01.html#rfc.section.3

查看我实现了这些功能的项目: https://github.com/kmturley/webrtc-radio