WebRTC建立会话流程分析

2023-11-05

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebRTC建立会话流程分析 的相关文章

  • coturn STUN 请求在本地工作,但不适用于远程连接

    我已成功向 coturn 服务器发出 TURN 请求 https github com coturn coturn https github com coturn coturn 但在执行 STUN 请求时失败 如果我尝试从运行服务器的同一台
  • 具有预编码 H.264 视频流的 Android WebRTC 客户端

    我有一个发送 H 264 编码视频字节的视频流源 我想使用 Android 的 WebRTC 类构建一个应用程序 将此视频流发送到 WebRTC 对等点 这些内置类似乎只支持原始视频源 而不支持已由编解码器处理的视频 我只需要创建仅包含一种
  • 如何使用webrtc录制视频

    我需要在使用 Nodejs 构建的网站上使用笔记本电脑摄像头录制视频 为此 我使用 webRTC 到目前为止 我可以使用笔记本电脑摄像头拍照 但我需要录制视频 有人可以帮忙解释一下代码将如何进行吗 我当前的代码如下
  • 将 PCM 波形数据转换为 numpy 数组,反之亦然

    情况 我正在使用 WebRTC 中的 VAD 语音活动检测 WebRTC VAD https github com wiseman py webrtcvad Python 适配器 这示例实现 https github com wiseman
  • WebRTC:对多个对等连接使用相同的 SDP?

    是否可以在多个对等连接中使用相同的 SDP 我正在使用 WebRTC 构建视频会议 这个想法是 呼叫者使用某种信令机制 使用其 SDP 每个用户相同的 SDP 向所有其他用户发送广播消息 然后用户将使用其 SDP 进行响应 当用户收到某人的
  • 如何在 Safari 浏览器上获取 WebRTC 日志

    我一直在尝试获取在 safari 浏览器上运行的 Web 应用程序的 webrtc 日志 类似于我们通过转到页面在 Firefox 中获取的日志about webrtc并在 chrome 上使用chrome webrtc internals
  • 从 MediaStream 对象获取媒体详细信息(分辨率和帧速率)

    我正在捕获用户的相机 我想以尽可能最佳的分辨率捕获图片 所以我的代码类似于下面的代码片段 我想从传入流中读取分辨率详细信息 因此我可以将其设置为视频高度和宽度 我将用它来单击快照 我希望快照具有流提供的最佳质量 这可能吗 读取分辨率详细信息
  • 为 webRTC 使用特定端口

    当使用 webRTC 创建点对点音频连接时 如果用户位于路由器后面 我们使用的 STUN 服务器将返回公共 IP 现在在 ICE 对象中 我可以看到 rport 始终介于 50000 及以上 有没有办法使用特定端口 以便用户不必打开所有这些
  • 如何使用 MediaRecorder 作为 MediaSource

    作为学习 WebRTC 的练习 我试图并排显示本地网络摄像头和网络摄像头的延迟播放 为了实现这一目标 我尝试将记录的 blob 传递到 BufferSource 并使用相应的 MediaSource 作为视频元素的源 the ondataa
  • 未捕获的 ReferenceError:进程未定义简单对等 Javascript

    我目前正在学习 WebRTC 并使用 simple peer 和 React 和 Socket io 的 npm 包 当我尝试致电用户时 就会显示此错误 stream readable js 529 Uncaught ReferenceEr
  • SignalR WebRTC WebSocket 已处于 CLOSING 或 CLOSED 状态

    我想测试运行 SignalR 和 WebRTC 的最简单实现 我将代码托管在https github com foyzulkarim WebRtc https github com foyzulkarim WebRtc 我制作了两个不同的文
  • 具有 3 个用户连接的 WebRTC

    我现在正在实施源代码WebRTC 示例 https github com webrtc samples tree gh pages src content peerconnection audio通过使用网状拓扑成为 3 个用户连接 但是
  • WebRTC 局域网内是否需要 STUN 服务器?

    我使用Webrtc开发了一个p2p视频聊天 我知道需要 STUN 或 TURN 服务器来识别 NAT 后面的公共 IP 目前正在使用 Google 的 STUN 服务器 我的应用程序安装在连接到 LAN 的服务器上 但无法访问互联网 我是否
  • WebRTC 与 python

    我想用 python twisted 制作一个流服务器 它接收 WebRTC 视频流 然后对其应用一些 OpenCV 算法 但是我找不到 WebRTC 的 python 模块 如何使用 python twisted 发送和接收 WebRTC
  • 如何在webRTC android中将视频流数据录制为mp4?

    请帮我 我在中使用了这个例子https github com pcab AndroidRTC https github com pchab AndroidRTC将视频和音频从 Android 设备流式传输到其他 Android 设备 在这个
  • React Native - 在 Android 中显示传入视频通话屏幕(VOIP 应用程序)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试实施视频通话React Native 应用程序中的功能 我用过React 原生 twilio 视频 webrtc https
  • 我需要 TURN 服务器吗?

    在什么情况下我应该使用 TURN 服务器 现在我有一个运行完美的 WebRTC 应用程序 该应用程序即将发布 我是否需要设置自己的 TURN 服务器 或者可能仅适用于主要应用程序 WebRTC 可以通过多种方式进行连接 并且当它在第一个选择
  • WebRTC 不适用于 Windows

    每当我尝试为 Windows 构建 WebRTC 时 运行 gclient runhooks 时都会收到此错误 running C path to depot tools python276 bin python exe src build
  • p2p 通信中的对等方如何相互验证?

    WebRTC 中的对等点如何相互验证 WebRTC 中的 DTLS 使用自签名证书 RFC 5763 https www rfc editor org rfc rfc5763具有详细信息 简而言之 证书指纹与 SDP 的 a fingerp
  • 使用 HTML5 或 Javascript 的 P2P 视频会议

    我正在尝试使用 html5 和 javascript 构建视频会议 直到现在我能够流式传输我的相机捕获并将其显示在画布上 这是代码

