webRTC 真的可以在没有噪音的情况下流式传输高质量的音频吗?

Posted

技术标签:

【中文标题】webRTC 真的可以在没有噪音的情况下流式传输高质量的音频吗?【英文标题】:Is it really possible for webRTC to stream high quality audio without noise? 【发布时间】:2018-02-14 05:53:35 【问题描述】:

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

根据我的经验,webRTC 总是存在波动且有限的带宽以及高水平的背景噪音,无法达到 mp3/Shoutcast/Icecast 广播流的质量。

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

【问题讨论】:

是的。不过,STUN 与质量无关。 【参考方案1】:

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

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

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

将这与蒸汽广播等进行比较,关键点是延迟 - 等待几秒钟以开始播放流的情况并不罕见。

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

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

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

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

【讨论】:

【参考方案2】:

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

    在 getUserMedia() 约束中禁用 autoGainControlechoCancellationnoiseSuppression
navigator.mediaDevices.getUserMedia(
  audio: 
    autoGainControl: false,
    channelCount: 2,
    echoCancellation: false,
    latency: 0,
    noiseSuppression: false,
    sampleRate: 48000,
    sampleSize: 16,
    volume: 1.0
  
);
    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 的更多信息:

会话描述协议 (SDP) [RFC4566] 以与传输无关的方式描述了多媒体会话的各个方面,例如媒体功能、传输地址和相关元数据,用于会话公告、会话邀请和参数协商。

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

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

【讨论】:

这是我正在寻找的答案,因为我正在集思广益地设置一些 PiSounds,以便通过以太网进行地理上的本地音乐干扰。与 JamKazam 类似,但都是开源且廉价的硬件。我的第一个想法是 WebRTC,想知道它是否真的可以做高清音频。肯定会尽快测试您的代码,因为它看起来很有希望! 这个答案可以通过链接到 WebRTC RFC 规范的相关部分来改进。 认为 SDP 表示会话描述协议,这个答案可以详细说明这是什么,我 认为 这意味着在 WebRTC STUN服务器。 感谢您的反馈,已添加对 SDP 的描述。我有一个类似的想法,但对于本地主机收音机。你可能想看看我的项目,因为我已经克服了一些障碍! github.com/kmturley/webrtc-radio 很好,谢谢,当我开始走这条路时,我会尽快检查您的项目。

以上是关于webRTC 真的可以在没有噪音的情况下流式传输高质量的音频吗?的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS - 如何在不缓冲的情况下流式传输请求正文

使用 AWS Elastic Transcoder 和 S3 在不公开所有内容的情况下流式传输 HLSv4?

webrtc ios 噪音怎么处理

使用FFMPEG将视频文件连续传输到RTMP服务器

关于webrtc噪音回音问题怎么处理

WebRTC音视频之噪音消除功能