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

全部评论

相关推荐

05-30 12:03
山西大学 C++
offer来了我跪着接:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务