WebRTC实现音视频通话全流程

WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC 包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。

WebRTC的应用场景

点对点视频聊天:如 微信视频 等实时视频通话应用。

多人视频会议:企业级多人视频会议系统,如飞书、钉钉、腾讯会议等。

在线教育:如腾讯课堂、网易云课堂等。

直播:游戏直播、课程直播等。

WebRTC实现音视频通话过程

  • 1.server端新建socket服务(作为信令服务器),当用户进入客户端的时候将用户端与socket建立连接。
  • 2.当客户端与server端建立连接后,客户端会向server端发起一个加入房间的事件,并携带房间id。
  • 3.server端监听到加入房间的事件后,会将房间id添加到指定房间中,这样,所有加入同一个房间的客户端都可以接收到在该房间内发送的事件或消息。
  • 4.将客户端用户分为发起方和接收方。
  • 5.当客户端用户发起方发起通话时会向server端发起通话的事件。
  • 6.当server端接收到这个事件后,会向在这个房间中的所有客户端广播通话事件。
  • 7.当客户端用户接收方接收到这个事件,如果接收方同意了这个请求则会向server端发送同意视频的事件反之,如果挂断的话会向server端发起拒绝视频的事件。
  • 8.当server端收到同意视频事件后会向客户端广播同意视频的事件。
  • 9.当客户端用户发送方收到这个事件后,创建RTCPeerConnection()对象,并将音视频流加入到里面,并且将,网络信息和媒体流信息通过事件发送到server端,同时会通过onaddstream事件来获取对方的音视频流
  • 10.当serve端接收到这些事件后会将这些事件已广播的形式返回,当接收方收到这些事件后会将这些信息添加到RTCPeerConnection中,同时接收方也会将这些信息通过事件发送到服务端,同时会通过onaddstream事件来获取对方的音视频流
  • 11.实现视频通话。

总结:上述过程就是通过 WebRTC 提供的 API 获取各端的媒体信息 SDP 以及 网络信息 candidate ,并通过信令服务器交换,进而建立了两端的连接通道完成实时视频语音通话。

代码实现WebRTC音视频通话过程

1. 建立socket连接

