姓名:樊晨煜
学号:201900301079
主要工作:负责山大会议客户端的搭建。
工作量:代码行数 28,678
代码总大小 24MB
个人总结:山大会议客户端是一款运行在 Windows 系统的桌面级应用,渲染进程使用 React.js 框架进行搭建,结合 Electron.js 使用 Node.js 实现传统 web 无法实现的系统级调用。主要开发语言为 TypeScript、JavaScript 。
主要技术难点在于对 WebRTC 技术的封装管理。我们的视频通话功能基于 WebRTC 技术实现,WebRTC 是一种支持一对一的 P2P 视频通话技术。要实现支持多人的视频会议功能,仅仅依靠原生的 WebRTC 是难以实现的。经过前期技术讨论,我们为多人会议设计了 SFU 架构,在客户端对 WebRTC 技术进行封装,以实现客户端仅需上传一条多媒体流,同时管理多个不同的远程多媒体流的功能,以此减轻客户端上行带宽不足的问题。同时,由于应用中存在大量的共享数据,使得这些数据进行同步也是一项非常复杂且困难的工作点。
由于 Electron.js 打包的应用无法调用 WebRTC 提供的屏幕截取 API ,因此我对该 API 进行重写,调用系统模块实现了对用户屏幕以及系统音频的抓取,以实现视频通话中的屏幕共享功能。
在山大会议项目中,我们还实现了类似QQ、微信的即时通讯功能,这又涉及到了另一处逻辑设计上的难点,即聊天记录的存储。为了降低网络延迟带来的影响,加速软件的响应,我将用户的聊天记录在本地也同时存储了一份。为了防止用户使用软件时切换账号导致读取了错误的聊天记录文件,每位用户的聊天记录都以唯一的标识存储于独立的文件中。同时,为了防止某一用户偷窥其他用户的聊天记录,我先利用 electron 的 safeStorage 模块将用户的聊天记录转化为加密的 Buffer 数据再进行本地存储,且每次加密后的 Buffer 数据均不一致,由此防止聊天记录被他人窥探的问题。
我认为 electron 官方推荐的应用更新方式很不实用,它要求用户每次下载最新的安装包进行安装。而一个安装包往往都有 60MB 以上,对于低带宽的服务器来说,下载安装包的速率非常之慢。针对这个痛点,我设计了一种新的更新方式,并利用 C++ 编写了一个简单的更新 exe 内置在了应用中。当用户需要更新时,只需要从服务器上下载一个 4MB ~ 10MB 的简单更新包即可,更新程序会自行为软件进行更新替换,从而大大提高了更新功能的实用性。
除去技术难点,在这个客户端中还实现了大量的边缘功能以提升用户的使用体验,包括开机自启动等功能。在开发测试的过程中,我发现启用加密算法会大幅提高用户的 CPU 占用。针对此情况,我为用户加入了自行选择是否需要开启硬件加速的功能,当使用硬件加速时,会优先使用 H264 进行视频编码,利用 GPU 对视频进行编码渲染,从而降低用户的 CPU 占用。