从无到有,聊聊我们的视频会议之路
▲扫描图中二维码或点击阅读原文▲
了解音视频技术大会更多信息
编者按:自从新冠疫情爆发以来,大家经常需要居家工作和线上开会,因此音视频会议软件变得越来越重要。LiveVideoStack Meet青岛站邀请到了易软天创的李文睿老师,为我们介绍在喧喧这款聊天软件中,从无到有的视频会议之路。
大家好!我是李文睿,来自青岛易软天创网络科技有限公司。我所在的小团队大概有3人,该团队是禅道团队中负责研发喧喧聊天软件的小组。
1.1 单机可运行、轻量、跨平台、私有部署
首先,介绍我们的企业聊天软件——喧喧。喧喧是一款单机可运行的、轻量的、跨平台的、私有部署的聊天软件。之所以说喧喧是单机可运行的、轻量的、私有部署的软件,是因为喧喧的整体架构足够轻,可以私有部署到用户的单台服务器上。
接下来,介绍一下喧喧的功能。由于喧喧是企业协同聊天软件,所以我们把精力更多地放在了针对企业和协同场景的功能开发上。首先,喧喧具有音视频聊天、桌面共享的功能,还支持移动客户端和万人级别的聊天。其次,卡片消息功能能够让用户处理由第三方或自身推送的流程事务。同时,右键菜单功能可将消息转为禅道需求、bug或第三方系统中的数据。此外,喧喧还有一套扩展机制,第三方开发者可以通过扩展机制为喧喧定义新的功能、嵌入web应用等。喧喧还有单点登录功能。
喧喧还有内置Web应用的功能,可使用WebHook向用户发送通知消息,并支持Office等格式的文件预览。之前提到,喧喧支持各种芯片架构,即可在ARM、MIPS、X86、X86-64架构服务器上稳定运行。喧喧还有LDAP和登录IP限制的功能,这两个功能都是企业办公场景下的刚需。此外,喧喧还有加密存储文件的功能。由于截图也是聊天软件中的重要功能之一,我们还为喧喧开发了一款炫酷的截图工具——ZenShot,该工具已在GitHub上开源。
1.2 Electron
为什么喧喧能够做到全平台兼容呢?是因为我们使用了Electron。Electron的前身是GitHub旗下的编辑器Atom的GUI框架。虽然Atom编辑器已经寿终正寝,但Electron却可以说是如日中天。
大家的电脑上可能已经有好几个Electron,比如著名的编辑器VS Code,这是用Electron实现的。此外,交互设计工具Figma、Markdown编辑器Typora和Evernote的桌面端也都是用Electron实现的。
甚至还有人使用Electron运行完整的Windows 95操作系统,这个项目十分有意思,可在GitHub上找到。由此可以看出,Electron确实十分强大。
1.3 “Dirty Hack”
然后,还想跟大家分享一些有点hack的有趣的细节。
后端服务器和消息中转服务器以及消息中转服务器和客户端之间的数据传递方式是有趣的,我称之为HTTP Over WebSocket,即经由WebSocket转发的HTTP协议通信。客户端通过WebSocket向消息中转服务器发送消息请求,该消息请求会原封不动地POST给后端服务器,得到回复后,再分发给需要被通知的客户端。这样就实现了基于PHP后端的高性能的WebSocket服务。
2.1 为什么要做音视频
2.2 集成Intel OWT
我们先在GitHub上找灵感,思考集成哪款音视频服务,最终找到了Intel的OWT音视频媒体服务器,并尝试集成这款服务。
OWT服务支持MCU和SFU两种模式,由于当时我们刚入门,所以直接选用了MCU模式。所谓MCU模式,就是服务器接收所有用户推送的媒体流并进行混流,将它们合并到一条流中,再分发给用户,这样每个用户只需推送一个流和拉一个流。这种模式对服务器的配置要求比较高,但是能够节约带宽资源。
在集成OWT时,我们花费了很多力气,折腾了差不多一周后,我们初步实现了音频会议的功能,但中间的过程非常痛苦。比如,OWT本身需要编译,在编译时我们需要拉取其他的代码,例如Google的WebRTC的代码,受限于网络,我们经常遇到构建失败的情况,最后不得不购买一台国外的服务器来专门编译OWT。此外,我们还发现将其分发给用户也是一件困难的事情,因为喧喧是一款私有部署的聊天软件,但让用户亲自部署OWT是不现实的,于是我们尝试将其Docker化,但OWT的运行环境较大,我们在去年才将其精简、压缩成了161兆大小。
这是刚做喧喧音频时音频功能的截图,当时花了一周的时间在内网中做了相关的尝试。
2.3 屏幕共享和移动端
然后,我们还实现了屏幕共享功能和移动端的开发。屏幕共享功能和视频会议功能是同期实现的,屏幕共享功能中使用了MediaDevice之类的Web API,可以获取屏幕的视频流,并将其推送到服务端。在开发移动端时,我们则花费了较大的力气。
这是当时喧喧桌面共享功能的截图。
2.4 集成SRS
后来,我们不断收到用户反馈,用户说不使用音视频服务时,该服务也会占用资源,而使用该服务时,资源占用很高、体积大,于是我们开始思考解决办法。我们发现,OWT使用了RabbitMQ和MongoDB,这二者在闲时也会占用资源,于是我们考虑更换音视频后端。最终我们决定使用SRS,SRS是一款国产的开源的音视频项目。
在迁移时,我们发现SRS仅支持SFU模式,于是需要从MCU模式切换到SFU模式,这样的改变会带来一些变化。首先是布局的变化,在SFU模式下,我们需要亲自排布视频并在客户端上呈现,而不由服务端进行排布,对此我们只需开发一些前端的功能,而这是容易实现的。但同时也存在一些问题,以后再跟大家详细介绍。
SRS的文档非常全面,在GitHub上面,其Wiki有797条。得益于详尽的文档和之前集成OWT的经验,我们很快地完成了SRS的迁移。
03 万能的WebRTC
WebRTC技术在飞速地发展,近期我们使用WebRTC实现了客户端之间点对点的大文件传输功能。具体地,通过使用WebRTC的DataChannel和PeerConnection直接传输大文件。由此看出,WebRTC的应用广泛,各大浏览器对WebRTC的支持也很全面。我们期待用WebRTC做更多的事情,比如桌面共享和控制、甚至元宇宙,当然,还要做更好的会议功能。
我今天的分享到此结束,谢谢大家!
微信扫码关注该文公众号作者