WebRTC之点对点连接_new rtcpeerconnection()-程序员宅基地

技术标签: 流媒体  WebRTC  点对点连接  

简介


一个 RTCPeerConnection 实例运行应用程序与另一个浏览器的RTCPeerConnection(或者另一个实现了该协议的端点)建立点对点连接。通信是通过在信令通道上交换控制消息(称为信令协议)来协调的,信令通道需要服务器提供(协议中并未特殊规定),例如使用XMLHttpRequest 或Web Sockets。


配置信息


  1. RTCConfiguration

    定义了一组参数,用于配置如何建立或重新建立通过RTCPeerConnection建立的对等通信。

  2. RTCIceServer

    用于描述ICE代理可以用来建立与对等点连接的 STUN 和 TURN 服务器。


状态定义


  1. RTCSignalingState

    信令状态

    • stable:offer/answer交换进程还没有执行,仅仅是初始化状态,local 和 remote 的 desc 都为空。

    • have-local-offer:local 成功应用 type 为 offer 的desc

      const offerOptions = {
               
          offerToReceiveAudio: 1,
          offerToReceiveVideo: 1
      };
      // 创建type为offer的desc
      const offerDesc =  localRTCPeerConnection.createOffer(offerOptions);
      // 本地连接
      localRTCPeerConnection.setLocalDescription(offerDesc);
      
    • have-remote-offer:remote 成功应用 type 为offer 的desc

      // 远程连接
      remoteRTCPeerConnection.setRemoteDescription(offerDesc);
      
    • have-local-pranswer:remote 成功应用 type 为offer的desc(上面程序的最后一行) ,并且 local的 type 为 pranswer 的 desc被成功应用。

      const answerDesc = await remoteRTCPeerConnection.createAnswer();
      remoteRTCPeerConnection.setLocalDescription(answerDesc);
      
    • have-remote-pranswer:local 的 type 为 pranswer 的desc被成功应用(上面程序的最后一行),并且remote 的 pranswer 也被成功应用。

      localRTCPeerConnection.setRemoteDescription(answerDesc);
      
    • closed:RTCPeerConnection 关闭。

      localRTCPeerConnection.close();
      remoteRTCPeerConnection.close();
      

非规范的信令状态转换图

一个简单的转换集可能是:

  • Caller transition:

    new RTCPeerConnection(): stable

    setLocalDescription(offer): have-local-offer

    setRemoteDescription(pranswer): have-remote-pranswer

    setRemoteDescription(answer): stable

  • Callee transition:

    new RTCPeerConnection(): stable

    setRemoteDescription(offer): have-remote-offer

    setLocalDescription(pranswer): have-local-pranswer

    setLocalDescription(answer): stable

    这可能与之前的描述有点不符,可我查阅到的文档确实是这样写的;我想 stable 应该是代表稳定的状态,并且我并没有找到创建 type 为 pranswer的方法,我希望你知道这些,并形成自己的判断。

RTCPeerConnection 接口


调用 new RTCPeerConnection(configuration), 创建一个RTCPeerConnection对象。

configuration.servers 包含用于查找和访问ICE使用的服务器的信息。应用程序可以提供每种类型的多个服务器,任何TRUN服务器也可以用作STUN服务器,用于收集服务器自反候选服务器(这句话我也不太理解…)。

一个RTCPeerConnection对象拥有一个 signaling state,一个connection state,一个ICE gathering state,和一个ICE connection state。当对象被创建时,这些都将初始化。

RTCPeerConnection的ICE协议实现由ICE代理表示。某些RTCPeerConnection方法涉及与ICE代理的交互,即addIceCandidatesetConfigurationsetLocalDescriptionsetRemoteDescriptionclose


Session Description Model


  1. RTCSdpType

    该枚举对象描述了 RTCSessionDescriptionInit或者RTCSessionDescription实例的类型。

    • offer:表明一个desc必须被作为 SDP offer 对待。
    • pranswer:表明一个desc必须被作为SDP answer对待,但不是最终的answer。 用作SDP pranswer的desc可以应用于对SDP offer 的响应,或对先前发送的SDP pranswer的更新。
    • answer:表明一个desc必须被作为最终的answer 对待。offer-answer 交互必须被认为是完整的。作为SDP answer的desc被用于响应 SDP offer或者作为更新之前发送的 SDP pranswer。
  2. RTCSessionDescription 类

    该类被用于RTCPeerConnection暴露local和remote 的 session descriptions; 值得一提的是,该类包含了一个toJSON()方法,这可在信令服务器要求传输该对象时使用。



点对点连接远远不止上面所写的内容,还有许多高级的特性,我没有写到,但灵活运用上面的知识已经能够创建基于WebRTC协议的对等连接了。


推荐博文


https://github.com/webrtc/samples WebRTC demo


参考博文


https://w3c.github.io/webrtc-pc/#peer-to-peer-connections 官方文档

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ai_xao/article/details/92798403

智能推荐

「Head First」编程系列丛书_head first 系列-程序员宅基地

文章浏览阅读9.4k次,点赞24次,收藏20次。深入浅出系列书籍是由O’Reilly出版社发行的一系列教育书籍,它强调以特殊的方式排版,由大量的图片和有趣的内容组合构成,而达到非疲劳的沉浸式学习效果。整理了一部分Head First书籍,有需要的朋友可以自行下载1、O’Reilly:Head First设计模式《O’Reilly:Head First设计模式》趋近完美,因为它在提供专业知识的同时,仍然具有相当高的可读性。本书共有14章,每..._head first 系列

Please check CUDA_ARCH_PTX or CUDA_ARCH_BIN in your build configuration错误解决-程序员宅基地

