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