细化架构

在 4.1 节中介绍了 WebRTC 一对一通信的整体结构及其过程,下面对其进一步细化,看看它内部又做了什么,如图 4.2 所示。

从图 4.2 中可以看到它与图 4.1 的架构是类似的,只不过将每个端的内部进行了细化。图中通信的双方称为 CallCalled,即一个主叫,一个被叫。实际上,两个终端内部的逻辑是一样的,这里以 Call 端为例,来看一下它内部的结构及其运转机制。

Call 端内部,首先调用音视频设备检测模块检测终端是否有可用的音视频设备,即步骤❶;然后执行第❷步,调用音视频采集模块从设备中采集音视频数据;采集到数据后,执行第❸步开启客户端录制(是否开启录制是可选的,用户可以根据自己的需求选择录制或不录制);当数据采集相关的工作就绪后,执行第❹步,通过信令模块与信令服务器建立连接;紧接着执行第❺步,创建 RTCPeerConnection 对象(RTCPeerConnection 对象是 WebRTC 最核心的对象,后面音视频数据的传输都靠它来完成)。RTCPeerConnection 创建好后,系统要先将它与之前采集的音视频数据绑定到一起,这样 RTCPeerConnection 才知道从哪里获取要发送的数据。以上就是图 4.2 中前五步所完成的工作。

image 2025 02 22 23 51 11 036
Figure 1. 图4.2 WebRTC 1:1架构图细化

接下来再来看一下 RTCPeerConnection 创建 socket 连接的过程。要建立 socket 连接,RTCPeerConnection 首先要执行图 4.2 中的第❻步,向 STUN/TRUN 服务器发送请求。STUN/TURN 服务器收到 Call 的请求后,会将 Call 的外网 IP 地址和端口号作为应答消息返回去;之后终端执行第❼步,通过信令服务器将 Call 的连接地址发送给对端。同理,Called 也会将它的 IP 地址和端口发给 Call。当通信双方都获得对端的地址后,执行第❽步,此时 socket 连接就被建立起来了。至此,RTCPeerConnection 就可以将音视频数据源源不断地发送给对端。以上就是 WebRTC 一对一通信的完整过程。