WebRTC基础

news2025/1/5 10:17:59

有用的网址:

https://webrtc.org/

WebRTC API - Web API 接口参考 | MDN

Browser APIs and Protocols: WebRTC - High Performance Browser Networking(O'Reilly)

浏览器中查看webrtc运行的实时信息:

Chrome浏览器:chrome://webrtc-internals/

Firefox浏览器:about:webrtc

解析webrtc dump:Import webrtc-internals dumps

一、WebRTC简介

WebRTC:Web Real-Time Communication,网页即时通信。WebRTC是一个谷歌开源项目,由一组标准、协议和JavaScript API组成,用于实现浏览器之间(端到端)的音频、视频及数据共享,不再需要借助任何插件。

WebRTC可简单理解为:一个支持网页浏览器进行实时音频或视频对话的API,即音视频处理+及时通讯的开源库。

WebRTC的特点:

1.开源、免费,开发者不需要承担高昂的专利费用。

2.基于浏览器,不需要安装插件,只要调用就可以实现音视频互动。

3.被纳入了HTML5标准,主流浏览器全面支持 WebRTC。

最常见的 WebRTC 场景很可能是两个浏览器都运行相同的 Web 应用程序(从相同的网页下载),如下图:

WebRTC web 应用程序(通常以 HTML 和 JavaScript 的混合形式编写) 通过标准化的 WebRTC API 与 web 浏览器交互,从而允许它适当地利用和控制实时浏览器功能,如下图:

二、WebRTC相关概念

WebRTC中,有三个主要的知识点,分别是:

  • MediaStream:获取音频和视频流
  • RTCPeerConnection:音频和视频数据通信
  • RTCDataChannel:应用数据通信

WebRTC 通信过程中的四种角色:

  • Signal Server
  • ICE/TURN/STUN Server
  • Remote Peer
  • Local Peer

WebRTC 通信过程中的基本概念:

  • Room:Signal Server使用Room的概念对同一组通信的peers进行配对管理,一个room中包含有1个或者多个peers。当没有peers存在时room销毁;当第一个peer连接到signal server时执行create room动作,此时因为没有其他peers,建立room的这个peer不与其他节点建立P2P通信;其他peers随后加入room,加入room后会主动与room已经存在的peer建立连接;
  • Offer:主动与其他peer建立P2P链接的peer把自己的SDP信息整理好,通过signaling server转发给room里面的其他peer,这个SDP信息包就是Offer;
  • Answer:被动连接的Peer在收到signaling server转发的其他peer的offer信息以后,也把自己的SDP信息整理好,同样通过signal server转发给主动连接它的peer,他自己的SDP信息包就是Answer;
  • IceCandidate:Peer与ICE/TURN/STUN Server建立连接,获取自己的NAT类型以及外网IP和端口,这些ICE/TURN/STUN Server返回的消息就是IceCandidate;

三、WebRTC通信流程

对于上图中描述的PeerConnection建立的完整流程进行以下说明(上图是以ClientA主动向ClientB发起连接为例):

1.首先ClientA和ClientB连接到Signal Server上(如通过WebSocket连接);

2. ClientA在本地通过GetUserMedia获取本地媒体设备的数据,并创建PeerConnection对象,调用其AddStream方法把本地的Media添加到PeerConnection对象中。

(对于ClientA而言,既可以在与Signaling Server建立连接之前就创建并初始化PeerConnection如阶段1,也可以在建立Signaling Server连接之后创建并初始化PeerConnection如阶段2;ClientB既可以在上图的1阶段也可以在2阶段做同样的事情,访问自己的本地接口并创建自己的PeerConnection对象。)

3.通信由ClientA发起,所以ClientA调用PeerConnection的CreateOffer接口创建自己的SDP offer,ClientA通过PeerConnection的SetLocalDescription方法将该SDP对象保存起来,并把这个SDP Offer信息通过Signal Server通道中转发给ClientB;

4. ClientB收到Signaling Server中转过来的ClientA的SDP信息也就是offer后,通过PeerConnection的SetRemoteDescription方法将其保存起来。然后调用CreateAnswer创建自己的SDP信息也就是answer,并通过PeerConnection的SetLocalDescription的方法保存该应答SDP,并把这个answer通过Signal server转发给ClientA;

 5.   ClientA收到转发的answer消息,将其通过PeerConnection的SetRemoteDescription方法保存起来;

 6.  在offer/answer流程中,ClientA和ClientB开始收集candidate信息。ClientA通过自己PeerConnection创建时传递的参数等待来自于ICE server的通信,获取自己的candidate,当candidate available的时候会自动回调PeerConnection的OnIceCandidate;

 7.  ClientA通过Signling Server发送自己的Candidate给ClientB,ClientB依据同样的逻辑把自己的Candidate通过Signaling Server中转发给ClientA;

 8. 检查ICE Candidate的连接状态,选择可用的Candidate。

 9. DTLS协商秘钥,用于RTP数据的加密和解密

    在 WebRTC 中使用 DTLS 的地方包括两部分:协商和管理 [SRTP]密钥和为 [DataChannel]提供加密通道。

 至此ClientA和ClientB通过PeerConnection建立连接,P2P通道建立。

四、WebRTC API

 1. 获取本地媒体设备的音视频:navigator.mediaDevices.getUserMedia()

用法:

const constraints = {

    'video': true,

    'audio': true

}

navigator.mediaDevices.getUserMedia(constraints)

    .then(stream => {

        console.log('Got MediaStream:', stream);

    })

    .catch(error => {

        console.error('Error accessing media devices.', error);

    });

2. 屏幕共享:avigator.mediaDevices.getDisplayMedia() 

3. 建立对等连接:new RTCPeerConnection()

示例:

var pc_config = webrtcDetectedBrowser === 'firefox' ?

{'iceServers':[{'urls':'stun:23.21.150.121'}]} : // IP address

{'iceServers': [{'urls': 'stun:stun.l.google.com:19302'}]};

var pc_constraints = {

'optional': [

{'DtlsSrtpKeyAgreement': true}

]};

pc = new RTCPeerConnection(pc_config, pc_constraints);

RTCPeerConnection.createOffer() / RTCPeerConnection.createAnswer()进行媒体协商

语法:aPromise = pc.createOffer([options]);

在交换sdp信息的同时,ice信息也在进行交换,通过交换ice信息,最终会选择一种合适的方式来建立连接(p2p或者基于turn服务器的延时转发通路)

每当发现新的候选对象(即IPport tuple)时,ICE 代理就会自动将其注册到 RTCPeerConnection 对象,并通过回调函数(onIceCandidate)通知应用程序。 该应用程序可以决定在发现每个候选者之后(Trickle ICE)尽快将其转移到远程方,或者决定等待 ICE 收集阶段完成,然后立即发送所有候选者。

pc.onicecandidate = handleIceCandidate;

RTCPeerConnection.createDataChannel()

语法:dataChannel = RTCPeerConnection.createDataChannel(label[, options]);

返回一个RTCDataChannel对象,RTCDataChannel有send()和close()方法实现数据的发送

五、非媒体数据通信

使用DTLS与SCTP协议实现安全的可靠传输,可与媒体数据共用一个传输层端口。

The standardization work within the IETF has reached a general consensus on the usage of the Stream Control Transmission Protocol (SCTP) encapsulated in DTLS to handle nonmedia data types.

如下图抓包为连续多次发送字符串"dfdfdeedd"

如果没有createOffer() 则不会进行ice协商

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

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

相关文章

Linux(Ubuntu2004)实现kitti数据集的点云投影记录

1、新建终端打开roscore roscore 2、在“下载”路径里面播放example_new的bag rosbag play example_new.bag -l 3、在catkin_ws里面运行下列命令 rosrun ros_detection_tracking projector 如果不能运行,可以采用tab的方式查看是否错误 4、新建一个终端运行r…

Kafka 入门到起飞 - 生产者发送消息流程解析

生产者通过send()方法发送消息消息会经过拦截器->序列化器->分区器 进行加工然后将消息存在缓冲区当缓冲区中消息达到条件会按批次发送到broker对应分区上broker将接收到的消息进行刷盘持久化消息处理broker会返回给producer响应落盘成功返回元数据…

孟德尔随机化推断暴露因素与健康结局的因果关系

学习视频: 应用孟德尔随机化方法推断暴露因素与健康结局的因果关系 王友信教授 梅斯医学_哔哩哔哩_bilibili http://chinaepi.icdc.cn/zhlxbx/ch/reader/create_pdf.aspx?file_no20170427&flag1&journal_idzhlxbx&year_id2017 1. 孟德尔随机化方法 传…

详细介绍matlab使用支持向量机(SVM)预测股票市场趋势的实例

简介: 股票市场的趋势预测一直是投资者和交易员关注的重要问题之一。支持向量机(SVM)作为一种强大的机器学习算法,被广泛应用于股票市场趋势预测。本实例将介绍如何使用SVM来预测股票市场的涨跌趋势,并提供一个MATLAB代码示例。 数据准备: 首先,我们需要获取股票市场的历…

《面试1v1》Kafka优缺点别用错

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结&#xf…

常用在线AI人工智能效率工具站点导航

详情请前往:常用在线AI人工智能工具站点导航

stm32(HAL库)使用printf函数打印到串口

目录 1、简介 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 串口外设配置 2.3 项目生成 3、KEIL端程序整合 4、效果测试 1、简介 在HAL库中,常用的printf函数是无法使用的。本文通过重映射实现在HAL库中进行printf函数。 2.1 基础配置 2.1.1 SYS配置 2.1.2 …

quartus工具篇——modelsim的使用

文章目录 quartus工具篇——modelsim的使用1、modelsim简介二、使用教程1、新建工程添加文件 2、生成编写仿真文件3、设置仿真4、开启功能仿真5、开启时序仿真6、总结参考视频: quartus工具篇——modelsim的使用 1、modelsim简介 Quartus Prime是一款由英特尔开发…

【JavaEE初阶】博客系统的前端页面设计

文案分享~ 许多人终其一生都想从别人身上找寻爱, 以为爱是自然界的第二个太阳。 却忘了自己才是那道照耀全世界的光。 文章目录 1.博客主要组成页面2.博客列表页3.博客详情页4.博客登录页5.博客编辑页 1.博客主要组成页面 博客主要是由四个页面组成.分别是: 博…

3.3 Bootstrap 按钮组

文章目录 Bootstrap 按钮组基本的按钮组按钮工具栏按钮的大小嵌套垂直的按钮组 Bootstrap 按钮组 按钮组允许多个按钮被堆叠在同一行上。当你想要把按钮对齐在一起时,这就显得非常有用。您可以通过 Bootstrap 按钮(Button) 插件 添加可选的 J…

数据结构(2.1)——时间复杂度和空间复杂度计算

前言 (1)因为上一篇博客:数据结构(2)—算法对于时间复杂度和空间复杂度计算的讲解太少。所以我在次增加多个案例讲解。 (2)上一篇已经详细介绍了,为什么我们的算法要使用复杂度这一个…

Docker部署jar包运行

目录 场景 方法 运行 场景 springboot项目,打包成jar包,想要放到docker中运行 这种方式就是运行一个jdk的容器,然后挂载其中的目录到宿主机,然后运行之后,就可以将需要运行的jar放在宿主机的挂载目录下,然后每次…

匈牙利算法解决英雄配色问题

匈牙利算法解决英雄配色问题 最近在开发中遇到了这种情况,策划要为每个英雄去做配色,一个英雄在表中可能有多个配色(可能重复),每次对局要选出五个英雄并让他们的颜色不同 (实际不是这个,简化成的这个需求)…

nacos面经详解

1 为什么要懂nacos的详细原理? 只要你简历写过你用过nacos,则大厂(阿里),尤其是使用过这款产品的大中厂,基本必问其中的原理。里面的设计理念还有很多分布式系统的原理值得学习和深究。 2 分布式理论基础…

进制转换详解(解释原理简单易懂)

前言:在网上看了许多篇关于不同进制之间如何转换的文章,包括很多浏览量上万的博客。大多都只是把转换的规则罗列了出来,例如十进制转二进制,可能大家都知道方法,“除以2反向取余数,直到商为0”。应用该方法…

黎曼猜想的验证

11 for n 1 : 100000 sum sum cos(14.134725*log(n))/(n^(-0.5)) end sum -1.1151e06

IDEA设置自动导包功能

IDEA设置自动导包功能 选择File--Settings--Edotor-General-Auto Import,勾选上下图中的选项后点击 OK 即可。导包无忧~~ Add unambiguous imports on the fly:自动导入不明确的结构 Optimize imports on the fly:自动帮我们优化导入的包

vep加密视频破解转换翻录为mp4教程

可能有很多人都没有听说过这个视频格式,这是大黄蜂云课堂播放器所独有的格式,只有通过该播放器才能够打开这个加密的视频,安全系数很高,但也极大的限制了一个视频的传播和播放。如果我们在网络上下载了vep格式的视频,可…

消息队列总结(2)- RabbitMQ Kafka RocketMQ运行架构

目录 1 RabbitMQ 1.1 工作原理 1.2 名词解释 1.3 交换机的几种类型 2 Kafka 2.1 工作原理 2.2 基本概念 3 RocketMQ 3.1 工作原理 3.2 基本概念 4 RabbitMQ & Kafka & RocketMQ的差异 5 参考文档 1 RabbitMQ 1.1 工作原理 1.【消息生产】生产者&#xff0…

TMS FNC Core Crack

TMS FNC Core Crack 跨框架核心层,用于创建丰富的可视化和非可视化组件。 特点 JSON读、写和解析功能 Base64和URL编码和解码 组件持久性 撤消/恢复管理器 数字、字母数字字符集的验证 消息、文件打开和保存对话框 轻松访问应用程序和文档文件夹 打开文件和URL 位图…