WebRTC建立会话流程分析

article/2025/6/19 14:15:22

WebRTC建立会话流程总结

 

了解如何运行PeerConnection Demo后,熟悉运行流程可以做为深入学习WebRTC的切入点。本节重点解释客户端双方建立会话时交互的主要信令(控制会话的文本协议)和与信令相关的 WebRTC API。

 

准备工作

 

 

peerconnection_client 工程主要分为三个部分,main_wnd.h 是视图类,主要包括用户界面相关代码;conductor.h是控制器,负责响应界面行为,控制会话的生命周期等;peer_connection_client.h是传输层,用于传输相应的信令。

 

 

为了方便理解客户端通信的建立步骤,可以稍加改动peerconnection_client的源代码使其从2个客户端的通信变为1个客户端的回环测试(loopback)。打开 src/all.sln, 修改 Conductor::StartLogin()函数为:

void Conductor::StartLogin(const std::string& server, int port) {InitializePeerConnection();ReinitializePeerConnectionForLoopback();return;if (client_->is_connected())return;server_ = server;client_->Connect(server, port, GetPeerName());
}

修改后只需要使用1个客户端就可以进行音视频回环测试,点击"Connect"按钮就可以看到自己的摄像头。这样便于熟悉本例的流程架构。

 

流程分析

流程总结

 

WebRTC建立通信的基本流程如下图所示,其中:

 

 

* 步骤1-2中主叫(Caller) 先配置会话的基本参数,比如本次会话是否包含音频流或者视频流等参数;再根据会话的参数创建Offer SDP(Session Description Protocol)后通过信令服务器转发给被叫(Callee)。

* 步骤3,5,6中被叫保存主叫的Offer SDP, 并依据Offer SDP创建Answer SDP,发送给主叫。

* 步骤8中主叫保存了被叫的Answer SDP,至此主叫和被叫双方都保存了己方和对方的SDP

* 步骤9,10中主叫发送自己的IceCandidate给被叫方。

* 步骤11,12中被叫发送自己的IceCandidate给主叫。

* 主叫和被叫双方都接收到对方的IceCandidate后,就可以建立连接了。

 

生成SDP

 

SDP是 SessionDescription Protocol的简称,它是一套描述流媒体交互参数的标准协议,即RFC4566。WebRTC使用SDP协议描述会话参数。

主叫(Caller)生成SDP的流程如下图所示:

 

* 调用PeerConnectionInterface::CreateOffer()生成的 Offer SDP会异步通知给Conductor::OnSuccess()。

* 被叫生成的Answer SDP 会从Conductor::OnMessageFromPeer传过来,然后通过PeerConnectionInterface::SetRemoteDescription接口设置。

* 被叫调用 PeerConnectionInterface的对应接口以及顺序和主叫有一定区别,具体为:SetRemoteDescription() -> CreateAnswer() -> SetLocalDescription()。

* 对于主叫,SetLocalDescription()的参数为Offer SDP,SetRemoteDescription()的参数为Answer SDP。

* 对于被叫,SetRemoteDescription()的参数为为Offer SDP, SetLocalDescription()的参数为Answer SDP。

* WebRTC通过如下常量来区分Offer SDP和Answer SDP。

const char SessionDescriptionInterface::kOffer[] = "offer";
const char SessionDescriptionInterface::kPrAnswer[] = "pranswer";
const char SessionDescriptionInterface::kAnswer[] = "answer";

* 如果是回环测试(loopback),PeerConnectionInterface的相关接口调用以及顺序没有区别,只是不需要通过PeerConnectionClient由服务器转发消息。

只有当PeerConnectionInterface的 SetLocalDescription() 以及SetRemoteDescription()接口被正确调用后,才可以设置 IceCandidate。

 

处理IceCandidate

 

ICE的全称是Interactive Connectivity Establishment。也是由IETF定义的一套标准协议,即RFC5245。它提供了一套标准的框架方法用于解决两点间的通信,并且优先选择点对点的通信方式;如果无法建立点对点通信也可以通过服务器转发。ICE框架的基本原理很简单,即对每一种可能的连接方式定义优先级,并逐个尝试,尝试连接成功且优先级最高的方式就是最后被选择的通信方式。

ICE使用STUN(Session Traversal Utilities for NAT)协议用于网络地址转换(NAT, Network Address Translation);使用TURN(Traversal Using Relay NAT)协议用于消息转发。

可以把一个IceCandidate当作成一个(IP地址+端口号+优先级)的组合。WebRTC会尝试ping每一个对方发送过来的IceCandidate。从中选择可以ping通的优先级最大的IceCandidate用于交换媒体数据。

