开篇 | 使用 WebRTC 打造私有化会议系统
Hello,我是 suke,之前写过一些基于 WebRTC
和 SpringBoot
组合实现单人、多人聊天系统的文章,有很多同学喜欢。所以在此,我想将 WebRTC
和开源界很多有影响力的流媒体服务器组合起来,去实现会议、直播等场景。
为什么要实现私有会议系统?
虽说公有云已经有了各种基于 WebRTC
的会议服务,但是终究是公有云。可以预见,随着企业安全越来越受到重视,很多企业都想要私有部署。目前支持公有服务私有化部署的产品又很少,即使有也很昂贵。
从用户角度看,面对一个普通的会议,却需要下载不同的 App 才能与不同的客户语音视频,但凡参会人数稍微多一点,这些软件就提示用户升级到付费版本才可以,这无疑是个痛点。如果我们能够搭建一套会议系统,仅需浏览器就可以支持语音视频功能的话,那岂不是可以解决这些问题?
因此,自己实现一套私有会议系统是很有必要的,而WebRTC就是首选。
WebRTC 的优势
WebRTC
的诞生,就是基于浏览器的多媒体即时通信(2011 年 5 月,Google 发布了一个开源项目,用于基于浏览器的实时通信,称为 WebRTC
。紧随其后的是 IETF
中相关协议的标准化工作以及 W3C
中的浏览器 API ),对于在 Web
端实现会议这个需求而言,它简直天生自带光环。
而且我们知道,Web
端实现会议系统的前置条件:实时双向音视频、主流浏览器支持、开发者容易入手、使用范围广且技术开源成熟,同时满足上述条件,大范围内也就 WebRTC
了。
不仅如此,WebRTC 还具有毫秒级的延迟特性,这一点在直播领域尤其重要,比如有人在直播间发了一个口令红包,3 秒后你才看到发红包的画面,这时再输入口令那红包岂不是早飞了?WebRTC
本身就是多媒体即时通讯技术,使用 WebRTC
传输直播流几乎是实时传输。如果将直播流转换 WebRTC
拉流的方式,相当于客户端和直播服务端点对点连接,无需经过各种转换,相比于传统 RTMP
/FLV
流经过 N 层 CDN 再播放延迟更低。
当然,作为开发人员,选择 WebRTC
还有一个原因:它在浏览器端成熟的 API
,我们无需多少代码就可以满足无客户端视频通话的目的。
我们前面提过,WebRTC
的诞生就是基于浏览器端的,因此在浏览器端的 ``API
必然是成熟的。但 WebRTC
并不是只能浏览器里使用。
浏览器中的 API
怎么来的?肯定是内核中提供的,那么内核是怎么来的?那必然不是用 JavaScript
写的,据我了解是用 C++
,但 WebRTC 在浏览器端暴露出来的 API,我们是可以直接通过 JavaScript
访问的。其他语言也可以访问这些 API
,比如在 Java
中,如果要使用 WebRTC
的相关 API
,可以找谷歌开源的相关 Java
库,去间接地调用 C++
代码实现。
可以说,WebRTC
是将前端技术和音视频嫁接起来最佳的媒介,对于前端同学而言,学习 WebRTC
作为音视频入门也是很有意义的。
课程设计
我们小册将按照“由简单场景再到复杂场景”的逻辑,提供三种架构来设计实现会议系统。
虽然我们的初衷是实现一套会议系统,但当面对不同场景时,我们需要知道还有哪些更适合的方案。
- 当会议场景只要人员点对点,或者偶尔需要少量人员多对多时,我们搭建一套简易架构,无需任何第三方服务的会议系统即可;
- 当会议场景基本都是多对多,而且需要实时监听用户网络状况时,上一种架构就没法满足了,我们会用第二种机构实现会议系统。
- 其他的场景,比如在会议或通话过程中直播某些用户的画面,像公开庭审等司法场景,那么前两种架构也无法满足我们,就需要第三种架构来现实会议系统。
当然,为了实现三种不同架构的会议系统,我们也需要先了解必要的 WebRTC
基础知识和相关 API。另外,WebRTC
除了会议系统,还可以实现很多花样。基于此,我们小册将分为 五 部分。
- 基础知识:
WebRTC
的基本认识和相关 API 学习。 - 第一种会议系统:
WebRTC
+ 自建信令服务器实现点对点、多对多视频通话。 - 第二种会议系统:学习开源
WebRTC
服务器Janus
,并利用其实现第二种架构的会议系统。 - 第三种会议系统:学习开源流媒体服务器
SRS
,并实现WebRTC
推流拉流。 - 其他场景拓展:直播、流量监控、即时通讯、网页客服、远程控制、私密放映室等都可以尝试探索。
你会学到什么?
- 从 0 实现三套基于
WebRTC
的私有化会议系统; - 开源
WebRTC
服务器Janus
、SRS
的部署及使用; RTSP
、RTMP
流与WebRTC
自由组合;WebRTC
多场景方案探索实践。
通过后续课程的学习,大家可以从入门 WebRTC
到自己实现一套会议系统。所有课程源代码我会开放一个固定的仓库,供大家学习参考。希望大家能够动手实现,而不是简单的 CV,我会给很多基础的函数加上备注。
最后,希望每个同学能够学有所得,能够在实际工作场景中用到这些东西,哪怕是自己弄个独立会议室和朋友聊天。就算是你用不到音视频聊天,那么 WebRTC
作为一种新的接口数据双向实时传输方案也是可以的。
小思考
WebRTC
的会话过程和另一种协议 SIP
很类似,而我们日常生活中的电话呼叫就和 SIP
息息相关,那么 SIP
协议具体什么样子的呢?它是如何建立会话的呢?欢迎大家在留言区讨论。