这篇文章主要介绍了 WebRTC 的一些主要 API 和内部自带的建立连接的功能及特性。

附上教程(1):WebRTC 教程(1)

WebRTC API

getUserMedia

首先介绍了 getUserMedia,这是一个提供到多媒体流的 API。比如希望存储音视频数据就可以使用 MediaStreamRecorder API。getUserMedia()是一个无论对于开发者还是用户都十分方便的 API:开发者可以仅使用一个函数来获取音视频源数据,而用户也不需要安装其他软件或库。这个 API 只有一个方法,就是 getUserMedia(),从属于 window.navigator.object。

getUserMedia 结构

getUserMedia 方法会提示用户是否有使用一个多媒体的权限,其输入参数是音频或视频的参数,这些参数都是 bool 类型的,你可以根据你的需求选择这些参数,如是否请求一个音视频流。此外还可以添加额外的限定,如分辨率,视频的宽高度等。

错误/异常处理‘’

接着讲者展示了一些 getUserMedia 可能返回的错误及异常处理:

RTCPeerConnection

RTCPeerConnection 代表了两台计算机之间的端到端连接,它提供了连接到一个远程对端的方式,控制和断开连接的方法。这个 API 是 WebRTC 连接的核心部分,负责了整个端到端连接的生命周期。

RTCPeerConnection 结构

在 WebRTC 中可以使用 RTCPeerConnection()构造函数,来获取一个端到端间最新建立的 RTC 连接。这个 API 接收一个 RTCConfiguration 类为输入参数,并定义了这个端到端连接应如何建立,以及其应使用的 ICE 服务器。

RTCPeerConnection 功能

  • 它会跟踪本地和远程连接流;

  • 它会管理 NAT 穿透的 ICE 工作流;

  • 它会根据需求自动触发流的重新协商;

  • 它会在流之间发送自动的心跳包;

  • 它会为其他 API 提供连接请求,接收答复等。

RTCPeerConnection 概览

接着讲者展示了 RTCPeerConnection 的具体模式:

图中可以看到 RTCPeerConnection 掌管了端到端连接的本地和远程流,以及负责控制 ICE Agents,来跟 STUN 和 TURN 服务器工作。

Session Description Protocal(SDP)

要建立端到端连接,就必须知道对方的公网 IP 地址。假设有以下情况:

  • 两端都在同一网络下,可以直接连接;

  • 两端各在一个子网下,且可能还有防火墙,对于 WebRTC 无法直接建立连接;

  • 一端可能下线、忙碌、或者无意与其他用户初始化连接。

WebRTC 自带的 ICE 协议可以解决必需的路由和连接检查,剩下的问题可以由信令服务器解决。为了使用信令服务器,用户首先需要在同一个信令服务器下,并通过信令服务器来交换其他用户的连接信息。信令服务器通过 SDP 服务来获取用户信息。

SDP 是一种单纯的基于文本的协议,传递一种会话文件:连接的各种属性的列表,如媒体类型、网络参数、编解码器、带宽信息等。WebRTC 提供一个 createOffer()方法来为会话产生 SDP 描述,但是 WebRTC 内部实际上不会直接处理 SDP,它的 JavaScript Session Establishment 会处理所有 SDP 过程的内部工作。SDP 请求产生结束后,会通过信令服务器被发送到远程对端。产生的 offer 称之为会话的 "local description",对于接收到的 SDP 答复,称之为会话的 "remote description"。

CSDN站内私信我(关注旁边,就是私信),领取最新最全C++音视频学习提升资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)

SDP 方法

讲者展示了之前提到的四个最主要的处理 SDP 的函数:

其中可以看到创建 SDP 请求和答复的 createOffer()以及 createAnswer(),以及设置本地 SDP 和远程 SDP 的 setLocalDescription()和 setRemoteDescription()。

SDP 流程

讲者展示了一张 SDP 流程图:

图中信令服务器用于转发端到端之间的 SDP 请求以及答复。

Interactive Connectivity Establishment (ICE)

端到端连接

由于多层的防火墙和 NAT 设备,用户之间的端到端连接有可能十分困难。假设两个用户各处在一个独立的子网下,WebRTC 框架就可以解决这种情况下的连接问题。RTCPeerConnection 类包含一个 ICE Agent,ICE Agent 可以获取到本地 IP 和端口,并可以完成两端之间的连接性检查,此外还可以保持连接存活。

ICE 工作模式

在确认了会话描述后,ICE 就会开始自动寻找所有可用 IP 地址和端口。首先他会向操作系统请求其公网 IP 地址,假如这一步失败了,ICE Agent 就会向它的 STUN 或者 TURN 服务器请求其公网 IP。如果一个新的节点(ip+port),ICE 就会自动通过 RTCPeerConnection 对其注册。整个 ICE 流程都是在后台自动完成的。在这个过程完成后,就能够找到端到端间路由路径。

Trickle ICE

Trickle ICE 是对于 ICE 协议的一个扩展,允许在端之间进行增性的寻找以及连接检查。RTC 不需要再等待 ICE 寻找过程结束,就可以通过信令服务器向另一端发送增性升级,这样的话另一端就不需要在连接的过程中等待。这样的话两端就可以在没有 ICE 的情况下交换 SDP 请求。尽管 Trickle ICE 会在信令服务器上产生更多的网络流量,但是可以帮助在端到端连接初始化时减小很多时间。简而言之,就是 WebRTC 先发送 SDP 请求,然后一旦有成员被发现就开始 trckle ICE。

在 WebRTC 连接中,没有任何保证连接建立后就能一直保持此状态,这个连接很有可能周期性的断开,这时 ICE Agent 就会尝试找到最优路径来重新建立这个连接。

WebRTC Leak

WebRTC 提供了非常方便好用的在浏览器的实时视频通信系统,但是仍需要考虑线上隐私问题。

WebRTC Leak 指的是:你的公网 ip 地址被你浏览器的 WebRTC 功能所泄露出去。当你使用虚拟专用网(Virtual Private Network:VPN)时,你的 IP 地址还是安全的,但是当你使用了 WebRTC 后,WebRTC 就能通过 STUN/TURN 服务器获得到你的公网 IP 地址。

如何检查 WebRTC Leak

首先使用你的 VPN 并连接到一个服务器,再检查你的公网 IP 地址是什么。然后在 google 中搜索你的 ip 地址,如果搜索到的结果和你本地显示的一样,说明 WebRTC 把你的公网 IP 地址泄露了。

如何避免 WebRTC Leak

目前的唯一方法就是把浏览器的 WebRTC 功能关闭。如果你使用的是火狐浏览器,你就可以在 url 中输入about:config,并将media.peerconnection.enabled一值设置为 false。如果你使用的是 Chrome 浏览器,则需要安装uBlock Origin Chrome扩展来关闭 WebRTC 功能。

