WebRTC之初体验 | 掘金技术征文

744 阅读4分钟

想必大家都使用过微信视频通话的功能,如果让你在自己的 App 里实现一个视频通话的功能,你会如何去实现?

你可能会觉得很复杂,因为在过去,如果想在 App 里增加一个视频通话的功能,你需要一整个团队才能实现,但是现在,只要使用 WebRTC,一个人就能实现视频通话的功能。

什么是 WebRTC?

WebRTC 的全称是 Web Real-Time Communication,即网页即时通信,提供了可以在浏览器上发送任何类型实时数据的 API,但是我们主要关注 WebRTC 发送音视频数据的功能。下图是 WebRTC 的架构。

WebRTC 在最上层定义了一组由浏览器实现的标准和新 API,目前只在浏览器里有实现,但是不久之后就会在其他设备上实现,例如手机上,这样我们在 Native App 里也可以使用 WebRTC。

在 WebRTC 之前,处理音视频的技术很复杂而且很难,但在有了 WebRTC 之后,音视频处理的技术都被封装了起来,尤其还是有很多第三方的 WebRTC 的技术方案,而且这些方案都是开箱即用,使我们很容易实现 App 里的视频通话功能,现在我们看一下 WebRTC 如何使用。

在浏览器中进行视频通话

使用 WebRTC 最简单的方法就是在浏览器中使用,因为在浏览器中,我们可以不使用任何插件,直接使用 WebRTC 的 API,可以很方便的连接到计算机的摄像头和麦克风,开发视频通话的功能。

这个 API 就是:getUserMedia。这个 API 允许我们访问用户的媒体设备,例如:相机和麦克风,在访问这些媒体设备时,这个 API 还可以用来处理用户权限的申请问题,在手机上,还可以用来控制调用的是前置摄像头,还是后置摄像头,而且还能用于处理不同分辨率的视频,在得到视频和音频的数据后,还可以将这些数据流式传送。

视频通话,肯定是两个人在通话,假如小红和小明要进行视频通话,就像打电话一样,要知道对方的电话号码,电话才能拨通,所以,如果小红要想和小明视频通话,那么小红首先要知道小明的 ip,然后小红和小明之间会建立一条连接,这条连接是点对点的,然后利用这条连接来发送音视频的数据。下来介绍一下如何建立这种点对点的连接。

建立点对点的视频聊天

WebRTC 旨在允许使用对等连接发送音频和视频。

因为这种点对点的连接,不需要使用服务器。例如,当你输入 www.baidu.com 的时候,其实你并不是直接去访问的百度,而是首先通过了 DNS 服务器,将域名解析成 IP,然后再去访问这个 IP 上的服务器,而点对点的通信,也称 P2P,可以不需要中间的服务器,在互联网上的两台机器可以直接连接,因为在 P2P 网络中,每个客户端也都是服务器。

所以当小红要跟小明视频聊天时,小红不会先将音视频数据发给服务器,然后服务器找到小明的地址,然后将音视频数据转发给小明,而是,小红和小明会直接连接,而且小红会直接将饮音视频数据发给小明。

为了建立这种点对点的连接,WebRTC 提供了一个 API: RTCPeerConnection

有了 RTCPeerConnection,还不能够传输音视频数据,因为原始的音视频数据太大,需要对原始的音视频数据进行压缩,用于压缩的工具叫做编解码器。接下来讲解音视频的编解码及传输。

音视频数据的编解码及传输

WebRTC 支持多种编解码器,最常用的如:H264 、MP3 等,但是在确定使用哪种编解码器的时候,一定要确定这个编解码器能够在两端都能编解码出音视频。

所以,首先要把自己支持的编解码器的信息相互发送给对方,这个信息被称为 SDP 协议,全称为 Session Description Protocol。在客户端之间交换此信息称为 signaling(信令),通常使用HTTP或WebSockets等传统协议来完成。

最后,为了在客户端之间实际建立 P2P 连接,RTCPeerConnection 会使用 ICE 协议,全称为 Interactive Connectivity Establishment。在这个过程中,一方的客户端将其所有可用于发送媒体的 ICE,IP 地址和端口发送到另一个客户端。然后,另一个客户端会检查其所有 ICE 以找到与其接收的 ICE 兼容的,一旦找到组合,客户端就可以通过该连接发送音视频数据。其过程如下图:

Agora SDK 使用体验征文大赛 | 掘金技术征文,征文活动正在进行中