WebRTC简介及应用

WebRTC(Web Real-Time Communication)是一种支持浏览器和移动设备进行实时音视频通信的技术,无需安装插件或额外的软件。它是一个开放标准,最初由Google推动,并被W3C(万维网联盟)和IETF(互联网工程任务组)标准化。

WebRTC 的核心功能:

  1. 音视频采集(获取本地摄像头、麦克风)

  2. 音视频编解码(支持VP8/VP9/H.264等视频编码,Opus/G.711等音频编码)

  3. P2P(点对点)传输(通过UDP和NAT穿透技术进行低延迟通信)

  4. 数据通道(DataChannel)(可用于传输文本、文件等数据)

WebRTC 的主要 API:

  • getUserMedia:获取本地音视频流

  • RTCPeerConnection:建立点对点连接

  • RTCDataChannel:进行P2P数据传输

WebRTC 的应用场景:

  • 视频通话(如 Google Meet、Zoom)

  • 直播推流(结合 WebRTC + Media Server)

  • 远程协作(如 Google Docs 的多人编辑)

  • 在线教育、远程医疗

  • 物联网(IoT)设备的远程控制 

在 Vue 2 前端项目中使用 WebRTC,可以实现视频通话、音视频流传输、屏幕共享等功能。以下是 WebRTC 在 Vue 2 项目中的基本实现步骤:


1. WebRTC 基本概念

WebRTC 提供了三个核心 API:

  • getUserMedia():获取摄像头、麦克风权限

  • RTCPeerConnection:建立 P2P 连接,传输音视频

  • RTCDataChannel:传输文本、文件等数据

创建 WebRTC.vue 组件

<template><div><h2>WebRTC 视频采集</h2><video ref="localVideo" autoplay playsinline></video><button @click="startCamera">启动摄像头</button><button @click="stopCamera">关闭摄像头</button></div>
</template><script>
export default {data() {return {localStream: null,};},methods: {async startCamera() {try {this.localStream = await navigator.mediaDevices.getUserMedia({video: true,audio: true,});this.$refs.localVideo.srcObject = this.localStream;} catch (error) {console.error("获取摄像头失败:", error);}},stopCamera() {if (this.localStream) {this.localStream.getTracks().forEach(track => track.stop());this.localStream = null;}},},
};
</script>

效果:点击按钮可以打开/关闭摄像头,并在 <video> 组件中显示

实现 WebRTC P2P 连接

如果想要实现点对点(P2P)通信,需要使用 RTCPeerConnection,并结合 WebSocket / Socket.io 进行信令交换。

创建 PeerConnection.vue 组件