随机推荐

  • 前端面试题整理—Vue篇

    1 对vue的理解 有什么特点 vue为什么不能兼容IE8及以下浏览器 vue是一套用于构建用户界面的渐进式框架 核心是一个响应的数据绑定系统 vue是一款MVVM框架 基于双向绑定数据 当数据发生变化时候 vue自身会进行一些运算 特点
  • 老猿学5G扫盲贴:移动边缘计算(Mobile Edge Computing, MEC)

    版权声明 本文为CSDN博主 魏晓蕾 的原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net gongxifacai believe article detai
  • win10系统解决HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容。解决方案!!

    全网付费课程欢迎咨询QQ 3388486286 今天IIS发布网站 给我报错HTTP 错误 403 14 Forbidden Web 服务器被配置为不列出此目录的内容 如图 是怎么回事呢 根据我自己找资料 摸索 找出了这个错误得解决方案 本
  • qt ui文件生成对应头文件_UI 文件设计与运行机制

    上一篇通过一个 Hello World 实例 演示了在 Qt Creator 里创建应用程序 设计窗体界面 编译和运行程序的基本过程 这一篇将介绍可视化设计的 UI 界面文件的原理和运行机制 本篇目录 1 项目文件组成 2 项目管理文件 3
  • 方差分析:不同组间的差异真的显著吗

    http www datasoldier net post chayi html 在数据分析中 按照具体维度将数据分组进行组间比较是十分常见的 例如在零售业态中 按照性别 城市 收入水平将消费者进行分组进行对比分析 看似简单 其实这其中经常
  • Android手机定位恶意代码,基于动态特征的Android恶意代码检测和定位方法

    Android Malicious Code Detection and Localization based on Runtime Feature Wang Songhe 1 王淞鹤 1994年 男 硕士 主要研究方向为安卓安全 Guo
  • ChromeDriver淘宝镜像地址

    https npm taobao org mirrors chromedriver
  • java队列中的offer、poll方法

    首先 这个方法所在的包是java util Queue 1 offer boolean offer E e 将指定的元素插入此队列 如果立即可行且不会违反容量限制 当使用有容量限制的队列时 此方法通常要优于 add E 后者可能无法插入元素
  • MySQL收费方式

    导读 网络上多数朋友担心甲骨文会对MySQL软件采用收费模式 多数朋友也不清楚MySQL开源到底是什么模式 开源 免费嘛 是很多的疑问 MySQL是遵守双重协议的 一个是GPL授权协议 一个是商用授权协议 注释 为解决其他企业用MySQL软
  • Python的必学技术——Jupyter Notebook

    推荐 Jupyter NoteBook 的原因 整合所有的资源 交互性编程体验和零成本重现结果 Jupyter NoteBook 能够把软件代码 计算输出 解释文档 多媒体资源整合在一起的多功能科学运算平台 很符合英文里说一图胜千言 A p
  • pytorch-yolov3 train 报错

    UserWarning indexing with dtype torch uint8 is now deprecated please use a dtype torch bool insteadhttps github com erik
  • NB-IoT、Cat.1、5G将迎来新一波发展浪潮

    据工信部5月7日消息 工信部办公厅发布关于深入推进移动物联网全面发展的通知 通知提出主要目标和重要任务 通知全文如下 各省 自治区 直辖市及新疆生产建设兵团工业和信息化主管部门 各省 自治区 直辖市通信管理局 相关企业 移动物联网 基于蜂窝
  • Charles 弱网测试

    知识了解 网络延时 网络延时指一个数据包从用户的计算机发送到网站服务器 然后再立即从网站服务器返回用户计算机的来回时间 通常使用网络管理工具PING Packet Internet Grope 来测量网络延时 由于互联网络的复杂性 网络流量
  • 浏览器输入url后回车后全过程及其优化

    浏览器输入URL后回车后 会发生什么 嗯嗯 很经典的问题 概括性大致流程是这样的 1 查询URL对应的IP地址 DNS域名解析 2 建立TCP连接 连接服务器 3 浏览器发起请求 4 服务器响应浏览器请求 5 浏览器解析响应 渲染页面 6
  • 代码随想录算法训练营第二十四天

    LeetCode 77 组合 链接 77 组合 思路 回溯算法的典型应用 回溯算是理解难度比较大的算法了 经常会有一些循环嵌套在递归里 其本质就是罗列出所有的组合排列 可能性 因为是暴力算法时间复杂度都比较高 有时候需要搭配一定的剪枝操作
  • 数据结构——二叉树的遍历

    树 是一种重要的数据结构 本文浅谈二叉树的遍历问题 采用C语言描述 一 二叉树基础 1 定义 有且仅有一个根结点 除根节点外 每个结点只有一个父结点 最多含有两个子节点 子节点有左右之分 2 存储结构 二叉树的存储结构可以采用顺序存储 也可
  • GitHub Actions + Nginx 部署React App到云服务器

    初始化环境 一台云服务器 我的服务器是基于centos的华为云 个人电脑安装好git node环境 安装Nginx 进入云服务器控制台 远程连接进服务器终端 或者本地终端输入ssh 你的服务器用户名 你的服务器公网ip 如果出现Someon
  • Doxygen文档系统---入门

    Doxygen简介 Doxygen是一种开源跨平台的 以类似JavaDoc风格描述的文档系统 完全支持C C Java Objective C和IDL语言 部分支持PHP C 注释的语法与Qt Doc KDoc和JavaDoc兼容 Doxy
  • 神兵利器

    声明 该公众号大部分文章来自作者日常学习笔记 也有部分文章是经过作者授权和其他公众号白名单转载 未经授权 严禁转载 如需转载 联系开白 请勿利用文章内的相关技术从事非法测试 如因此产生的一切不良后果与文章作者和本公众号无关 现在只对常读和星
  • WebRTC建立会话流程分析

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