WebRTC之点对点连接_荆轲刺秦的博客-程序员秘密

技术标签: 流媒体  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

智能推荐

使用Sklearn模块建立聚类、回归、分类模型并评价_自由小节奏的博客-程序员秘密

数据预处理和降维首先来学习下加载数据集、划分数据集、数据预处理以及PCA降维# 加载数据集from sklearn.datasets import load_bostonboston = load_boston()boston_data = boston['data']boston_target = boston['target']boston_names = boston['fe...

linux:php配置文件php.ini详解_an4455的博客-程序员秘密

一、详解php.iniPHP本身再老版本有一些问题,比如在 php4.3.10和php5.0.3以前有一些比较严重的bug,所以推荐使用新版。另外,目前闹的轰轰烈烈的SQL   Injection也是在PHP上有很多利用方式,所以要保证  安全,PHP代码编写是一方面,PHP的配置更是非常关键。  我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/...

oracle 频繁宕机 ORA-00600: internal error code, arguments: [krccacp_badfile]_changly0602的博客-程序员秘密

oracle出现频繁宕机,日志报如下错误:Fri Apr 18 18:16:04 2014Errors in file /u01/app/oracle/admin/zgnc/bdump/zgnc_ctwr_12511.trc:ORA-00600: internal error code, arguments: [krccacp_badfile], [106067200], [0], [

隔壁老王都找我要的33款开源爬虫框架,《记得收藏哦!不然看着看着就不见了》_heydr 爬虫_苏州程序大白的博客-程序员秘密

隔壁老王都找我要的33款开源爬虫框架,《记得收藏哦!不然看着看着就不见了》????️‍????目录JAVA爬虫????1、 Arachnid????2、crawlzilla????3、Ex-Crawler????4、Heritrix???? 5、heyDr????6、ItSucks????7、jcrawl????8、JSpider????9、Leopdo????10、MetaSeeker????11、Playfish????12、Spiderman????13、webmagic????14、Web-Harv

mysql mybatis配置_一、MyBatis简介与配置MyBatis+Spring+MySql_御风游的博客-程序员秘密

MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习 之 二、SQL语句映射文件(1)resultMap MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存 MyBatis学习 之 三、动态SQL语句 MyBatis学习 之 四、MyBatis配置文件 1.1MyBatisMyBatis学习 之 一、MyBatis简...

Gitlab部署报错There was an error running gitlab-ctl reconfigure: ruby_block[authorize Grafana with Gitla_dhshttgb的博客-程序员秘密

安装gitlab报错:There was an error running gitlab-ctl reconfigure:ruby_block[authorize Grafana with Gitlab] (monitoring::grafana line 92) had an error: NoMethodError: undefined method ‘zero?’ for nil:NilClass之前部署过k8s关闭了swap分区导致失败,打开swap分区然后配置下重新执行gitlab-ctl

随便推点

ES索引管理curator_weixin_30625691的博客-程序员秘密

1.Curator安装Curator是Elasticsearch提供的一个可用来管理索引和快照的命令行工具,它是一个Python程序,可以直接通过pipy库安装:安装pip:pip install elasticsearch-curator用-U更新到最新版本: pip install -U elasticsearch-curator安装特定版本:pip install -U e...

第八篇博客_m0_58821630的博客-程序员秘密

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>跳动的心</title> <style type="text/css"> p{font-size:150px;color: red;position: absolute;left:750px;...

css3 flex布局中元素左右分布_S S Q的博客-程序员秘密

display:flex;justify-content:space-between

贪心算法-- 部分背包问题_乔治的哥们的博客-程序员秘密

题目描述:有n个物体,第i个物体的重量为wi,价值为 vi 。在重量不超过C的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。求最大总价值注意:每个物体可以只拿一部分,因此一定可以让总重量恰好为C题目很容易理解,直接写代码如果打包封装内部类及内部类的方法重写部分看不懂(应加深对面向对象的学习),也可以参考此博客后半部分进行学习/*为方便理解,本题直接用样...

Linux内核中流量控制(24)_cxw06023273的博客-程序员秘密

本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。msn: [email protected]来源:http://yfydz.cublog.cn[code="java"]8.10 mirred(mirror and redirection)packet mirroring and redir...

Python书籍阅读与记录 6.16 II 类_程序猿的探索之路的博客-程序员秘密

我感觉这样记录,对于我来说挺好的。因为我看两端对齐的语句容易走神,这样记录阅读的话,就很少出现之前的情况。我写的初衷,也是自己来看,所以感觉写的不好的,请保留下意见,谢谢。代码缩进情况,字体重复情况,因为我能看懂,就没改。里面的每一个字我都看过,加粗 括号 下划线 等均是我的笔记。第9章 类面向对象编程 是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,你定义一大类对 象都有...

推荐文章

热门文章

相关标签