Discord如何使用WebRTC为两百五十万同时在线用户提供语音服务

Discord App 是游戏玩家专属的免费的一站式语音与文字聊天工具,覆盖 PC 与移动平台。他们在本篇内容中分享了他们如何基于 WebRTC 为 250 万用户提供实时的语音通话。以下为博客译文:

在Discord开发初期,我们就制定了非常明确的产品设计方向,即Discord可用于您在与好友玩游戏时语音聊天。这样的决策使我们能够从一个缺乏资源的小团队开始,不断扩大我们的运营规模。

这篇文章简单介绍了Discord用来使实时音频/视频通信成为现实的各种技术。

需要注意的是,我们将使用“行会(guild)”一词来表示用户和各种渠道,他们在客户端中统称为“服务器(servers)”。此文中我们用“服务器(servers)”来代指我们的后端基础结构。

指导原则

Discord中的每个音频/视频通信都是支持多方使用的。支持大型团体渠道的实时通信(我们曾遇到1000人轮流发言的情况)需要客户端-服务器网络体系结构。因为随着通信参与者数量的增加,点对点网络的成本会十分高昂。

用户通过Discord服务器接入网络还可以确保的是:无论您发信息、语音还是视频,您的IP地址都不会泄漏,所以也不会有任何人找到您的IP地址并发起针对您的DDoS攻击。通过媒体服务器接入音频/视频还有其他优点,例如监管。例如,如果某个参与者有意闹事,管理员可以禁用其音频/视频功能。

客户架构

Discord可在许多平台上运行。

网络(Chrome / Firefox / Edge等)

独立应用程序(Windows / MacOS / Linux)

手机(iOS / Android)

支持Discord多平台运作的唯一方法是代码复用或通过WebRTC。WebRTC是一种包括网络、音频和视频组件的实时通信规范,其由万维网联盟和互联网工程任务组标准化。WebRTC可在所有现行浏览器中使用,也可作为本机库嵌入到应用程序中使用。

Discord的音频和视频功能是借助WebRTC实现的。这意味着我们的浏览器应用程序依赖于浏览器提供的WebRTC实现。但是我们的台式机,iOS和Android应用程序使用为满足用户需求而量身定制,其基于WebRTC本机库构建的单个C ++媒体引擎运行。这意味着某些功能在已安装的应用程序中比在浏览器中能更好运行。例如在我们的本机应用程序中,我们可以:

绕过Windows上默认通信设备的自动降音行为。降低音量意味着Windows在使用通信设备时会自动降低所有应用程序的音量。当您在玩游戏并使用Discord团战时,这种操作会很烦人;

调节我们自己的音量,以避免更改全局操作系统的音量;

访问原始音频数据以执行语音活动检测、共享游戏音频和视频;

减少静音期间的带宽和CPU消耗——即使是人数非常多的语音通道,某段时间都只有几个人在同时说话;

提供系统范围内的一键通功能;

随音频/视频数据包发送额外信息(比如指定优先发言者);

拥有WebRTC的自定义版本意味着我们需要经常更新以保持最新状态。我们正努力自动化这一过程。尽管实现这一目标需要付出大量努力,但只要为我们的游戏玩家服务,这就是值得的。

在Discord中,用户通过进入语音通道或呼叫来开启语音/视频通信。这意味着通信始终由客户端发起,就可以降低客户端和后端的复杂性,还增强了抗错误的能力。如果基础架构出现故障,很简单:用户重新连接到一个新的后端服务器即可。

为我所用

由于我们可以控制本机库,因此我们在本机应用程序中所做的某些操作与您在浏览器的WebRTC中所看到的有所不同。

首先,WebRTC根据SDP在用户之间传输音频/视频信息(往返大小可能接近10 KB)。WebRTC本机库使我们能用WebRTC(即webrtc :: Call)中较低级别的API来创建发送流和接收流。在加入语音通道时,我们交换的信息量很少,包括语音后端服务器的地址和端口、加密方法和密钥、编解码器以及流标识(大约1000个字节)。

Discord如何使用WebRTC为两百五十万同时在线用户提供语音服务

此外,WebRTC使用ICE来确定参与者之间的最佳通信路径。由于每个客户端都连接到了我们的媒体中继服务器,因此我们不需要ICE。当您处于NAT时,我们可以提供更可靠的连接,并且使您的IP地址不对通道中其他人可见。客户端会定期发送ping消息,以确保防火墙始终保持打开状态。

最后,WebRTC使用SRTP进行媒体加密。密钥使用DTLS设置,DTLS是基于用户每天在浏览器中使用的传输层安全性协议运行的。本地WebRTC库让您可以使用API webrtc :: Transport来建立自己的传输层。

而我们决定使用更快的Salsa20代替DTLS / SRTP来加密。此外,我们避免在静音期间发送音频数据,这种情况经常发生,特别是在人数较多的情况下。这样做确实可以节省大量带宽和CPU,但是客户端和服务器都必须随时准备停止接收音频数据,并重写音频/视频数据包序列号。

因为我们的浏览器应用程序使用浏览器WebRTC API,所以我们使用了SDP / ICE / DTLS / SRTP。我们在客户端和服务器之间交换所有必要的信息(往返少于1200个字节),并且从客户端的这些信息中合成SDP。我们的语音后端基础架构负责弥合桌面和浏览器应用程序之间的差异。

后端架构

市面上有好几种后端服务支持语音,但今天我们将重点介绍其中的三种:Discord Gateway、Discord Guilds和Discord Voice。我们所有的信令服务器都是用Elixir编写的,可以进行大量代码的重复使用。

当您在线时,您的客户端会保持与Discord Gateway的WebSocket连接。通过Gateway连接,您的客户端可以接收到行会、渠道、消息、状态等相关事件的信息。

当您接入某一语音通道时,连接状态由voice state object表示。客户端使用Gateway WebSocket连接来更新voice state object。

Discord如何使用WebRTC为两百五十万同时在线用户提供语音服务

当加入语音通道后,您将被分配给一个Discord语音服务器。 Discord语音服务器负责将每个成员的音频传输到通道。同一行会中的所有语音通道都会被分配给同一台Discord Voice服务器。如果您是行会的第一个开语音的,那么Discord行会服务器负责使用以下所述的过程,将一台Discord Voice服务器分配给行会。

展开阅读全文

页面更新:2024-02-08

标签:在线   语音   机库   行会   音量   应用程序   架构   实时   客户端   通道   音频   浏览器   通信   服务器   用户   科技   视频

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top