导读:
网易会议组件目前已经开源,源代码已经上传至 Github。该项目由网易云信团队自研,结合网易云信系统相关通讯功能、实时音视频、即时消息、白板、直播等功能构建了一套会议系统,本文主要介绍了网易会议组件在网易会议移动端的实践落地。
文|赵冲 网易云信资深移动端开发工程师
一、背景
最近几年线上会议系统越来越流行, 各大企业也逐步开始使用相关会议系统。网易云信作为通信 PaaS 服务提供商,实际具备了一套会议系统相关功能(实时音视频、白板、聊天、直播等), 但我们没有相对完整的会议系统, 因此我们希望能够打造一套基于网易云信通信能力的会议系统,同时我们也希望通过开源让业界其他公司很容易具备高效稳定会议系统能力, 一周就能开发出一个属于自己的 ZOOM。
二、思考与挑战
(一)语言多样化
移动端主流的原生语言并不相同,目前 Android 主要是 JAVA 和 Kotlin。iOS 需要支持 Object-C 和 Swift 语言。在官方的原生之外,许多大厂和中小互联网企业也储备了当前流行的跨平台开发,对跨平台高效开发也有很大的需求。为了满足业务需求和痛点,网易会议选用的是 Google 官方的 Flutter 跨平台技术来进行开发。
选择 Flutter 的主要目的是赋能业务业务提效,一套代码多端复用,提高开发者集成效率。其次支持移动端多语言接口的场景,目前网易会议及网易会议组件(以下简称会议组件)则是支持 Flutter 和 Native 多元化接口。核心控制层逻辑则可支撑一套代码多端复用的能力。
(二)跨平台组件化
会议组件的功能非常丰富且复杂,网易会议是具体的场景解决协作方案,会议组件则需要进行支持功能组件化,让项目可以基于房间简单的组合功能就可以开发一个泛应用场景,那么就需要对账号体系、会议预订系统、会议成员管理等功能进行组件拆分,并且在语言上做到多端复用。
(三)音视频外部渲染
在移动端的跨平台开发中,Flutter 提供了链接原生控件的能力。比如 PlatformView,在 Android、iOS 上显示自定义的 View。也可以使用 ExternalTexture(外接纹理),开发者可以对自己的图形数据进行外部渲染。因为音视频也需要支持美颜对性能画布要求比较高,所以在设计视频渲染组件时自研了外部渲染视频插件。
三、思路和方案
网易会议的系统设计利用了网易云信原有的 PaaS 能力, 我们通过 IM Server 来进行会控通知和多方聊天, 通过 Media Server 实现媒体数据的转发。在此基础上我们重点对会议相关特性进行了设计,包括多租户账号体系、安全入会、会议预定、会议控制、视图布局、角色控制等功能。
(一)基于网易云信 PaaS 服务搭建会议系统
(二)组件化设计与集成
整套会议系统客户端支持 Android、iOS、Web、Electron、Windows、MacOS 等平台, 如何确保用户快速接入以及各端一致性的问题, 我们对会议客户端进行了一系列的拆分设计。
Base: 这一层主要是包含网易云信的各基础 SDK,同时也会包含一些第三方 SDK。
Room Kit: Room Kit 是一个无 UI 的房间服务组件,这一层承载了 Server 通信逻辑,同时处理了一些会控逻辑,未来也会向泛会议的房间服务演进。如果用户不想复用我们默认的 UI 布局,可以基于 Room Kit 来实现自己的会议 UI。
移动端基于 Flutter 实现,为了方便原生项目接入,我们同样提供了混合开发模式允许 Java 以及 OC 等原生语言接入。
Meeting SDK: Meeting SDK 是一个带 UI 的会议服务组件,相比于 RoomKit 来讲,我们提供了一整套标准会议的 UI 实现, 同时我们也提供了有限的 UI 自定义功能。
移动端基于 Flutter 实现, 为了方便原生项目接入,我们同样提供混合开发模式,允许通过 Java 以及 OC 等原生语言接入。
App: 网易云信标准版的网易会议应用,可以直接编译成一个独立的应用。
(三)跨平台组件化
会议组件使用了高内聚、低耦合的设计方式,各模块分而治之。每个模块也可以通过原生的接口进行二次开发,UI 也可以做到插拔式集成,方便开发者做二次高效率开发。
(三)开源版本管理
会议组件的 Android 版本,使用的是 Gradle 的方式进行包管理, iOS 原生对应的版本管理使用的是 Pod 库。Flutter 则是发布到我们网易云信官方的地址https://pub.dev/publishers/yu...
(四)音视频美颜外接纹理
网易会议使用了 ExternalTexture 方案,通过 Pigeon 自动生成 MethodChannel 通道,调用 Native 层的 createVideoRenderer,创建 Render,Native 通过 FlutterTextureRegistry 保存当前的 TextureId,Flutter 层将原生层传递回来的 textureId 和 Dart 层与 Texture Widget 进行绑定。Native 音视频 SDK 会将数据格式回调 Flutter,根据共享纹理的方式获取图像数据进行渲染。
四、网易会议开源交流群
本文主要介绍了网易会议组件在网易会议移动端的落地实践,希望能够帮助客户及三方开发者快速搭建自己的会议 APP 应用,同时也希望通过本文的分享,能对其他团队的研发有所启发。下面是网易会议开源交流群,更多开源相关信息可以关注本公众号,接下来的时间我们会继续前行探索。
网易会议开源交流群
网易会议 GitHub 地址
https://github.com/GrowthEase...
作者介绍
赵冲,网易云信资深移动端开发工程师,热衷于研究跨平台开发技术以及工程提效,目前主要负责视频会议组件化 SDK 的相关研发工作。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。