组件的描述已在前几个博文中给出。下面针对具体的流程给出详细描述。

如何进行sdp协商

建立任何聊天都需要保证服务端有相应的 WebRtc 对象,当然,客户端也需要建立对应的 WebRtc 对象,它们之间的关系可以参考我的这篇博文(kurento之WebRtcEndpoint到底是个啥)。

建立 WebRtc 对象需要流媒体管道 (MediaPipeline ),同一域中的 流媒体管道应该是同一个;所以在进行 sdp 协商之前,需要先创建域,但并不激活该域;也就是说域中的流媒体管道已经准备好。

  1. 客户端通过域id 以及 sdpOffer 要求服务端创建 WebRtc 对象,
  2. 服务端创建好WebRtc 对象,响应 SdpAnswer ,并开始收集 候选人信息
  3. 客户端与服务端交换候选人信息

至此,服务端存在该用户的一个可用的 WebRtc 对象。剩下的就需要在建立实际的聊天时,去为该webRtc 创建连接了。

这个过程很好的抽取了出来,在建立聊天域时,就不需要再关心 sdp的协商过程。

如何建立一对一聊天

  1. 客户端 A 创建域
  2. 域创建成功后,A和B 会收到域Id
  3. 开始 进行 sdp 协商
  4. 客户端A激活域:如果B 已经激活(即B 的 webRtc 对象存在该域中),那么进行连接(A连B,B连A),否则仅把 A的 webRtc 对象放在该域中。
  5. 客户端B 激活域:如果A 已经激活(即A 的 webRtc 对象存在该域中),那么进行连接(A连B,B连A),否则仅把 B的 webRtc 对象放在该域中。
  6. A 结束通话时,会销毁该域,并通知到 B

如何建立一对多聊天

  1. 客户端 A 请求 创建直播室
  2. 直播室创建成功,接收到直播室域的 Id
  3. 进行sdp协商
  4. A 激活域,将自身的 webRtc对象 设置为直播室域的主持人

客户B 如何加入直播室呢?

  1. 客户端 B 请求加入直播室
  2. 请求成功,返回直播室域的 id
  3. 进行sdp 协商
  4. B 在直播室中激活,将自身的 WebRtc 对象设置为直播室域的参观者,并且设置主持人的WebRtc 对象连接到自身的 WebRtc 对象。

那么,如何退出直播室呢?

如果是主持人,则会销毁域;如果是参观者,则会退出域,断开主持人的webRtc 与 其的连接,并且释放参观者的 WebRtc。

如何建立多对多聊天

客户 A 创建群组域成功,接下来,A 和其它想要加入群组域的成员一样:

  1. 申请加入域

  2. 请求成功,返回群组域的id

  3. 进行 sdp 协商:创建自身的 webRtc

  4. 激活域:

    4.1 升级该用户为群组用户,将 自身的 WebRtc 对象设置为群组用户的输出流,

    4.2 检测群组中已经存在的用户,给该用户推送已经存在的用户信息

    4.3 检测群组中已经存在的用户,给已经存在的用户推送新成员加入的信息

  5. 当前用户收到已经存在的多个用户信息(循环下述过程,直到处理完所有存在的用户):

    5.1 进行sdp 协商:创建当前用户与存在用户的webrtc

    5.2 申请从存在用户接收媒体流:

    • 将当前用户与存在用户的webrtc(即在5.1 协商好的 webRtc 对象) 作为当前用户的群组对象的输入流
    • 设置存在用户的输出流连接到 当前用户与其的 webrtc 对象(这里是只有一个webRtc 对象,不过是该对象用于当前用户从存在用户接收流媒体数据)
  6. 存在的用户收到新成员加入的信息:

    6.1 进行sdp 协商:创建存在用户与新成员的 webRtc 对象

    6.2 申请从新成员接收媒体流:

    • 将存在的用户与新成员的webRtc 对象(即在 6.1 协商好的webRtc 对象)作为存在用户的输入流
    • 设置新成员的输出流连接到 存在用户与新成员的webRtc 对象

这个过程有点复杂,需要细细理解…

如何建立多人聊天

多人聊天与多对多聊天不同之处在于多对多需要在客户端分别创建多个webRtc,而多人聊天只需要分别在客户端和服务器端创建一个webRtc,通过 Composite(集线器)来将多个媒体流合成网格状。

A 邀请 B、C 进行多人聊天,只要B、C 中有一人接受,多人聊天域创建成功。

  1. B 、C 接受,给 A、B、C 发送多人聊天域创建成功的消息,包含了该域的id

  2. 客户端接收到 多人聊天域创建成功的消息,开始进行sdp 协商

  3. sdp 协商完成以后,开始激活

    3.1 创建HubPort,WebRtc 连接该 HubPort

    3.2 使用集线器构建的统一 HubPort, 连接该 WebRtc

  4. 当 B、C 均退出时,多人聊天室结束,清理资源。

B 在第一次拒绝后,可以再次申请加入,流程和上面一样 (从第二步开始);

这种聊天方式会比较卡,可能是 KMS 的缘故(所在服务器内存分配的太少);

如何进行录制