sock.on('connectionSuccess', () => { console.log('连接成功'); //前端连接成功之后需要向服务器发送一个加入房间的事件 sock.emit('joinRoom', roomId) })

2. 服务器接收到事件后将roomId添加到房间中

//监听加入房间的事件 sock.on('joinRoom', (roomId) => { sock.join(roomId); })

3. 发起方发起视频请求,发送请求事件,同时将视频流输出到video中

 // 发起方发起视频请求 const callRemote = async () => { console.log('发起视频'); //用户A向用户B发起视频请求 caller.value = true //表示当前用户是发起方,发起了视频请求 calling.value = true //表示是否呼叫中 //在发起视频的时候讲视频流输出到页面上 await getLocalStream() //通过信令服务器向用户B发起视频请求,?socket.value存在且非null或undefined的情况下,才进行方法调用, socket.value?.emit('callRemote', roomId) } //获取视频流方法 //获取本地音视频流,并进行播放 const getLocalStream = async () => { const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true }) localVideo.value!.srcObject = stream localVideo.value!.play() localStream.value = stream return stream }

4. 服务器接收到事件,对事件进行广播

//监听发起视频通话的请求 sock.on('callRemote', (roomId) => { //广播事件 io.to(roomId).emit('callRemote'); })

5. 接收方接收到广播事件,改变页面状态

 // 监听服务器发来的视频请求 sock.on('callRemote', () => { //如果是发送方自己收到了这个callRemote事件,那么就直接忽略 if (!caller.value) {//不是发送方才会处理 called.value = true//接听方 calling.value = true//视频通话中 } })

6. 接收方同意视频邀请

 // 接收方同意视频请求 const acceptCall = () => { console.log('同意视频邀请'); //通过信令服务器通知用户A socket.value?.emit('acceptCall', roomId) }

7. 服务器通知发起方用户接受了视频邀请

//通知其他用户接收了通话请求 sock.on("acceptCall", (roomId) => { io.to(roomId).emit("acceptCall"); })

8. 发起方接收到了事件,将candidate信息和offer信息通过事件传递到server中 注意:如果要将此项目部署到外部进行访问则需要搭建coturn服务,此项目支持视频音频以及屏幕的音视频流,如果需要更改peer.value.addStream(localStream.value)

 //监听接收了通话请求 sock.on("acceptCall", async ()

Read more

Microi 吾码:低代码解锁服务器虚拟化的无限潜能

Microi 吾码:低代码解锁服务器虚拟化的无限潜能

目录 一、服务器虚拟化的时代浪潮与核心意义 二、Microi 吾码在服务器虚拟化资源管理中的卓越表现 虚拟机资源分配与监控的智能掌控 资源调度与优化的精妙策略 三、Microi 吾码助力服务器虚拟化的网络配置与优化 虚拟网络架构的灵活构建 网络流量优化与安全保障的双重守护 四、Microi 吾码在服务器虚拟化高可用性与容错机制中的关键作用 虚拟机备份与恢复的可靠保障 故障转移与容错技术的智能应对 五、Microi 吾码与不同服务器虚拟化平台的无缝集成 与主流虚拟化平台的深度对接 跨平台管理与资源整合的独特优势 六、总结 一、服务器虚拟化的时代浪潮与核心意义 在当今数字化转型加速的时代背景下,服务器虚拟化技术已成为信息技术领域的关键驱动力之一。服务器虚拟化旨在通过软件技术将一台物理服务器划分为多个相互隔离且独立运行的虚拟服务器环境,也就是虚拟机(VM)。这一创新技术带来了诸多显著优势,如显著提高服务器资源利用率,使得企业能够在有限的硬件资源基础上运行更多的应用程序和服务;大幅降低硬件采购成本与数据中心能源消耗,为企业节省大量资金并助力环保事业;同时,

《机器人实践开发①:Foxglove 开发环境完整搭建指南(含常见坑位) 》

《机器人实践开发①:Foxglove 开发环境完整搭建指南(含常见坑位) 》

导语: 在机器人项目中,调试工具往往比算法本身更耗时间。Foxglove 作为新一代机器人可视化平台,提供了强大的话题订阅、视频显示、3D 展示和日志分析能力。本篇从零开始,手把手带你完成 Foxglove 的环境搭建,包含依赖安装、连接配置以及常见踩坑点。 《机器人实践开发》系列文章索引 《机器人实践开发①:Foxglove 开发环境完整搭建指南(含常见坑位)》 《机器人实践开发②:Foxglove 嵌入式移植 + CMake 集成》 《机器人实践开发③:Foxglove可视化机器人的眼睛-视频》 《机器人实践开发④:Foxglove可视化机器人的耳朵-声音》 《机器人实践开发⑤:Foxglove可视化机器人的3D显示》 《机器人实践开发⑥:Foxglove可视化机器人传感器数据》 《机器人实践开发⑦:Foxglove可视化机器人的日志显示》 《机器人实践开发⑧:Foxglove可视化机器人的地图显示》 《机器人实践开发⑨:Foxglove可视化机器人的MyBag 数据回放》 foxglove 官网 Foxglove 是一个专为机器人团队打造的平台,用于收

从零开始使用ISSACLAB训练自己的机器人行走

从零开始使用ISSACLAB训练自己的机器人行走

ISAACLAB入门教程 作者:陈维耀 1. 环境配置 1.1 推荐配置 * 操作系统: Ubuntu 22.04 LTS * 显卡: NVIDIA RTX 4080或以上 1.2 ubuntu 22.04 LTS安装 参考ZEEKLOG的Ubuntu 16.04 LTS安装教程,将其中的ubuntu 16.04镜像文件替换为ubuntu 22.04镜像文件,其他步骤保持不变,建议/home与/usr的硬盘容量均不少于200G。 1.3 安装NVIDIA驱动 根据自身显卡型号与操作系统,选择对应的显卡驱动,建议选择550.xxx.xxx版本的显卡驱动,按照教程进行安装即可,安装完成后在终端输入nvidia-smi,若出现以下信息则表示驱动安装成功: Thu Jun 5

FPGA开发必看!Xilinx Vivado付费IP核License状态解读与获取/vivado最新license获取

FPGA开发必看!Xilinx Vivado付费IP核License状态解读与获取/vivado最新license获取

Xilinx(AMD) vivado软件全部付费IP核及license许可介绍和获取 制作不易,记得三连哦,给我动力,持续更新!!! License或IP src源码 文件下载:Xilinx IP 完整license获取 (点击蓝色字体获取)(可提供IP源码) 一、介绍 Vivado是Xilinx(现属AMD)FPGA开发的核心工具,其内置的IP核资源库极为丰富。这些IP核根据来源可分为两大类: 一类是Xilinx官方提供的IP核,另一类则来自第三方供应商。从授权方式来看,又可划分为免费授权和商业授权两种类型。对于需要商业授权的IP核,用户必须获取对应的License文件方可正常使用。 二、Xilinx IP核 2.1 Xilinx 免费IP Xilinx(AMD)自主开发的IP核主要提供基础功能模块和必要接口组件,涵盖数字信号处理、通信协议、存储控制等通用功能。这类IP核已集成在Vivado开发环境中,用户完成软件安装后即可直接调用,无需额外授权文件。其完整支持设计全流程,包括功能仿真、逻辑综合、布局布线以及比特流生成。在Vivado的License管理界面中,