WebRTC实现多人视频聊天

2023-11-02

写在前面

实现房间内人员的视频聊天,由于并未很完善,所以需要严格按照步骤来,当然基于此完善,就是时间的问题了。


架构

整个设计架构如下:

多人视频聊天

图片来自于参考博文。我使用的是第一种Mesh 架构,无需任何流媒体服务器,直接利用成熟的WebRTC 协议。该体系架构基于从每一个发送者创建多个一对一 的数据流到每一个接收端。客户端创建多个对等连接,连接数量基于房间内的其它成员数。


应用程序实现

基础实现如下:

多人视频聊天交互设计

第1步:将 注册用户身份信息和表明想加入房间号和连接建立成功放在一起是为了在连接一建立成功就向信令服务器发送信息。

第2步:客户端发起多个连接创建请求(即视频通话请求)。

第3步:响应客户端的多个连接创建请求,返回房间内成员信息;排除自己以及以及发起了多个连接创建请求的成员。

第4步:客户端创建多个连接,并将包含多个连接的offer和成员信息的消息发送给信令服务器。

第5步:注册onIceCandidate 事件,发送 单个candidate 给信令服务器。

第6步:接收信令服务器的单个 answer 消息,设置为对应用户连接的desc。

第7步:接收信令服务器的单个 candidate 消息,添加到对应用户连接的iceCandidate。


客户端

客户端使用adapter.js , demo的代码来自于开源的webrtc-samples,基于其中的 peerconnection 内容修改而成的。效果如下图:

多人视频聊天效果截图

注:其中两个客户端采用的是虚拟摄像头

关于客户端更详细的设计参考推荐博文。


信令服务器设计

信令服务器的作用在于转发各个sdp 给对应的客户端,协助对等连接的建立。

如果需要实现多人视频聊天,其中的逻辑则更为复杂。通过websockets 来实现客户端与信令服务器之间的消息传输,并且设置了多种消息格式,具体格式如下:

const requestType = {
    // 用户认证
    USER_IDENTITY: 'USER_IDENTITY',
    // type 为 offer 的 desc
    SDP_OFFER: 'SDP_OFFER',
    // type 为 answer 的 desc
    SDP_ANSWER: 'SDP_ANSWER',
    // candidate
    SDP_CANDIDATE: 'SDP_CANDIDATE',
    // 创建多个连接请求
    CLIENT_MULTIPLY_CONNECTION_CREATEQUE: 'CLIENT_MULTIPLY_CONNECTION_CREATEQUE',
    // 房间成员消息响应
    SERVER_CALLEESRESP: 'SERVER_CALLEESRESP'
};

关于信令服务器更详细的设计参考推荐博文。


源码

源码地址,以下流程可能不适用,以源码中的 readme 为准,代码写的有点晦涩,欢迎哥哥们提意见 /鲜花。

  1. 启动信令服务器,修改前端代码中的websockets 地址,部署启动前端代码
  2. 客户端A 访问地址 …/index.html?name=clientA&roomId=001, 点击start
  3. 客户端A 访问地址 …/index.html?name=clientB&roomId=001,点击start
  4. 客户端C 访问地址 …/index.html?name=clientC&roomId=001,点击start
  5. 客户端D 访问地址 …/index.html?name=clientD&roomId=001,点击start, 并点击Call。
  6. 整个完整的流程如上。

注:以上流程能够得到保证,其它流程我的代码均未考虑。并且执行一次以上流程可能需要重启信令服务器,重新执行整个流程。


推荐博文


WebRTC实现多人视频聊天之客户端设计
WebRTC实现多人视频聊天之信令服务器设计


参考博文


https://blog.csdn.net/gupar/article/details/53101435 基于webrtc 多人音视频的研究

