一个
RTCPeerConnection
实例运行应用程序与另一个浏览器的RTCPeerConnection
(或者另一个实现了该协议的端点)建立点对点连接。通信是通过在信令通道上交换控制消息(称为信令协议)来协调的,信令通道需要服务器提供(协议中并未特殊规定),例如使用XMLHttpRequest
或Web Sockets。
RTCConfiguration
定义了一组参数,用于配置如何建立或重新建立通过
RTCPeerConnection
建立的对等通信。
RTCIceServer
用于描述ICE代理可以用来建立与对等点连接的 STUN 和 TURN 服务器。
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的方法,我希望你知道这些,并形成自己的判断。
调用 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代理的交互,即addIceCandidate
、setConfiguration
、setLocalDescription
、setRemoteDescription
和close
。
RTCSdpType
该枚举对象描述了 RTCSessionDescriptionInit
或者RTCSessionDescription
实例的类型。
desc
必须被作为 SDP offer 对待。desc
必须被作为SDP answer对待,但不是最终的answer。 用作SDP pranswer的desc
可以应用于对SDP offer 的响应,或对先前发送的SDP pranswer的更新。desc
必须被作为最终的answer 对待。offer-answer 交互必须被认为是完整的。作为SDP answer的desc
被用于响应 SDP offer或者作为更新之前发送的 SDP pranswer。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 官方文档
数据预处理和降维首先来学习下加载数据集、划分数据集、数据预处理以及PCA降维# 加载数据集from sklearn.datasets import load_bostonboston = load_boston()boston_data = boston['data']boston_target = boston['target']boston_names = boston['fe...
一、详解php.iniPHP本身再老版本有一些问题,比如在 php4.3.10和php5.0.3以前有一些比较严重的bug,所以推荐使用新版。另外,目前闹的轰轰烈烈的SQL Injection也是在PHP上有很多利用方式,所以要保证 安全,PHP代码编写是一方面,PHP的配置更是非常关键。 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/...
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款开源爬虫框架,《记得收藏哦!不然看着看着就不见了》????️????目录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
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 Gitlab] (monitoring::grafana line 92) had an error: NoMethodError: undefined method ‘zero?’ for nil:NilClass之前部署过k8s关闭了swap分区导致失败,打开swap分区然后配置下重新执行gitlab-ctl
1.Curator安装Curator是Elasticsearch提供的一个可用来管理索引和快照的命令行工具,它是一个Python程序,可以直接通过pipy库安装:安装pip:pip install elasticsearch-curator用-U更新到最新版本: pip install -U elasticsearch-curator安装特定版本:pip install -U e...
<!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;...
display:flex;justify-content:space-between
题目描述:有n个物体,第i个物体的重量为wi,价值为 vi 。在重量不超过C的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。求最大总价值注意:每个物体可以只拿一部分,因此一定可以让总重量恰好为C题目很容易理解,直接写代码如果打包封装内部类及内部类的方法重写部分看不懂(应加深对面向对象的学习),也可以参考此博客后半部分进行学习/*为方便理解,本题直接用样...
本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。msn: [email protected]来源:http://yfydz.cublog.cn[code="java"]8.10 mirred(mirror and redirection)packet mirroring and redir...
我感觉这样记录,对于我来说挺好的。因为我看两端对齐的语句容易走神,这样记录阅读的话,就很少出现之前的情况。我写的初衷,也是自己来看,所以感觉写的不好的,请保留下意见,谢谢。代码缩进情况,字体重复情况,因为我能看懂,就没改。里面的每一个字我都看过,加粗 括号 下划线 等均是我的笔记。第9章 类面向对象编程 是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,你定义一大类对 象都有...