WebRTC 教程二:WebRTC API 和 Leak相关推荐

  1. Quartz教程二:API,Job和Trigger

    原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...

  2. WebRTC 教程四: WebRTC聊天室设计和搭建

    这篇文章主要介绍了 WebRTC 聊天室设计和搭建,主要包括信令服务器及客户端网页设计. WebRTC 教程一:WebRTC信令.架构和 API 入门 WebRTC 教程二:WebRTC API 和 ...

  3. WebRTC 教程三:WebRTC特性,调试方法以及相关服务器搭建方法

    WebRTC 教程一:WebRTC信令.架构和 API 入门 WebRTC 教程二:WebRTC API 和 Leak 本文是 WebRTC 的第三篇教程,主要介绍了 WebRTC 的一些特性,调试方 ...

  4. WebRTC 教程五:WebRTC搭建视频聊天室

    这篇文章主要介绍了 WebRTC 聊天室的整体演示,以及 WebRTC 视频聊天的功能设计,代码逻辑以及整体演示. 目录 WebRTC 聊天室:总体演示 WebRTC 视频聊天: 设计 WebRTC ...

  5. WebRTC 教程六:WebRTC 可扩展性网络拓扑结构

    这篇文章是 WebRTC 教程系列的最后一篇,主要介绍了 WebRTC 可扩展性的一些网络拓扑结构. WebRTC 教程一:WebRTC信令.架构和 API 入门 WebRTC 教程二:WebRTC ...

  6. Android WebRTC 入门教程(二) -- 模拟p2p本地视频传输

    Android WebRTC 入门教程(一) – 使用相机 Android WebRTC 入门教程(二) – 模拟p2p本地视频传输 源码工程: https://github.com/LillteZh ...

  7. LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接。

    LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接 前言: 阅读前,请确保你拥有以下条件: 你已经完成"显示API"的移植. 你已经实现了一 ...

  8. WebRTC的C/C++ API

    WebRTC 的音频引擎封装了音频设备的统一接口, 使用者不用关心代码是 Windows, Mac OS X, Linux , iOS 或者 Android 等平台. 这也是一件非常棒的事情, 这个封 ...

  9. openlayers地图旋转_OpenLayers教程二:实现简单的地图显示

    本文衔接上一篇文章:不睡觉的怪叔叔:OpenLayers教程二:实现简单的地图显示​zhuanlan.zhihu.com 经过上一篇文章对OpenLayers的简单了解以后,现在让我们来实现一个简单的 ...

  10. WebRTC 学习之 WebRTC 简介

    本文使用的WebRTC相关API都是基于Intel® Collaboration Suite for WebRTC的. 相关文档链接:https://software.intel.com/sites/ ...

最新文章

  1. python比前端好学吗_前端学习到底难不难?
  2. 错误C4146的解决方法
  3. vc6.0 简易的tcp网络讲解(二)
  4. 2015人脸检测研究进展
  5. 解决yarn报错:Found incompatible module (yarn config set ignore-engines true)
  6. 平面设计常用的图像文件格式
  7. SAP UI5日期字段的显示逻辑和用法
  8. 140种Python标准库、第三方库和外部工具都有了
  9. Ubuntu 修改 hostname
  10. python自动复制,Python数组自动相互复制
  11. 鸿蒙os系统作用,华为再发新版鸿蒙OS系统!新增超级终端功能:可媲美iOS系统...
  12. AI 技术越来越平民化,程序员不想被淘汰该怎么办?
  13. jdbc executebatch 非事务_jdbc技术
  14. 天书夜读:从汇编语言到Windows内核编程
  15. 定性与定量的单变量正态性检验
  16. kafka 报错 SyntaxError: invalid syntax
  17. Guake Terminal ── linux下完美帅气的终端 (转)
  18. StoryDALL-E复现(基于预训练文本到图像Transformer的故事续编)
  19. python自动点赞微信_基于AirTest+Python的ios自动化测试demo(微信朋友圈无限点赞)
  20. uniapp微信小程序实现按住说话功能

热门文章

  1. Java入门学习笔记
  2. 演讲实录:“分布式数据库海量数据存储和实时查询实现与应用”
  3. 服务器装系统就蓝屏怎么办,安装系统出现蓝屏,怎么办?
  4. 一种新的UI测试方法:视觉感知测试
  5. 好看的皮囊 · 也是大自然的杰作 · 全球高质量 · 美图 · 集中营 · 美女 · 2017-08-20期...
  6. 切身体验苹果Reminders的贴心设计
  7. 查看gup服务器内核信息,国内免费gpu服务器试用
  8. svchost 总是占用网速 一招见效(实测)
  9. 杂谈——科比球鞋(Nike)全记录
  10. 入门级移动App服务器的软硬件需求