<template><div><h2>WebRTC P2P 视频通话</h2><video ref="localVideo" autoplay playsinline></video><video ref="remoteVideo" autoplay playsinline></video><button @click="startCall">开始通话</button></div>
</template><script>
export default {data() {return {localStream: null,peerConnection: null,remoteStream: null,};},methods: {async startCall() {// 1. 获取本地视频流this.localStream = await navigator.mediaDevices.getUserMedia({video: true,audio: true,});this.$refs.localVideo.srcObject = this.localStream;// 2. 创建 RTCPeerConnectionthis.peerConnection = new RTCPeerConnection();// 3. 添加本地流到 PeerConnectionthis.localStream.getTracks().forEach(track => {this.peerConnection.addTrack(track, this.localStream);});// 4. 监听远程流this.peerConnection.ontrack = event => {if (!this.remoteStream) {this.remoteStream = new MediaStream();this.$refs.remoteVideo.srcObject = this.remoteStream;}this.remoteStream.addTrack(event.track);};// 5. 创建 offer(本地 SDP)const offer = await this.peerConnection.createOffer();await this.peerConnection.setLocalDescription(offer);console.log("本地 SDP:", offer);// 这里需要使用 WebSocket / Socket.io 发送 SDP 给远程端},},
};
</script>

效果

  • 获取本地视频流,并在 <video> 中播放

  • 创建 WebRTC 连接,并监听远程视频流

  • 生成 SDP(用于信令交换)

信令服务器(使用 WebSocket)

WebRTC 需要信令服务器来交换 SDP 和 ICE 候选信息。可以使用 WebSocket 或 Socket.io 来实现:

后端(Node.js + WebSocket)
const WebSocket = require("ws");
const server = new WebSocket.Server({ port: 3000 });server.on("connection", ws => {ws.on("message", message => {console.log("收到消息:", message);server.clients.forEach(client => {if (client !== ws && client.readyState === WebSocket.OPEN) {client.send(message);}});});
});

前端(Vue 使用 WebSocket 发送 SDP)

const socket = new WebSocket("ws://localhost:3000");this.peerConnection.onicecandidate = event => {if (event.candidate) {socket.send(JSON.stringify({ candidate: event.candidate }));}
};socket.onmessage = async message => {const data = JSON.parse(message.data);if (data.sdp) {await this.peerConnection.setRemoteDescription(data.sdp);if (data.sdp.type === "offer") {const answer = await this.peerConnection.createAnswer();await this.peerConnection.setLocalDescription(answer);socket.send(JSON.stringify({ sdp: answer }));}} else if (data.candidate) {await this.peerConnection.addIceCandidate(data.candidate);}
};

效果

  • 通过 WebSocket 服务器交换 SDP(Offer & Answer)

  • 传递 ICE 候选信息,实现 P2P 连接

3. WebRTC 进阶功能

屏幕共享

const stream = await navigator.mediaDevices.getDisplayMedia({ video: true });
this.$refs.localVideo.srcObject = stream;

数据通道(P2P 传输文本/文件)

const dataChannel = peerConnection.createDataChannel("chat");
dataChannel.onmessage = event => console.log("收到消息:", event.data);
dataChannel.send("Hello WebRTC!");

4. WebRTC 在项目中的应用,例如风电项目中的应用

你可以用 WebRTC 实现:

  • 风场监控:远程视频直播,实时监测风机状态

  • 远程协作:风机运维人员可以通过 WebRTC 进行视频通话,远程指导维修

  • 数据传输:通过 WebRTC RTCDataChannel 低延迟传输风机运行数据

总结

需求方案
采集摄像头getUserMedia()
P2P 音视频RTCPeerConnection
远程信令WebSocket / Socket.io
屏幕共享getDisplayMedia()
数据传输RTCDataChannel

P2P是什么?

P2P(Peer-to-Peer,点对点)是一种去中心化的通信模式,指的是两个或多个设备可以直接通信,而无需依赖中间服务器。在 WebRTC 中,P2P 主要用于实现点对点音视频通话、文件传输等功能。

P2P vs 传统客户端-服务器模式

模式特点示例
客户端-服务器(Client-Server)需要一个中心服务器来转发数据HTTP 请求、WebSocket 聊天、直播服务器
P2P(Peer-to-Peer)设备之间直接通信,无需服务器转发WebRTC 视频通话、种子下载(BitTorrent)

P2P 的优点

  • 低延迟:数据直接传输,无需绕服务器

  • 节省带宽:不占用服务器流量

  • 去中心化:无须依赖单点服务器

P2P 的挑战

  • NAT 穿透:有些网络环境(如 4G、WiFi)可能会阻止 P2P 连接

  • 信令交换:需要 WebSocket / Socket.io 来建立连接


📌 P2P 在 WebRTC 中的作用

WebRTC 通过 RTCPeerConnection 实现 P2P 连接:

  1. 本地设备 获取摄像头/麦克风数据

  2. 信令服务器 交换 SDP 和 ICE 候选信息

  3. 建立 P2P 连接,直接传输音视频流

示例:P2P 连接代码

const peer = new RTCPeerConnection();// 监听 ICE 候选信息
peer.onicecandidate = event => {if (event.candidate) {sendToServer({ candidate: event.candidate });}
};// 监听远程视频流
peer.ontrack = event => {document.querySelector("#remoteVideo").srcObject = event.streams[0];
};// 发送音视频流
navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then(stream => {document.querySelector("#localVideo").srcObject = stream;stream.getTracks().forEach(track => peer.addTrack(track, stream));});

 

实现效果

  • 设备 A 和 B 通过 WebRTC 直接交换音视频数据,无需服务器转发

  • 服务器只负责信令交换,实际音视频数据是P2P 直连

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】分支与循环(上)

前言&#xff1a;C语言是由顺序结构、选择结构、循环结构组成的结构化的程序设计语言。 那C语言是如何设计和实现这些结构的呢&#xff1f;话不多说&#xff0c;马上开始。 三种结构如图所示&#xff1a; 我们可以使用 if else语句、 switch语句 来实现选择&#xff08;分支&am…

一次与chatgpt关于VO的深入讨论。

我&#xff1a; {"usageRate":50,"projectInfo":[{"productName":"长江一号","deviceInfo":[{"deviceName":"AA","num":10},{"deviceName":"BB","num":3}]},…

Springboot学习笔记3.20

目录 1.实战篇第一课 我们将会在本次实战中学习到哪些知识点&#xff1f; 开发模式和环境搭建&#xff1a; 注册接口 1.Lombok 2.开发流程 1.controller层&#xff0c;这个层会指明访问路径和要执行的逻辑&#xff1a; 2.我们把返回结果根据接口文档包装成一个类result&a…

docker save如何迁移镜像更节省空间?

文章目录 方法一&#xff1a;使用docker save命令方法二&#xff1a;直接保存多个镜像到一个tar文件哪个方法更节省磁盘空间&#xff1f;空间效率对比实际测试示例其他优势结论 如何用脚本迁移加载镜像 迁移镜像时候&#xff0c;往往会碰到基础镜像相同的很多镜像需要迁移&…

全新升级 | Built For You Spring ‘25 发布,Fin 智能客服实现新突破!

图像识别、语音交互、任务自动化&#xff0c;立即体验智能客服蜕变&#xff01; 上周&#xff0c;Intercom 举办了 Built For You Spring 25 发布会&#xff0c;正式揭晓了 AI Agent Fin 的一系列令人振奋的更新。Fin 正在以前所未有的速度革新客户支持模式——它已经成功解决了…

需求导向的K8S网络原理分析:Kube-proxy、Flannel、Calico的地位和作用

最近发现自己似乎从来没学明白过Kubernetes网络通信方案&#xff0c;特开一贴复习总结一下。 在k8s中&#xff0c;每个 Pod 都拥有一个独立的 IP 地址&#xff0c;而且假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中。所以不管它们是否允许在同一个 Node&#xff08;宿…

Vulnhub:Digitalword.local: FALL靶机渗透

将靶机按照图中连接方式打开&#xff0c;fall在virtualBox中打开 信息收集 扫描得ip arp-scan -l 扫描端口 nmap -A -T4 -sV -p- 扫描目录 gobuster dir -u http://192.168.117.160 -x php,txt,html -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 一个一个…

4、网工软考—VLAN配置—hybird配置

1、实验环境搭建&#xff1a; 2、实验过程 SW1&#xff1a; 先创建vlan2和vlan3 [Huawei-Ethernet0/0/2]port link-type hybrid //hybird端口 [Huawei-Ethernet0/0/2]port hybrid pvid vlan 2 [Huawei-Ethernet0/0/2]port hybrid untagged vlan 10 //撕掉vlan10的标签 …

【OCR】技术

OCR图像识别 一、OCR是什么二、Python中如何实现OCR1.简单应用 三、OCR的核心步骤1.​图像预处理​&#xff08;提高识别准确率&#xff09;2.​文字识别3.​输出结果 四、OCR到的应用场景五、注意事项六、扩展学习 此贴用来更新在工作中遇到的一些图片解析内容 一、OCR是什么 …

深入理解 dispatchEvent:前端事件触发的艺术

dispatchEvent 是 DOM 元素的一个方法&#xff0c;用于手动触发/派发一个事件。这个方法允许开发者以编程方式触发事件&#xff0c;而不是等待用户交互或浏览器自动触发。 1.基本概念 作用&#xff1a;dispatchEvent 用于在指定的 DOM 节点上触发一个事件 使用场景&#xff1…

2025年数智化电商产业带发展研究报告260+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p41286 在数字技术与实体经济深度融合的当下&#xff0c;数智化产业带正成为经济发展的关键引擎。 从云南鲜花产业带的直播热销到深圳3C数码的智能转型&#xff0c;数智化正重塑产业格局。2023年数字经济规模突破53.9万亿元&#xff…

【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV5模型部署

【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…

深入解析 JSON-RPC:从基础到高级应用(附调用示例)

在当今的软件开发领域&#xff0c;远程过程调用&#xff08;RPC&#xff09;技术是实现分布式系统间通信的关键手段之一。JSON-RPC&#xff0c;作为一种基于 JSON 数据格式的轻量级 RPC 协议&#xff0c;因其简洁性和高效性而备受青睐。本文将全面深入地探讨 JSON-RPC 的核心概…

抽象代数:群论

系列笔记为本学期上抽象代数课整理的&#xff0c;持续更新。 群的相关定义 群的定义 群是一个带有满足结合律、单位元、逆元的二元运算的集合&#xff0c;记作 ( G , ⋅ ) \left({G, \cdot}\right) (G,⋅)。若群运算满足结合律&#xff0c;则该集合构成半群。如果该半群中含…

线程同步——读写锁

Linux——线程同步 读写锁 目录 一、基本概念 1.1 读写锁的基本概念 1.2 读写锁的优点 1.3 读写锁的实现 1.4 代码实现 一、基本概念 线程同步中的读写锁&#xff08;Read-Write Lock&#xff09;&#xff0c;也常被称为共享-独占锁&#xff08;Shared-Exclusive Lock&a…

全面解析PRN文件:从原理到可视化的完整指南 【标签打印】

文章目录 一、PRN文件概述二、PRN文件结构深度解析2.1 文件头配置2.1 绘图指令详解2.3 文本处理方案2.4 条码/二维码实现2.5 RFID指令集 三、实战&#xff1a;PRN可视化工具开发3.1 基于Canvas的实现方案3.2 坐标转换关键算法 四、常见问题解决方案4.1 内容偏移问题4.2 中文乱码…

C++:函数(通识版)

一、函数的基础 1.什么是函数&#xff1f;&#xff08;独立的功能单位&#xff09; 函数是C中封装代码逻辑的基本单元&#xff0c;用于执行特定任务。 作用&#xff1a;代码复用、模块化、提高可读性。 2、函数的基本结构 返回类型 函数名(参数列表) {// 函数体return 返回值…

sql注入语句学习

说明 注入漏洞作为登顶过web十大漏洞多次的漏洞&#xff0c;危害性不言而喻&#xff0c;其中sql注入就是注入漏洞常用的手段。其形成的原因是由于web在接收传参数据时&#xff0c;对数据的过滤不够严格&#xff0c;将其带入到数据库查询中&#xff0c;导致用户可以通过传参一些…

云钥科技多通道工业相机解决方案设计

项目应用场景分析与需求挑战 1. 应用场景 ‌目标领域‌&#xff1a;工业自动化检测&#xff08;如精密零件尺寸测量、表面缺陷检测&#xff09;、3D立体视觉&#xff08;如物体建模、位姿识别&#xff09;、动态运动追踪&#xff08;如高速生产线监控&#xff09;等。 ‌核心…

离散的数据及参数适合用什么算法做模型

离散数据和参数适用的机器学习算法取决于具体任务(分类、回归、聚类等)、数据特点(稀疏性、类别数量等)以及业务需求。以下是针对离散数据的常用算法分类和选择建议: 1. 分类任务(离散目标变量) 经典算法 决策树(ID3/C4.5/CART) 直接处理离散特征,无需编码,可解释性…