前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >WebRTC 前端实时通信技术

WebRTC 前端实时通信技术

原创
作者头像
江天德
修改于 2017-09-21 01:49:28
修改于 2017-09-21 01:49:28
4.7K1
举报
文章被收录于专栏:江天德的专栏江天德的专栏

背景

随着Chrome、微软 Edge 和苹果 Safari 陆续宣布停止支持 Flash,Adobe 公司也正式宣布将在2020年年底停止对 Flash 的支持,这就使得国内大多数使用 Flash Player来支撑音视频等业务的公司面临着巨大的技术变革的考验。然而,在 Web 端技术不断向前发展,HTML5等标准逐渐成熟的大环境下,Web端开发者抛弃 Flash 来构建交互性更复杂的Web应用不再是一件困难的事情,反而会变得更加简单。

业务场景

目前,团队主要专注于直播、点播等视频相关的 P2P 业务上,客户端通过集成 SDK,能够获得更流畅播放体验并显著降低CDN分发成本,适用于互动直播、电视内容直播、赛事直播、在线视频、短视频等业务场景。支持 Android/iOS/OTT/Flash/HTML5 等系统平台,支持 arm/x86/mips 等架构。对于 HTML5 来说,团队要做的是应用WebRTC将已下载的音视频分片数据推送给订阅了该分片的对端用户,意在不影响用户播放体验的同时降低CDN的成本,同时拉开与竞品之间的距离,增大业务在价格方面的优势。

接下来,本文将从实战的角度来介绍如何使用 HTML5标准中 WebRTC相关 API 来实现 P2P 功能。

WebRTC

WebRTC(Web Real-Time Communications)是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC 包含的这些标准使用户在无需安装任何插件或者第三方软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。

纵观WebRTC建立P2P连接的过程主要是以下几步:

(1) 连接双方交换SDP(Session DescriptionProtocol,会话描述协议),用于描述“会话状态”,包含一系列的连接属性:要交换的媒体类型(音频、视频及应用数据)、网络传输协议、使用的编解码器及其设置、带宽及其他元数据;

(2) WebRTC内置了 ICE框架,负责候选项发现、连接检查、持久化等等,这部分工作对开发者是不可见的:开发者需要做的只是在初始化 RTCPeerConnection 对象时指定STUN 和 TURN 服务器

(3) 若连接成功,最后就是 Peer 之间的数据分享过程了。

上述过程基本上就是进行实时通信需要经历的过程,整个过程说起来很简单,但实际上端与端之间通常存在有很多层的防火墙NAT 设备阻隔着,需要经过一系列繁琐的信令交换,网络地址转换、打洞等过程。幸运的是,WebRTC除了信令交换之外,其余的工作都已经帮我们实现好了,开发者可以将绝大多数的精力放在主要的业务逻辑上。

信令通道和会话协商

在建立连接和会话协商之前,我们需要一个信令(或信号)通道来交换信息,不幸的是,WebRTC 并没有为我们实现这部分的工作,而是将发送信号和协议的选择交给应用,无论是通过 HTTP、WebSocket还是其他任意的传递方式,只要能顺利到达对端即可。

在拥有了信令通道之后,就是会话协商的过程了,这个过程中交换的是会话描述协议信息,即 SDP 信息。当用户向对端用户发起 WebRTC 连接时,将创建一个称为提议的会话描述信息,该描述信息包含用户之间“对话”的配置信息,这有点像是在告诉对端用户:我将要去你家坐坐,你是不是得准备点茶点招待我啊?在对端用户收到提议方的会话描述信息后,将会回复一个应答的会话描述信息,告诉发起对话方:茶点准备好了,恭候您的大驾光临!

下述是具体的提议应答交换过程,如有 A 和 B 两个用户:

(1) A 调用 RTCPeerConnection.createOffer() 创建一个提议描述 SDP(A);

(2) A 调用 RTCPeerConnection.setLocalDescription() 设置得到的SDP(A) 信息;

(3) A 通过信令通道将SDP(A) 信息发送给 B;

(4) B 收到 A 的描述信息后调用RTCPeerConnection.setRemoteDescription() 记录对端用户的会话描述信息;

(5) B 调用RTCPeerConnection.createAnswer() 创建一个应答描述 SDP(B);

(6) B 调用RTCPeerConnection.setLocalDescription() 设置得到的 SDP(B) 信息;

(7) B 通过信令通道将SDP(B) 信息发送给 A;

(8) A 收到B 的描述信息后调用RTCPeerConnection.setRemoteDescription() 记录对端用户的会话描述信息;

ICE(Interactive Connectivity Establishment)

