来源:Engineering Semester 内容整理:李昊勇 本文是 Engineering Semester 的 WebRTC 教程第一部分,主要介绍了 WebRTC 是什么,其和 Websocket 的异同,WebRTC 信令,架构和 API 入门。
目录
WebRTC: Web Real Time Communication 是一系列为提供端到端实时通信连接的协议和 API。Google 于 2011 年发布了基于浏览器的 WebRTC 项目,且这个技术可以使很多不同的应用,如视频会议、文件传输、聊天和桌面共享等都不需要额外的插件。
WebRTC 是完全开源免费的,其使用 RTP 协议来传输音视频,并支持 Chrome、Mozilla、Opera、Microsoft Edge、安卓浏览器等浏览器。
首先 WebRTC 是完全开源免费的,其次是由于对于用户所需要的只是一个支持的浏览器。
简单介绍一下 WebRTC 所提供的 API。
http://mpvideo.qpic.cn/0bc36aac2aaaemafhcr2izrfb4gdfxyaalia.f10002.mp4?dis_k=240788021d664f90e8db9b51a07346f5&dis_t=1649675809&vid=wxv_2322108497561485313&format_id=10002&support_redirect=0&mmversion=false
WebSocket 是一个用于浏览器通信的双向机制。浏览器通信有主要两种传输信道:HTTP 和 WebSockets。
HTTP 主要用于获取网页内容,文字或图片等,是一种客户服务类型协议,其中浏览器是客户端,而网页服务器是服务端。
而对于 WebSocket 而言,浏览器通过一个 WebSocket 连接到网页服务器,与 HTTP 相同也是一个客户服务类型协议。但是 HTTP 是一个单向的信道,而 WebSocket 是双向的,意味着服务器和客户端之间的连接可以一直保持到两者主动断开。
WebSocket 主要用于实时网页应用和聊天应用等,而在这上面 WebRTC 相较于 WebSocket 的优势在于:
WebRTC 其实也使用了 WebSocket,不过是用于搭建 WebRTC的信令机制,但是在连接建立结束后,由于 WebRTC 是端到端连接,因此也不再需要额外服务器。
http://mpvideo.qpic.cn/0bc33yac6aaahqafcsb2izrfbxwdf7paalya.f10002.mp4?dis_k=ef08a55e0bfb298a815ea21c73cc45de&dis_t=1649675809&vid=wxv_2322108747994988545&format_id=10002&support_redirect=0&mmversion=false
如果两个用户希望端到端通信,那两端之间则需要一个额外的服务器来交换初始数据设置 WebRTC 连接,这个服务器就叫做信令服务器。信令过程结束后,所有多媒体数据都会经过 RTCPeerconnection 端到端交换。
用户间想要获取各自的公网 IP 地址,因为 NAT 和防火墙导致两个用户直接通信是很困难的,因此需要通过 ICE(Interactive Connectivity Establishment)框架配合 STUN(Session Traversal Utilities)和 TURN(Traversal Using Relays Around NATs)协议来解决这些问题,实现端到端连接。
WebRTC 可以让用户直接端到端通信,但是却没有办法让其中一个用户找到另一个用户(如 IP 地址等)。因此用户也可以使用 SDP 请求和 SDP 答复,只需要有一个信令服务器就可以了。
在两端希望直接通信之前,他们必须都要有一个连接到一个信令服务器,这样就可以两端分享 SDP 信息。
SDP 请求和答复包括用户有关音频、视频、编码器等信息。一个用户发送一个初始的 SDP 请求来创建多媒体通信会话,对端收到后可以选择创建一个 SDP 答复来接受或拒绝这个 SDP 请求。
http://mpvideo.qpic.cn/0bc3hmaaaaaa7qaiarb2enrfao6daa5qaaaa.f10002.mp4?dis_k=7a62bac9c9980eca70bba70dcc298adf&dis_t=1649675809&vid=wxv_2322116899406708737&format_id=10002&support_redirect=0&mmversion=false
http://mpvideo.qpic.cn/0b2eayaaaaaa5yah4cj2ezrfabwdaadaaaaa.f10002.mp4?dis_k=5dfc2d78fa9e787d40076acba53f9008&dis_t=1649675809&vid=wxv_2322108861039869956&format_id=10002&support_redirect=0&mmversion=false
下图是一个简单的 WebRTC 连接逻辑框图:
在连接阶段,用户使用信令服务器间接通信建立连接,在连接建立结束后,两用户直接通过音视频信道通信。
下图是一个详细版本的 WebRTC 连接框图:
可以看到两个用户希望建立 WebRTC 连接,两端直接建立连接前都可以连接到同一个信令服务器,并通过该服务器交换 SDP 信息。在 SDP 请求和答复交换结束后,两用户都可以获取各自的 IP 地址和音视频配置等信息。之后就需要用 TURN 或者 STUN 服务器来穿透 NAT,达到用户间的直接 WebRTC 连接。
http://mpvideo.qpic.cn/0bc3jaabkaaabyagvor2jrrfasgdcveaafia.f10002.mp4?dis_k=bcc23d90c6661756f9f33bbf6320bbe1&dis_t=1649675809&vid=wxv_2322110438970589186&format_id=10002&support_redirect=0&mmversion=false
WebRTC 不仅局限于浏览器,也可以用于移动应用。在多年前如果想要进行音视频开发一般都会直接选择使用 C/C++ 开发,但是 WebRTC 改变了这个方式并通过 JavaScript API 替换了。移动和嵌入式设备的 SDK 也有,WebRTC 可以在几乎所有地方开发使用。
WebRTC 的绝大部分底层功能使用的还是 C/C++,但是实际上 WebRTC 的开发工程师并不需要接触到最底层的代码逻辑。WebRTC 在大部分的常见浏览器中都可以用,如 Google Chrome、Mozilla Firefox、Safari 等。WebRTC 还可以嵌入在非浏览器应用中。
WebRTC 标准包括很高的级别,由两种不同技术构成:分别是多媒体获取设备,以及端到端连接。
多媒体获取主要包括了视频摄像头以及麦克风,并使用 navigator.mediaDevices.getUserMedia() 来调用,而端到端连接主要有 RTCPeerConnection 类维护。
关于 API 更具体的介绍将会在下个部分展开。
http://mpvideo.qpic.cn/0bc3fyaaaaaa34ah5pj2errfalwdaaxaaaaa.f10002.mp4?dis_k=8d31a4356d6f6e9925d89c201fb714ac&dis_t=1649675809&vid=wxv_2322109014534619137&format_id=10002&support_redirect=0&mmversion=false