文章浏览阅读4.1k次。在RTX2060显卡的机器上,编译了opencv4.4,报错如下:classes, confidences, boxes = net.detect(image, confThreshold, nmsThreshold)cv2.error: OpenCV(4.4.0) /home/ycc/opencv-4.4.0/modules/dnn/src/dnn.cpp:2353: error: (-216:No CUDA support) OpenCV was not built to work with th_cuda_arch_ptx

Spring 命名bean的错误_关于bean的命名规则下面说法错误的是 bean name 可以通过-程序员宅基地

文章浏览阅读460次。错误提示:没有定义这个personService bean 可能是这个bean打错了org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'personService' is defined_关于bean的命名规则下面说法错误的是 bean name 可以通过

UART简介-程序员宅基地

文章浏览阅读5.8k次,点赞2次,收藏17次。UART简介1) UART简介UART(Universal Asynchronous Receiver Transmitter),即通用异步(收发双发时钟不同步)收发器,是一种通用的串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信。2) 并行与串行通信总线的本质就是导线,总线的作用是在计算机不同部件间传递一些信息,总线传递的本质就是一些高低电平的信号,比如用高电平信号代表1,低电平信号代表0。所谓并行通信指总线在传递信号的时候把数据_uart

python scapy修改替换Pcap包负载_scapy 恶意流量转化为图像-程序员宅基地

文章浏览阅读657次。在恶意流量种类的选择方面,经过特征选择,最终得到某种恶意流量的特征存在于负载当中,其中包含一些恶意的网站等,接收到这种恶意流量后会被感染,并变成恶意流量发送端。基于此,采用更换负载内容以达到增加恶意流量数据的目的。使用scapy库进行对数据包的解析,以及希望通过更改负载内容从而生成新的恶意流量数据。_scapy 恶意流量转化为图像

SAP 公司间采购之免费订单和退货订单_sap 公司间转储 免费-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏25次。公司间采购订单的退货以及免费项目两种特殊的公司间采购订单业务:公司间采购订单退货:有正常的业务就会有退货业务; 公司间免费的采购订单:譬如A公司的废料可能无偿调拨给集团下另外一家公司。1.公司间采购订单退货在正常的公司间采购订单的配置基础上,只需要增加一个配置:分配退货的发货单类型NCR给相应的采购订单类型和交货工厂(供应商对应的工厂)。配置路径:OLME>Purchase order>Return Order>Store Return/Return Plant to _sap 公司间转储 免费

随便推点

GIS底层开发、GIS前端开发和GIS后端开发有什么区别?_qianduan gis技术-程序员宅基地

文章浏览阅读1.6k次。说白了就是做软件,国内外有各种GIS软件公司,例如美国的ESRI公司的arcgis,国产的超图的supermap和中地数码的mapgis等,都属于gis软件。软件开发又分为应用层和底层,通常会用到c语言或c++,企业会招聘C++工程师来从事这部分工作。需要这类开发人员掌握基本的数据结构和算法以及相关开发经验。_qianduan gis技术

使用git commit时‘“node“‘ 不是内部或外部命令,也不是可运行的程序_git提交报错:'"node"' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 hu-程序员宅基地

文章浏览阅读2.5k次。项目是使用了husky,在使用git comit的时候,会调用pre-commit的node代码,这里找不到对应的node环境变量,所以报错了。,换一个有配置husky的项目,执行git commit 发现一样的结果,这又排除了是项目的配置被人修改导致的问题。,使用git BASH命令行工具来执行git commit,结果还是一样,这说明不是vscode的问题。可以看到版本号,这就说明,node的环境变量配置并没有问题。这比肯德基疯狂星期四还离谱好不!把那个分号去掉,试了一下,就可以了!..._git提交报错:'"node"' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 hu

高性能 TCP/UDP 通信框架 HP-Socket_hpsocket udpcast udpnode-程序员宅基地

文章浏览阅读1.9k次。HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非_hpsocket udpcast udpnode

详解ZStack Cloud v4.0:前端架构探秘之低代码开发-程序员宅基地

文章浏览阅读650次。日前,ZStack Cloud v4.0发布,相信大家看了都有一种焕然一新的感觉,本轮发布最大的变化是 UI 端进行了完全的重写,技术栈由原来的 Vue 体系升级到 React,其中采用了一些全新的技术,如 UMI、GraphQL、微前端、低代码开发等,接下来,我们一起来探秘ZStack Cloud v4.0 漂亮 UI 的技术原理,本文将为您解读:低代码开发。一、为何要引入低代码开发?在新版 UI 中,所有列表页、权限控制、主题外观、界面文字都不是由前端开发人员手动编写的,而是借助低代码开发平台根据响

ITEXT table的单元格边框设置_itext实现表格边框-程序员宅基地

文章浏览阅读1.7w次,点赞10次,收藏18次。通过PdfPCell的方法可以隐藏单元格的边框。//新建单元格对象PdfPCell cell = new PdfPCell(new Phrase("test"));//隐藏上边框// cell.disableBorderSide(1);//隐藏下边框// cell.disableBorderSide(2);//隐藏上、下边框//cell.disableBorderSide(3..._itext实现表格边框

概念数据模型,逻辑数据模型,物理数据模型-程序员宅基地

文章浏览阅读528次。在数据仓库领域有一个概念叫conceptual data model,中文一般翻译为“概念数据模型”。 概念数据模型是最终用户对数据存储的看法,反映了最终用户综合性的信息需求,它以数据类的方式描述企业级的数据需求,数据类代表了在业务环境中自然聚集成的几个主要类别数据。 概念数据模型的内容包括重要的实体及实体之间的关系。在概念数据模型中不包括实体的属性,也不用定义实体的主键。这是概..._逻辑数据模型转为物理数据模型时没有dbm