得到了对端用户的邀请确认后,双方此时就需要交换一下双方住址了,为了尽可能避免对方走错路错过了茶点最佳的品尝时间,双方都开始收集自己的详细地址信息,详细到走路怎么走,骑单车怎么走,打车又是怎么走,不得已时可能约上一个大家都熟知的地方相见。回到实际编码中来,要顺利的建立端到端的连接,两端之间必须能收发数据包,但通常端与端之间存在有很多层的防火墙和 NAT 设备阻隔着,需要经过一系列繁琐的网络地址转换、打洞等过程,总结来说这是一个寻找连接通道的过程,幸运的是,WebRTC 已经代替我们完成了这部分的工作。当需要连接的两端设置好本地和远端的会话描述后,本地 ICE 代理就会自动开始发现本地端所有可能的候选 IP 和端口的过程:

(1) 查询本地内网的 ip 地址;

(2) ICE 代理向 STUN 服务器查询,本地的外网 ip 和端口号;

(3) 如果端到端连接失败,数据将通过 TURN 服务器转发数据。

ICE 代理每发现一个新候选项就会自动回调 onicecandidate事件通知应用。此时,通过信令通道将该候选项 candidate 发送给对端 Peer,对端收到该候选项后则通过调用 RTCPeerConnection.addIceCandidate(candidate) 来增加端与端之间连接的通道方式,反之亦然。值得称赞的是,连接成功建立之后并不代表 ICE 代理的工作已经结束了,实际上此时 ICE 代理会继续收集本地候选项,意在找到一个更稳定的连接路径,这个过程对我们是不可见的。下图 ICE 代理的工作流程:

应用数据通道(DataChannel)

实际上 WebRTC 并不单单仅限于 Peer 之间分享音视频流,也支持任意应用数据交换(String,ArrayBuffer,Blob,File,Image等),而这仅仅只需要以下几步即可:

(1) 实例化一个 RTCPeerConnection 对象;

(2) 调用 RTCPeerConnection.createDataChannel(),实际上这一步只需在发起对话方创建即可;

(3) 接下来就是一系列的提议、应答和候选项通过信令通道交换的过程;

(4) 最终建立连接成功后,对端 Peer 会收到触发ondatachannel 的事件回调,其中事件中的 Event.channel 就是 Peer 间的数据通道,此时对话两端就可以通过这个“通道”来分享数据了。

初见 DataChannel 与 WebSocket 基本上是类似的,都支持 onopen、onmessage、onclose、onerror 事件回调,但两者之间仍然有一些区别,WebSocket 是在 TCP 的基础上构建的可靠有序的消息交付,而 DataChannel 是基于 UDP 的,当然也可以通过配置来指定是否有序和可靠性,提供了更多的灵活性配置,可自行搜索相关文章来了解。

现有 WebRTC 库

前文花了较多的篇幅来介绍 WebRTC 在建立端对端连接的相关过程,虽然没有贴出相关的代码,但相信大家在有了建连过程的基础后再自行搜索相关代码来看,会有事半功倍的效果!实际上,市面上已经有多家公司或组织已经封装了各自的 WebRTC 库,目前了解到的有:streamroot、webtorrent、peerjs、peer5等。

本文出现的初衷也正是为了了解这些库在实现 P2P 功能上有无独到之处,通过前文的描述我们知道,P2P 的核心要求就在于穿透 NAT 设备,只有穿越了它才能真正建立起端对端的连接,目前 NAT 设备有两种类型:对称型和锥型,而 P2P 需要的是锥型 NAT。从这些库对穿透这块的代码上来看并没有什么与众不同之处,更多的是在 STUN 无法穿透时配置了 TURN 来中转数据。但是十分幸运的是,根据 Google 提供的穿透数据来看:

  • 92%的时间可以直接连接(STUN)
  • 8%的时间要使用中继器(TURN)

在调研过程过程,也发现了一些比较有趣的网站,是基于 WebRTC 实现的在线视频通话和在线文字聊天 demo,有兴趣的可以在浏览器中打开一下的网站:

总结

在写这篇文章前花了一个星期来学习相关的知识包括: WebRTC API、NAT、信令服务、STUN 服务器、TURN 服务器等,但由于这部分的技术不是临时抱佛脚就能了解透彻的,是一个持续学习深入了解的过程。有点遗憾的是没在本文中介绍 NAT 的相关知识,实际上这部分内容可以单独拎出来讲解,等有空了再写一篇关于 NAT 的文章吧。