在调用PeerConnectionInterface::SetLocalDescription() 和 PeerConnectionInterface::SetRemoteDescription()成功后,WebRTC就开始自动收集本地的IceCandidate。收到到的IceCandidate会异步通知到Conductor::OnIceCandidate()函数,然后直接发送给对方。对方接收到IceCandidate后调用PeerConnectionInterface::AddIceCandidate()接口尝试连接它。

当ICE的连接状态发生改变时会调用Conductor::OnIceConnectionChange(),此例并没有处理状态变化所以在conductor.h头文件里面实现了空方法。ICE的连接状态有如下几种:

  enum IceConnectionState {kIceConnectionNew, // 初始状态kIceConnectionChecking, // 连接中kIceConnectionConnected, // 连接成功kIceConnectionCompleted, // 连接成功kIceConnectionFailed, // 连接失败kIceConnectionDisconnected, // 连接断开,有可能继续尝试连接kIceConnectionClosed, // 连接关闭,最终状态kIceConnectionMax,};

WebRTC将媒体数据抽象为webrtc::MediaStreamInterface对象,可以通过Conductor::OnAddStream()回掉函数获得Stream中包含的VideoTrack来渲染视频数据。

 

小结

 

* 无论是主叫或被叫,想要通信成功都需要获得的重要参数: Local SDP;Remote SDP;Remote IceCandidate;

* 与上述对应的PeerConnectionInterface的接口:SetLocalDescrpition(), SetRemoteDescription(), AddIceCandidate()。

* 主叫和被叫调用上述接口的顺序有一些差别。

* 获取Local SDP 与Local IceCandidate的回掉接口分别为: Conductor::OnSuccess();Conductor::OnIceCandidate()。

* 通过Conductor::OnSuccess()获取SDP后,可以修改默认参数,如视频编码器默认从VP8改为H.264。

* Conductor::OnIceConnectionChange()通知的状态与信令服务器的连接状态(PeerConnectionServer)无关。

* 如果注释掉如下代码,会话就不会包含音频流:

  //stream->AddTrack(audio_track);stream->AddTrack(video_track);

* 可以使用Visual Studio 工具调试确认SDP和IceCandidate的格式。

 

参考文献

 

https://en.wikipedia.org/wiki/Session_Description_Protocol

https://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment

http://blog.csdn.net/chenyefei/article/details/52100438

 


http://chatgpt.dhexx.cn/article/EgOHLhZc.shtml

相关文章

RPA-机器人流程自动化

RPA-机器人流程自动化 RPA-机器人流程自动化简介RPA是什么?RPA历史上的演变RPA原理RPA特点RPA技术框架及功能1.TagUI2.RPA for Python3.Robot Framework4.Automagica5.Taskt6.OpenRPA RPA部署模式1 环境配置的参数调整2 将自动化程序整体打包部署3 版本的管理和控制…

网络安全应急响应----7、数据泄漏应急响应

文章目录 一、数据泄露简介二、数据泄露途径1、外部泄露2、内部泄露 三、数据泄露应急响应方法1、发现数据泄露2、梳理基本情况3、确定排查范围和目标4、判断泄露途径4.1、主动泄露4.2、被动泄露 5、系统排查 四、数据泄露防御1、数据外部泄露防范2、数据内部泄露防范 一、数据…

发送邮件 显示对方服务器未响应,邮件对方服务器未响应

邮件对方服务器未响应 内容精选 换一换 MX优先级,用来指定邮件服务器接收邮件的先后顺序,数值越小优先级越高。当DNS服务器的解析记录中只有一条MX记录时,MX优先级没有意义。当DNS服务器的解析记录中存在多条MX记录时,邮件发送方的DNS服务器会优先把邮件投递到MX优先级高的…

网络安全应急响应----9、WebShell应急响应

文章目录 一、Webshell简介1、常见webshell2、Webshell检测 二、Webshell应急响应流程1、判断是否被植入webshell2、临时处置3、Webshell排查4、系统排查4.1、Windows系统排查4.2、Linux系统排查4.3、Web日志分析4.4、网络流量排查4.5、清除加固 三、Webshell防御方法 一、Webs…

复杂产品的响应式设计【流程篇】

都说2013年将是响应式设计爆发的一年。一淘设计团队在去年一淘首页改版时初步尝试了响应式,最近在一淘“玩客”项目中有了更加深入地应用,第一次在复杂产品中实现了全站响应式。中间积累了一些经验也踩了不少坑,于是就有了这个响应式设计三部…

史上最全测试流程详解----超详细

前言----- 对于测试流程基本很多做过测试的大牛,小哥哥,小姐姐都能说出个十之八九,但是对于细节,可能还需要一些整理文件,这不,我整理了一些测试的全部流程,希望能给大家带来帮助,有…

C语言 操作系统实验 四种调度(最高响应比优先算法 HRN)

注: 本文是四个调度算法的第一篇算法。 本文是根据CSDN上某一FCFS调度算法魔改来的,所以FCFS的算法不会发到网站。 我是个菜鸡,发文是为了纪念自己完成了代码,以及累计自己的经验。 如有知识错误或者算法有逻辑漏洞请各位大佬高…

处理动态图的图神经网络

汤吉良老师团队发表于2020年的SIGIR 《Streaming Graph Neural Networks》论文阅读笔记 背景: 图能够很好的表示实际数据(如社交网络,传输网络)。利用神经网络建模图结构数据,学习特征表示,改善图相关任务…

ImageView加载网络图片

使用第三方的库Glide加载网络图片 首先去下载一个glide的包 下载地址:https://github.com/bumptech/glide/releases/download/v4.7.0/glide-full-4.7.0.jar 我这里用的是glide-full-4.7.0 下载好之后直接复制到app\libs下面,然后点同步,可…

图神经网络的池化操作

图神经网络有两个层面的任务:一个是图层面(graph-level),一个是节点(node-level)层面,图层面任务就是对整个图进行分类或者回归(比如分子分类),节点层面就是对…

网络图的绘制方法详细讲解

网络拓扑图形如网络结构,并且由箭头线条、节点、路线三个因素组成。网络工程师在绘制网络图时,为了展示网络传输方式和途径,通常将网络节点设备和通信介质进行物理布局。网络拓扑图的结构类型有:星型、环型、树型、总线型、网状、分布式结构、等等。 网络图一般用处 在计算…

网络拓扑图怎么画 详细教程

大数据时代,如何更好地去运营、呈现数据,并从其中发掘出更多信息成为了人们探索的方向。网络拓扑图就是一种非常有用的信息化图表,这种网状关系呈现出来的利器可以使我们把想要传递的信息更加清晰、有逻辑的呈现在别人的眼前。 1. 什么是网络…

图神经网络及其应用

Graph Neural Networks and its applications 摘要 以图形形式构建的数据存在于生物化学、图像处理、推荐系统和社会网络分析等多个领域。利用预处理技术在图结构数据上训练机器学习模型有几种方法,但它们缺乏完全适应数据集和手头任务的灵活性。图神经网络允许创…

[概念]神经网络的种类(前馈神经网络,反馈神经网络,图网络)

随着神经网络的不断发展,越来越多的人工神经网络模型也被创造出来了,其中,具有代表性的就是前馈型神经网络模型、反馈型神经网络模型以及图网络. 1.前馈型神经网络模型 前馈神经网络(Feedforward Neural Network ,FNN&#xff09…

java实现下载网络图片到本地

文章目录 前言一、示例二、代码 1.代码示例2.运行结果总结 前言 当我们在网络上看到自己想要保存的照片,有的网站设置了权限,不能保存情况下,我们可以借助Java的文件流读取网络上的图片,并保存到本地。 一、示例 比如豆瓣话题第…

用python实现数字图片识别神经网络--启动网络的自我训练流程,展示网络数字图片识别效果

上一节,我们完成了网络训练代码的实现,还有一些问题需要做进一步的确认。网络的最终目标是,输入一张手写数字图片后,网络输出该图片对应的数字。由于网络需要从0到9一共十个数字中挑选出一个,于是我们的网络最终输出层…

android中的ImageView,ImageView加载网络图片

android中的ImageView&#xff0c;ImageView加载网路图片 在布局文件中加入标签&#x1f3f7;️ <ImageViewandroid:layout_width"300dp"android:layout_height"200dp"android:background"#111111"android:id"id/imageView_pic1"a…

css用网络图片做背景图片,网络编程css为图片设置背景图片

网络编程css为图片设置背景图片 广告 CSS的功能是非常强大的&#xff0c;对于元素的表现以及页面的布局&#xff0c;都提供了非常强大的功能&#xff0c;这主要在于我们灵活的运行&#xff0c;在这方面提供了丰富且富含价值的各种教程与信息。对于图片的使用&#xff0c;其实更…

硬核!一文梳理经典图网络模型

作者 | Chilia 哥伦比亚大学 nlp搜索推荐 整理 | NewBeeNLP 图神经网络已经在NLP、CV、搜索推荐广告等领域广泛应用&#xff0c;今天我们就来整体梳理一些经典常用的图网络模型&#xff1a;DeepWalk、GCN、Graphsage、GAT&#xff01; 1. DeepWalk [2014] DeepWalk是…