如果你觉得我的文章对你有所帮助的话,欢迎关注我的公众号。赞!我与风来
认认真真学习,做思想的产出者,而不是文字的搬运工。错误之处,还望指出!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebRTC实现多人视频聊天 的相关文章

  • WebRTC - 禁用所有音频处理

    我目前正在尝试通过 webrtc 获得尽可能干净的音频通道 通过 getUserMedia mediaconstraints 对象 我设置了以下选项 constraints audio mandatory echoCancellation
  • 适用于高带宽应用的 WebRTC 数据通道

    我想通过 WebRTC 数据通道发送单向流数据 并且正在寻找最佳配置选项 高带宽 低延迟 抖动 以及其他人在此类应用程序中的预期比特率的经验 我的测试程序发送 2k 的块 使用 2k 的 bufferedAmountLowThreshold
  • 使用 django 通道将 webRTC 视频流发送到服务器

    我正在尝试创建一个用 django 编写的人脸检测 Web 应用程序 该应用程序是这样工作的 用户导航到该 url 相机在客户端计算机上启动 然后将每一帧发送到服务器进行人脸检测 然后将处理后的帧显示在网页上 我知道我无法使用 opencv
  • 从 MediaStream 对象获取媒体详细信息(分辨率和帧速率)

    我正在捕获用户的相机 我想以尽可能最佳的分辨率捕获图片 所以我的代码类似于下面的代码片段 我想从传入流中读取分辨率详细信息 因此我可以将其设置为视频高度和宽度 我将用它来单击快照 我希望快照具有流提供的最佳质量 这可能吗 读取分辨率详细信息
  • 使用媒体流扩展 (MSE) 显示 getUserMedia Stream 实时视频

    我正在尝试使用 getUserMedia 显示从网络摄像头获取的 MediaStream 并使用任何可能播放的机制将其中继到远程对等点 作为实验 我没有直接使用 webRTC 因为我想控制原始数据 我遇到的问题是我的视频元素不显示任何内容
  • RecordRTC:Ondataavailable 被调用两次。只有第一个文件正确,其他文件已损坏或太小[重复]

    这个问题在这里已经有答案了 我想以2秒的间隔记录本地和远程流并用Ajax上传到服务器 但问题是 ondataavailable 方法被调用了两次 因此同一个视频被上传到服务器两次 第一个视频可以正常播放 而其余视频要么已损坏 要么非常小 不
  • 在 Heroku 上部署 PeerJS 服务器

    我的 PeerJS 服务器有问题 我从这里使用了 部署到 Heroku 按钮 https github com peers peerjs server https github com peers peerjs server 我不知道如何连
  • 为Windows应用程序实现webrtc数据通道[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有谁知道如何向用 C 构建的 Windows 应用程序实现 WebRTC DataChannel API 以便在 NAT 后面的客户端
  • 具有 3 个用户连接的 WebRTC

    我现在正在实施源代码WebRTC 示例 https github com webrtc samples tree gh pages src content peerconnection audio通过使用网状拓扑成为 3 个用户连接 但是
  • WebRTC 和 Asp.Net Core

    我想将音频流从我的 Angular Web 应用程序录制到我的 Asp net Core Api 我认为 使用 SignalR 及其 websockets 是实现这一目标的好方法 通过这个打字稿代码 我可以获得一个 MediaStream
  • 为 WebRTC 应用程序实现我们自己的 STUN/TURN 服务器 [重复]

    这个问题在这里已经有答案了 我正在开发一个 webrtc 应用程序 并且必须实现以下 TURN 服务器 https code google com p rfc5766 turn server https code google com p
  • 如何将音频从浏览器流式传输到 WebRTC 本机 C++ 应用程序

    到目前为止 我已成功运行以下示例 WebRTC 原生 C 到浏览器视频流示例 http sourcey com webrtc native to browser video streaming example 该示例展示了如何将视频从本机
  • 如何在webRTC android中将视频流数据录制为mp4?

    请帮我 我在中使用了这个例子https github com pcab AndroidRTC https github com pchab AndroidRTC将视频和音频从 Android 设备流式传输到其他 Android 设备 在这个
  • React Native - 在 Android 中显示传入视频通话屏幕(VOIP 应用程序)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试实施视频通话React Native 应用程序中的功能 我用过React 原生 twilio 视频 webrtc https
  • Websocket 连接失败并显示星号 11

    我正在尝试将 websocket 配置为与 asterisk 11 一起使用 但是存在一些问题 我遵循的步骤是 在 http conf 中启用以下内容 enabled yes bindaddr 0 0 0 0 bindport 8088 我
  • webrtc - 视频出现斑点,但它仍然是黑色的

    我使用 chrome 21 运行我的 webrtc 代码 如果我在同一个 chrome 中打开两个选项卡 然后打开其中包含 webrtc 代码的页面 一个选项卡用于发送视频流 一个选项卡用于接收视频流 效果很好 但是 如果我使用两种隐身模式
  • Twilio webRTC 通话在 10 分钟后中断

    使用 Twilio js 使用 webRTC 录制通话 工作正常 但在 10 分钟时 完全正确 电话挂断 TwiML 上的最大记录时间设置为 7200 秒 浏览器的控制台显示 Twilio PeerConnection signalingS
  • 使用 WebRTC 构建 iOS 本机应用程序

    我找了4天了 还是没找到 我构建了所有库并将其集成到我的自定义项目中 但我不知道应该采取哪些步骤才能使其正常工作 我在代码示例 解释中发现的唯一内容是 tech appear in 2015 05 25 Getting started wi
  • Node.js 中的 webRTC

    我想在node js 中使用webRTC 来管理涉及浏览器和nodejs 上的对等点的混合连接 我做了一些测试和搜索 我尝试使用wrtc https github com js platform node webrtc or webrtc
  • iOS SWIFT - WebRTC 从前置摄像头更改为后置摄像头

    WebRTC 视频默认使用前置摄像头 效果很好 但是 我需要将其切换到后置摄像头 但我无法找到任何代码来执行此操作 我需要编辑哪一部分 是 localView 或 localVideoTrack 还是捕获器 斯威夫特3 0 对等连接只能有一

随机推荐

  • 牛客网C语言编程初学者入门训练135题

    文章目录 1 实践出真知 2 我是大V 3 有容乃大 4 小飞机 5 反向输出四位数 6 大小写转换 7 缩短二进制 8 十六进制转十进制 9 printf的返回值 10 成绩输入输出 11 学生基本信息输入输出 12 字符金字塔 13 判
  • 线稿图视频制作--从此短视频平台不缺上传视频了

    博客首页 knighthood2001 欢迎点赞 评论 热爱python 期待与大家一同进步成长 给大家推荐一款很火爆的刷题 面试求职网站 跟我一起来巩固基础 开启刷题之旅吧 这年头还不来尝试线稿图视频 之前笔者也写过将视频转换为线稿图视频
  • 基于Docker的mysql主从复制

    目录 一 拉取mysql 二 启动两个mysql容器 2 1 主master 2 2 从slave 三 配置master 3 1 进入master内部配置 3 2 安装vim命令 3 3 重启mysql 3 4 创建数据同步用户 可不建 直
  • Linux重启nfs出现没有权限,Linux NFS搭建与错误提示解决

    Linux NFS搭建与错误提示解决 服务端设置 root server cat etc redhat release 查看操作系统版本信息 CentOS release 5 5 Final root server uname r 查看当前
  • 常见的错误-04

    引言 在公司配置新电脑环境时候 在安装和配置完所有VSCode软件以及C 环境后 ubuntun环境下 尝试使用debug进行代码调试 遇到了在debug过程中不输出结果的bug 如下图 未输出array以及zheli 解决方法 在ubun
  • vue3+ts中对getCurrentInstance的使用

    1 在main js中挂载一个全局属性 拿axios举例 import App from App vue import axios from http 封装的axios方法 const app createApp App 创建应用 app
  • 【100%通过率 】【华为OD机试 c++/java/python】对称字符串【 2023 Q1 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 对称美学 对称就是最大的美学 现有一道关于对称字符串的美学 已知 第 1 个字符串 R 第 2 个字符串 BR 第 3 个字符串 RBBR 第
  • resetlog

    来自于itpub的一篇文章 http space itpub net 16628454 很多人说 resetlogs就是不完全恢复 这是不对的 做不完全恢复必须使用resetlogs 但resetlogs也可以做完全恢复 而noresetl
  • # 第四届蓝桥杯JavaB组省赛-马虎的算式

    第四届蓝桥杯JavaB组省赛 马虎的算式 题目描述 小明是个急性子 上小学的时候经常把老师写在黑板上的题目抄错了 有一次 老师出的题目是 36 x 495 他却给抄成了 396 x 45 但结果却很戏剧性 他的答案竟然是对的 因为 36 4
  • 解决idea文件properties中文乱码问题

    有时候将项目代码拉取至本地用idea打开时会出现中文乱码问题 遇到这种问题不要慌 重新设置一下编码为UTF 8即可 那么如何将idea的编码统一设置为UTF 8格式呢 接下来我们一一解决此类问题 1 打开idea编译器 有时候会看到打开的文
  • WebGIS工程师进阶训练营

    WebGIS工程师进阶训练营 1 WebGIS课程综述 2 多类情景部署SuperMap iServer 2 1 Linux环境部署SuperMap iServer 2 2 war包部署 2 3 常见问题排查 3 SuperMap iSer
  • word添加、更新目录

    1 显示导航窗口 视图 导航窗口 2 文档中的目录 2 1 插入目录 引用 目录 2 2 更新目录 方式一 点击下图 更新目录 方式二 引用 更新目录
  • WinForm使用鼠标裁剪图像

    之前做一个试卷识别的项目的时候需要预先将各个部分裁剪开然后进行识别 而网上的裁剪函数都是记录鼠标的位置然后进行裁剪 public static Bitmap PartDraw Image src Rectangle cutpart 切割图片
  • (休息几天)读米什金之货币银行学——货币与汇率

    1货币 当一国货币升值时 相对于其他货币价值上升 则该国商品在国外变得更贵 而外国商品唉本国则变得更便宜 相反 一国货币贬值 则该国商品在国外更便宜 而外国商品在本国则变得更贵 货币升值使得本国制造的商品在国外竞争力下降 而国外商品在本国竞
  • Koa2.js router 异步返回ctx.body失效的问题

    koa2 js 用router返回数据时 正常写法如下 我是将接口封装了 一个很普通的koa2 js get请求 router put getUserInfo ctx next gt const data ctx request body
  • PHP自己的框架2.0版本目录结构和命名空间自动加载类(重构篇一)

    目录 1 目录结构演示效果 2 搭建目录结构 以及入口public gt index php 3 引入core下面core gt base php 4 自动加载实现core gt fm gt autoload php 5 框架运行文件cor
  • Basic Level 1012 数字分类 (20分)

    题目 给定一系列正整数 请按要求对数字进行分类 并输出以下 5 个数字 A 1 A 1 A1 能被 5 整除的数字中所有偶数的和 A 2
  • matlab 取余(rem)和取模(mod)的区别

    取余 rem 和取模 mod 的区别 Matlab 生成机制 取余 采取fix 函数 向0方向取整 取模 采取floor 函数 向无穷小方向取整 当A B异号时 其实同号也是这个规律 取余 结果和A同号 取模 结果和B同号 PS 在js c
  • ASP .net core 整合 nacos 通过Spring Cloud Gateway 网关访问

    ASP net core 整合 nacos 通过Spring Cloud Gateway 网关访问 使用vs创建web项目 选择api 注意这里要取消掉Https配置否则使用网关转发也需要配置为https请求这里我们直接取消 添加nacos
  • WebRTC实现多人视频聊天

    写在前面 实现房间内人员的视频聊天 由于并未很完善 所以需要严格按照步骤来 当然基于此完善 就是时间的问题了 架构 整个设计架构如下 图片来自于参考博文 我使用的是第一种Mesh 架构 无需任何流媒体服务器 直接利用成熟的WebRTC 协议