draft1
第一章:设计目标
1. 创建组织及自组织,以及组织成员
2. 指挥室的创建、成员管理与信息编辑
3. 会议的召开和会议记录
4. 会议过程操作皆为此次有效,不影响会议室配置
5. 与会者根据身份变化,能够收看和听到的音视频也会变化
6. 所有数据的实时响应
第二章 应用架构、优缺点和可能的解决方案
1. 为了实现跨平台快速开发,采用了web技术,这样便能在开发完成后,只需要进行一些适配工作,使用不同的web Engine发布到不同的平台(broswer/webview等)
2. 为了能够简化开发过程,选用了Angular框架,它集成了所有前端开发所需功能和工具,同时采用typescript、进行了依赖注入和功能限制使得新手也能够很快入门
3. 为了简化界面的编辑,采用了ionic框架基于angular的版本,让构建符合Android/ios风格设计的页面更简单
4. 为了实现远程音视频通话传输媒体流,采用了基于webrtc的janus框架,利用其开源的后端与前端sdk能够快速接入音视频通话功能
5. 为了实现跨平台时调用原生能力,利用ionic整合了cordova混合开发能力。
6. 为了实现数据的实时性更新和应对会议室内复杂的多功能交互、控制、更新深度使用了rxjs,使得异步操作更加直观、功能开发更加快捷
7. 为了实现前后端的实时同步,采用Meteor实现前后端的数据同步和api调用
技术 |
优点 |
缺点 |
优化方案 |
Meteor |
全栈框架,基于发布订阅模式自动同步 |
用户量大时,数据库压力会很大 |
分离后端 |
Janus |
简单部署,自由配置,开源 |
人数限制和安全性 |
进行二次开发,同时开发调度应用 |
|
|
|
|
第三章 用户功能
1. 用户登录
第四章:组织关系
第五章:会议室
第六章:会议
6.1 进入会议室
检查会议记录->跳转会议室页面
->不存在提示
6.2 打开会议室(总指挥)
检查会议记录-> [进入等待会议开启模式]请求会议资源->6.5.1.1
->存在直接跳转页面
6.3 参与会议(进入会议室页面后)
6.3.1会前校验
--进入加载状态
6.3.1.1成员身份校验 -校验失败[API ERR]
6.3.1.2会议室状态校验 -会议未开始[MISS SESSION]
6.3.1.3创建当前会议记录动态数据流 -> 6.3.4 -加入房间失败[NO INFO]
--退出加载状态 : 各组件开始初始化
6.3.1.4创建媒体资源-> 6.6
6.3.2错误处理-会前校验失败会返回至主页
6.3.3入会成功:
6.3.3.1初始化房间小应用服务
6.3.3.2初始化媒体流动态订阅-> 6.11
6.3.3.3汇报和纪录当前房间
6.3.3.4动态处理当前用户是否为管理员,普通成员不会加载部分模块
6.3.3.5监听主面板双击事件,发送重置消息至部分监听组件
6.3.4会议纪录数据处理
6.3.4.1 allUsers新增参数,一个包含指挥室所有用户的数组
6.3.4.2将席位用户名称添加到席位数据中
6.3.4.3新增session值等于纪录_id,为本次会议的独一无二值
6.4离开会议
6.4.1标记离开中状态(主动关闭指挥室)
6.4.2重置当前会议记录
6.4.3关闭会议室(总指挥)
6.4.4清除入会后的动态数据订阅
6.4.5销毁媒体资源-> 6.9
6.4.6标记空闲状态
6.4.7离开会议室
6.4.8清空当前加入房间的纪录 (离开完成
6.5会议提醒
6.5.1新会议
6.5.1.1如果时等待开启,则直接跳转
6.5.1.2如果新的会议是当前会议则跳过-一般不会出现,以防万一
6.5.1.3弹窗提示新的会议-取消则不操作
6.5.1.4如果已在会议室,则退出会议室
6.5.1.5加入新的会议室
6.5.2会议删除
6.5.2.1如果是当前提示要加入的会议,则取消弹窗
6.5.2.2如果是当前加入了的会议室,则退出会议->6.4
6.6创建媒体资源
6.6.1加入Janus房间->6.10
6.6.2监听设备设置和改动,存在可用设备时发布低分辨率流-> 6.7
*对比上次发布信息,移除已发布的设备
6.6.3存储房间信息
6.6.4汇报本机rtc状态
主要包括:video,audio发布成功与否,以及是否有卡顿
6.7低分辨率流
6.7.1 正在发布中,则纪录需要重新发布流的设备信息;
6.7.2 设置发布中状态,权限请求和序列化设备参数
6.7.3?无法获取媒体流时弹出警告和提示
6.7.4 开始发布媒体流(JANUS SPEC)
a.序列化媒体设备参数,适配janus api;
主要是重置分辨率和检查是新发布流还是替换流
b.计算比特率
Math.round(width * height * 20 * 3 * 8 * 0.015)
以20帧为基本流畅标准,基于vp8和h/264差不多的压缩比多了50%的冗余
c.创建offer获取JSEP
d.配置和发布流
e.等待发布成功或者发布失败,30秒超时
f.检查是否处于退出房间状态,是则返回
g.纪录发布流成功和编码等
6.7.5错误处理:
0.退出房间错误,清楚纪录的重发和发布中状态
1.存在需要重发的设备值,再次发布低分辨率操作-> 6.7.1
2.提示推流错误,用户确认重发-> 6.7.1
6.7.6重置发布中状态
6.8高清流发布
6.8.1构建视频输入设备信息流
6.8.2发布媒体流(Janus)
a. 序列化参数
b.以highres及默认id*10为id加入个人房间->6.10
c. ->6.7.4类似
e.监听发布状态,出现卡顿时,降低1.5倍宽高,直到最小值,重新发布媒体流
f.绑定订阅至全局订阅周期
6.9销毁媒体资源
6.9.1标记离开中状态
6.9.2依次离开JANUS房间和删除个人房间
6.9.3清理单次会议过程中的所有订阅
6.9.4标记为空闲状态
6.10加入房间
6.10.1.发布者+订阅者
创建Janus client,记录状态、消息、客户端、媒体流、错误流、数据,
发布者和订阅有不同的jsep消息处理方式
出现clean状态时,清空记录和销毁本客户端的所有关联数据等
作为发布者,需要提前创建房间
6.10.2.错误处理:
436:请求踢掉自己再试
420:尝试创建房间
6.10.3.怪奇现象处理
过快的加入同一个房间(高清低清)会出现房间不存在错误
6.11媒体流的动态订阅
6.11.1订阅成员已发布媒体流信息<- 6.3.3.3
6.11.2等待订阅完成,初始化媒体流数据订阅
6.11.2.1生成最终需要订阅的成员信息(包括房间号,用户id等)
合流自:基于身份所需订阅成员、房间在线用户、已发布媒体流用户
6.11.2.2以订阅者身份加入各个房间,或者退出某个房间-> 6.10
6.11.3初始化音频播放器
6.11.3.1初始化媒体流,创建播放器
6.11.3.2生成所需要播放的音频轨道:
合流自:基于身份成员列表id、媒体轨道、频道成员和各成员及自己状态
6.11.3.3订阅上述数据源,在媒体流加入或者移除音频轨道
6.11.4初始化高清流发布的动态监听
6.11.4.1初始化发布状态,发布结果等
6.11.4.2获取订阅本人高清视频人数的数据流
6.11.4.3无人订阅:
如果是在发布中状态,则标记需要取消发布
否则直接取消发布
6.11.4.4有人订阅
标记发布中状态
未发布,发布高清流-> 6.8
标记发布完成
如果需要取消发布,则立刻取消
6.11.4.5发布成功则上报发布状态:音视频卡顿情况和发布情况
6.11.5订阅当前频道的成员信息,或许所需订阅成员列表:
如果是当前频道指挥员,则订阅所有人
否则订阅所有的指挥员
去掉本人
第七章:会议室通用工具
7.1 整体设计
公共工具服务来控制各个工具之间的通讯
单例实例注册,实现私例通信
唯一激活、激活、取消激活、切换、广播、重置等基础功能
7.2 频道消息组件
7.2.1主组件-UI
7.2.1.1监听消息变化,处理滚动
滚动到最底部
7.2.1.2监听用户滚动,处理加载历史消息
利用禁用滚动+页面刷新完成再启用滚动来消除抖动与插入新消息造成的位置偏移
7.2.1.3监听窗口尺寸变化,自适应宽高
7.2.1.4音频播放完,重置播放器和标识
7.2.1.5状态变化,滚动到最底部
7.2.1.6监听频道变化,初始化频道消息-> 7.2.2
7.2.2消息服务
7.2.2.1清除上次订阅,取消重复订阅
7.2.2.2根据上次存储的消息时间戳,订阅当前频道消息
7.2.2.3分页读取历史消息
读取索引信息
根据所有读取20条
将历史消息加入到消息数据,前加入
7.2.2.4监听频道消息
a.根据消息类型,进行消息序列化,主要是解析文件url,替换缓存消息等
b.缓存消息到本地,记录时间戳
c.将消息后加入到消息队列
7.2.2.5加载历史消息
以当前消息队列的第一条消息为锚点读取历史消息
将消息逐条加入消息队列
计算是否还有更多的历史消息
7.2.2.6消息生命周期
a.用户确认发送后,如果是媒体消息,会进入上传中状态,同时更新进度,上传完成后开始发送消息
b.消息发送之前会生成一份本地缓存消息,该消息状态为发送中;
c.如果发送失败,则本地缓存消息状态为失败
d.如果发送成功,在7.2.2.4 a时进行序列化,会移除状态值,已经发送的消息即为成功的,远程消息也不需要状态
7.2.3缓存服务
7.2.3.1恢复消息
根据频道id和初始消息id寻找历史消息:
没有更多则立刻返回
存在则将每条消息的读取作为宏任务进行顺序操作;
7.2.3.2消息和消息索引存储实现
暂时采用localstory进行消息存储
7.2.4录音服务
尝试从媒体流中抓取本人的音频轨道
抓取失败则从设备获取音频轨道
利用流录音器进行录音,同时获取音频的幅度
7.2.5更多特***
7.2.5.1相册
直接读取图片或者视频然后上传
图片直接获取缩略图
视频则是获取第1秒处的截图
7.2.5.2附件
选择所有类型文件,如果是图片或者视频则转化为相册的处理方式
包含文件名称和大小的获取
7.2.5.3图片预览
直接操作dom,完成全屏的图片预览
7.3频道成员详情与房间成员概要
非指挥员隐藏操作UI
组织树组件的递归设计
7.4设置面板
7.5播放器
7.5.1播放成员媒体流
7.5.2直接播放远程视频
通过消息传递url