录制是通过构建 RecorderEndpoint 对象来完成。

  1. 在一对一聊天时,客户A 请求录制,会录制 客户B 的媒体;
  2. 在一对多时,会录制主持人;
  3. 在多对多时,会通过集线器进行合流,将多个媒体流合成网格,录制成一个视频;
  4. 在进行多人聊天时,直接使用已有的集线器即可。

如何进行回放

回放功能是指播放已经录制好的视频;该功能是通过创建 PlayerEndpoint 对象来完成的。

基于webrtc的视频聊天室(五)之服务端设计相关推荐

  1. 基于webrtc的视频聊天室(一)之千里之行始于足下

    在不采用流媒体的情况下,也能够实现视频聊天室:可这需要在客户端建立多个连接,对客户端要求很高(上行带宽以及浏览器编解码速度),所以引入 kurento 流媒体服务器来做中转,或许后续不仅仅只是做中转. ...

  2. 基于webrtc的视频聊天室(六)之客户端设计

    客户端用 Vue 框架写的,分了8个自定义组件: container.vue 是其它组件的父组件,其中 WebRtcPeerSendRecv.vue 是共用组件,UserOpt 和OneToOneBo ...

  3. WebRTC笔记之二十二:基于WebRTC的视频聊天室—QHTalkGenius

    利用空余时间,前后历时5个月,在公司大佬杰哥的指导下,QHTalkJanus终于搞定了.功能很简单,参考Janus的web客户端来做的,主要实现了三部分:1.Janus信令解析-这个用的是开源库Web ...

  4. 基于webrtc的视频聊天室(四)之用户设计

    用户的设计主要是明确其生命周期及其需要持有的对象. 用户的生命周期 创建 websocket连接时,建立普通用户对象: 申请通话时,等待对方响应: 对方接受,如果为群组聊天,则将其更改为 GroupU ...

  5. WebRTC实践视频聊天室

    技术前言 通过前几次教程已经可以轻松的实现两个浏览器之间的文本信令交互和视频对讲功能.本次课程要融合以前所有技术点,做一次综合性实例,采用nodejs实现一个完整的聊天室功能.其界面样式仿照微信的界面 ...

  6. WebRTC 教程五:WebRTC搭建视频聊天室

    这篇文章主要介绍了 WebRTC 聊天室的整体演示,以及 WebRTC 视频聊天的功能设计,代码逻辑以及整体演示. 目录 WebRTC 聊天室:总体演示 WebRTC 视频聊天: 设计 WebRTC ...

  7. android 使用WebRTC搭建视频聊天室

    使用WebRTC搭建前端视频聊天室--入门篇 https://www.jianshu.com/p/b54b27970534 android webrtc 两个手机 P2P 视频聊天 https://w ...

  8. 小成开发日记---利用Qt/C++实现基于Udp协议的网络聊天室(分服务端和客户端的开发【轻聊v1.0.1】)

    作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/112363393 一.引言 最 ...

  9. 聊天室小程序服务端源码(客户端接下一条)

    功能:类似qq群聊         1.进入聊天室需要输入用户名         2.有人进入聊天室有提示,其他人会收到提示            xxx进入聊天室         3.某人发消息,则 ...

最新文章

  1. 我是怎么读源码的,授之以渔
  2. Sam Palmisano Reveals Secret Behind IBM's Century Of Success
  3. 设计模式 - 创建型模式_ 单例模式 Singleton Pattern
  4. android自定义滚轴选择器_Android自定义滚动式时间选择器(在他人基础上修改)...
  5. 未解决-hive之drop 表分区失败
  6. RT-Thread uart串口设备驱动代码结构剖析
  7. Http协议(7)—Http缓存
  8. Extjs tree树的生成
  9. ArrayList的remove方法(重写equals方法) 与LinkedList的常用操作
  10. leetcode445. 两数相加 II
  11. c#写图像tif gdal_Gdal系列 (二)读取图像基本操作b + 简单波段合成
  12. Java判段两个日期的先后
  13. 启动react-native报错 Unrecognized font family 'Ionicons'
  14. 计算机配置图解,电脑硬件详细图解
  15. 论文翻译(上):Deep Learning Based Semantic Labelling of 3D Point Cloud in Visual SLAM
  16. Unity Shader-后处理:高斯模糊
  17. LoRaWAN入网方式以及加密进阶版
  18. QT Widget.cpp重新命名、报错“xxxx“ was not declared in this scope
  19. 打造企业上云安全屏障,华为云擎天Enclave全方位守护敏感数据安全
  20. 透过社群网站加强公益的力量 让爱心无国界传遍各地!

热门文章

  1. 甲骨文如何杀出云计算重围之路?
  2. shell运行python文件_在python shell中运行python文件的实现
  3. 数据分享:全国A级景区数据(约12000条)
  4. 美式英语与英式英语的区别
  5. python学习——外星人入侵程序打包
  6. 新开的淘宝店铺找货源需要了解和注意的
  7. Day05:194-206(上午搞了MongDB)
  8. 在“提示”框中:管理Android音频配置文件,Android上的Google书签和电缆固定
  9. 发布项目到Jcenter
  10. Eslint prefer-const 禁用