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

什么是NVIDIA Isaac Sim WebRTC Streaming Client?

NVIDIA Isaac Sim WebRTC Streaming Client是NVIDIA为Isaac Sim打造的远程串流客户端,基于WebRTC协议,可让用户在无高性能GPU的设备上远程访问运行于云端或工作站的Isaac Sim(含无头模式),实现低延迟交互与图形化界面显示,是机器人仿真远程协作与开发的核心工具。以下从核心特性、运行条件、使用流程、关键配置与常见问题等方面详细介绍: 核心定位与优势 * 核心功能:将Isaac Sim的图形界面、物理仿真画面与交互操作远程串流至本地,支持模型编辑、场景调试、机器人控制等全流程操作,无需本地渲染能力。 * 核心优势 * 低延迟传输:WebRTC协议优化实时音视频流,适配机器人仿真的实时交互需求。 * 跨平台兼容:支持Linux、Windows、macOS客户端,适配主流桌面系统。 * 适配无头模式:完美对接Isaac Sim headless实例,适合云端/服务器部署场景。 * 高安全性:通过加密传输与端口隔离,保障远程访问安全。 运行要求 1. 服务端(Isaac Sim 侧)

Web 前端基础知识点汇总

Web 前端基础知识点汇总

一、HTML 基础 1.1 浏览器内核 浏览器内核核心包含渲染引擎(解析 HTML/CSS,渲染页面)和JS 引擎(解析执行 JavaScript),不同浏览器内核差异如下: 浏览器内核备注IETrident适配 IE、早期 EdgeFirefoxGecko近年市场份额下降,存在打开速度慢、升级频繁问题SafariWebKit常被误称为 Chrome 内核(Chrome 现已改用 Blink)ChromeChromium/BlinkBlink 是 WebKit 分支,多数国产浏览器最新版基于 Blink 二次开发OperaPresto/Blink早期用 Presto,现跟随 Chrome 使用 BlinkEdgeEdgeHTML/Blink新版 Edge 已切换为 Blink 内核 1.2 Web 标准(

别再手动切图!用 ClaudeCode+Figma-MCP 实现 UI 设计 1:1 前端还原

使用 Figma-MCP 实现设计还原 Figma-MCP(Measure Copy Paste)是 Figma 的插件,能够快速提取设计稿中的间距、颜色、尺寸等参数,避免手动测量。安装后选中元素即可查看属性,按 Alt 键复制数值,直接粘贴到代码中。 配置 ClaudeCode 生成代码 ClaudeCode 是 Claude 的代码生成功能,支持根据设计参数输出前端代码。在对话中描述需求并附上 Figma-MCP 提取的数据,例如: 生成一个 React 按钮组件,参数如下: - 宽度:120px - 高度:40px - 背景色:#3B82F6 - 圆角:8px - 文字:"

基于 Spring Boot 的 Web 三大核心交互案例精讲

基于 Spring Boot 的 Web 三大核心交互案例精讲

—知识点专栏——JavaEE专栏— 作为 Spring Boot 初学者,理解后端接口的编写和前端页面的交互至关重要。本文将通过三个经典的 Web 案例——表单提交、AJAX 登录与状态管理、以及 JSON 数据交互——带您掌握前后端联调的核心技巧和 Spring Boot 的关键注解。 1. 案例一:表单提交与参数绑定(计算求和) 本案例展示最基础、最传统的 Web 交互方式:HTML 表单提交。 1.1 后端代码:CalcController.java 使用 @RestController 简化接口编写,并通过方法参数接收表单数据。 packagecn.overthinker.springboot;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.