随着 Web 前端标准越来越成熟,浏览器能做到的东西越来越多,也许会逐渐替代客户端,这不得不说这很符合互联网的特点,相信有一天会出现一个标准,我们不再需要手机,不再需要安装软件,不再需要各种类型账号,实际上我们自身就是一个特定的 ID,将来所有的交互都是基于这个 ID 来提供不同的个性服务,无论我们走到哪都能得到所需的服务。想想都是满满的期待啊!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
demo源码可以分享吗
demo源码可以分享吗
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
WebRTC直播技术(二)-ICE/STUN/TURN
首先要掌握WebRTC连接建立过程,需要掌握几个知识点: NAT, ICE, STUN, TURN, DTLS等。如果之前有接触过P2P相关技术的同学可能就会比较容易理解。WebRTC是一个基于浏览器与浏览器之间的实时音视频通话方案,那么有于公网ip地址有限的问题,用户的浏览器常常位于NAT后,那么建立连接就涉及到了打洞技术。
IMWeb前端团队
2019/12/03
2.3K0
WebRTC直播技术(二)-ICE/STUN/TURN
一文带你了解webrtc基本原理(动手实现1v1视频通话)
webrtc (Web Real-Time Communications) 是一个实时通讯技术,也是实时音视频技术的标准和框架。 大白话讲,webrtc是一个集大成的实时音视频技术集,包含了各种客户端api、音视频编/解码lib、流媒体传输协议、回声消除、安全传输等。 对于开发者来说可以借助webrtc非常方便的实现低延时视频通话能力。 现在主流的直播系统、会议系统基本都是基于webrtc来实现。
王清培
2022/09/20
5.5K0
一文带你了解webrtc基本原理(动手实现1v1视频通话)
【WebRTC】WebRTC学习总结
WebRTC 是一项「实时通讯技术」,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。本篇文章从自身实践出发,结合相关代码,总结WebRTC实现的基本流程。
pingan8787
2020/05/14
3.8K0
【WebRTC】WebRTC学习总结
WebRTC直播技术(一)-初探WebRTC
本文介绍了WebRTC直播技术,包括相关概念、API、信令流程以及SDP握手等内容。通过这些介绍,读者可以了解WebRTC直播的原理和实现方式。
IMWeb前端团队
2017/12/29
4K0
WebRTC直播技术(一)-初探WebRTC
Web前端WebRTC攻略(一) 基础介绍
随着互联网高速发展,以及即将到来的5G时代,WebRTC作为前端互动直播和实时音视频的利器,也是将前端开发者们不可错过的学习领域。如果你现在只是听过而已,那你可能要好好学习一番。 01  什么是WebRTC? WebRTC 全称是(Web browsers with Real-Time Communications (RTC) 大概2011年,谷歌收购了 GIPS,它是一个为 RTC 开发出许多组件的公司,例如编解码和回声消除技术。Google 开源了 GIPS 开发的技术,并希望将其打造为行业标准。 收
用户1097444
2022/06/29
2.5K0
Web前端WebRTC攻略(一) 基础介绍
抛弃websocket,前端直接打通信道,webRTC搭建音视频聊天
什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转。比如现在有两个客户端,甲和乙,他们俩想要通信,首先需要甲和服务器、乙和服务器之间建立信道。甲给乙发送消息时,甲先将消息发送到服务器上,服务器对甲的消息进行中转,发送到乙处,反过来也是一样。这样甲与乙之间的一次消息要通过两段信道,通信的效率同时受制于这两段信道的带宽。同时这样的信道并不适合数据流的传输,如何建立浏览器之间的点对点传输,一直困扰着开发者。WebRTC应运而生 WebRTC是一个开源项目,旨在
李海彬
2018/03/27
7.5K0
抛弃websocket,前端直接打通信道,webRTC搭建音视频聊天
WebRTC实现p2p视频通话
简介 目的 帮助自己了解webrtc 实现端对端通信 # 使用流程 git clone https://gitee.com/wjj0720/webrtc.git cd ./webRTC npm i npm run dev # 访问 127.0.0.1:3003/test-1.html 演示h5媒体流捕获 # 访问 127.0.0.1:3003/local.html 演示rtc 本地传输 # 访问 127.0.0.1:3003/p2p.html 演示局域网端对端视屏
random_wang
2019/10/22
6.7K0
WebRTC实现p2p视频通话
WebRTC中的信令和内网穿透技术 STUN / TURN
Translated from WebRTC in the real world: STUN, TURN and signaling. 最近刚接触到WebRTC,网上看到这篇介绍WebRTC的文章不错,仔细读了读还算有用,分享出来能帮到一些刚入门的人也挺好的,翻译不好的地方可以直接看原文。
全栈程序员站长
2022/09/13
5.9K0
WebRTC中的信令和内网穿透技术 STUN / TURN
WebRTC 速成课程
WebRTC (Web Real-Time Communication)是一个免费、开源的项目,通过简单的应用程序编程接口(API)为 Web 浏览器和移动应用程序提供实时通信(RTC)。这也表明了 WebRTC 设计的目标就是“设计一种通过尽量短的、延迟尽量低的路径进行 P2P 通信的协议,提供一种简单的、能让所有人使用的 API”。一旦你把它放入浏览器,它就是标准;一旦它成为了标准,开发时会遇到的“摩擦”就会消失。
用户1324186
2022/02/18
1.4K0
WebRTC 速成课程
零基础入门:基于开源WebRTC,从0到1实现实时音视频聊天功能
本文由微医云技术团队前端工程师张宇航分享,原题“从0到1打造一个 WebRTC 应用”,有修订和改动。
JackJiang
2021/08/24
3.7K0
WebRTC介绍及简单应用
WebRTC介绍及简单应用 WebRTC,即Web Real-Time Communication,web实时通信技术。简单地说就是在web浏览器里面引入实时通信,包括音视频通话等。 WebRTC
用户1141560
2017/12/25
6.1K0
【项目实战】基于 WebRTC 的音视频在线监考模块的设计与实现(上)
最近在做关于考试系统的项目,其中有一项需求分析是要做在线监考模块,因为之前没有做过这方面的东西,还是比较迷茫的,在查阅了大量的资料之后,再结合系统是以 H5 的形式展示的,最后选用了 WebRTC 框架为主体来实现这一模块,本文会介绍其基本理论;  
sidiot
2023/08/31
4670
【项目实战】基于 WebRTC 的音视频在线监考模块的设计与实现(上)
实时音视频入门学习:开源工程WebRTC的技术原理和使用浅析
本文由ELab技术团队分享,原题“浅谈WebRTC技术原理与应用”,有修订和改动。
JackJiang
2022/01/10
1.8K0
实时音视频入门学习:开源工程WebRTC的技术原理和使用浅析
JavaScript 是如何工作的:WebRTC 和对等网络的机制!
WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API。
前端小智@大迁世界
2019/03/15
2.4K0
JavaScript 是如何工作的:WebRTC 和对等网络的机制!
iOS下WebRTC音视频通话(一)WebRTC介绍WebRTC 过程
在iOS下做IM功能时,难免都会涉及到音频通话和视频通话。QQ中的QQ电话和视频通话效果就非常好,但是如果你没有非常深厚的技术,也没有那么大的团队,很难做到QQ那么快速和稳定的通话效果。 但是利用WebRTC技术,即使一个人也能够实现效果不错的音视频通话。本篇介绍WebRTC的基础概念。
Haley_Wong
2018/08/22
3.8K0
【OpenIM原创】简单轻松入门 一文讲解WebRTC实现1对1音视频通信原理
WebRTC(Web Real-Time Communication)是 Google于2010以6829万美元从 Global IP Solutions 公司购买,并于2011年将其开源,旨在建立一个互联网浏览器间的实时通信的平台,让 WebRTC技术成为 H5标准之一。我们看官网(https://webrtc.org)的介绍
OpenIM
2021/08/12
1.7K0
利用peerjs轻松玩转webrtc
 随着5G技术的推广,可以预见在不久的将来网速将得到极大提升,实时音视频互动这类对网络传输质量要求较高的应用将是最直接的受益者。而且伴随着webrtc技术的成熟,该领域可能将成为下一个技术热点,但是传统的webrtc应用开发存在一定的复杂性,本文将介绍如何利用peerjs这一开源框架来简化webrtc开发。
菩提树下的杨过
2019/09/12
2.6K1
Web前端WebRTC 攻略(五) NAT 穿越与 ICE
WebRTC 进行端对端进行实时音视频通讯时,常常一方或者双方都是隐藏在 NAT 之后的内网地址。ICE 则用于寻找一条传输数据通道连接。本文介绍了 NAT 穿越和 ICE 框架的基础知识和主要步骤。 我们知道使用 WebRTC 进行端对端进行实时音视频通讯时,WebRTC 本身是基于点对点(Peer-to-Peer)连接的,最便捷的方式就是通话的双方通过 IP 直连,摆脱原始的直播服务器中转的方式。 如果连接双方都是公网地址,则可以直接访问到对方,从而建立连接。但是在现实的应用场景中,大部分情况下其中一方
用户1097444
2022/06/29
2.6K0
Web前端WebRTC 攻略(五) NAT 穿越与 ICE
详解WebRTC——网页实时通信技术
运用RTCPeerConnection和RTCDataChannel两个核心API,能够实现任意数据的点对点交换,官网Demo如下:
Kevinylzhao
2018/06/22
3.6K0
详解WebRTC——网页实时通信技术
通过WebRTC进行实时通信-通过RTCPeerConnection传输视频
RTCPeerConnection 是调用WebRTC传输音视频和交换数据的API。这个例子是在同一个页面中两个RTCPeerConnection对象之间建立连接。没有什么实际价值,但却能很好的证明RTCPeerConnection是如何工作的。
音视频_李超
2020/04/02
5.6K0
推荐阅读
相关推荐
WebRTC直播技术(二)-ICE/STUN/TURN
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文