1、媒体协商
在音视频通讯场景中,由于两端之间所支持的音视频编解码、传输协议、传输的速率,都需要进行彼此通知对方。
我们把一个 1 对 1 的音视频通讯,比喻成双方互送快递包裹的过程。
首先这里有很多问题,双方要彼此告知对方后,才能寄送包裹。 比如:
-
我不知道包裹要寄给谁?(我要和谁建立通讯)
-
对方能否使用我的包裹?(我的媒体格式对方是否支持)
-
对方在哪里,地址是什么?(对方所处网络的位置在哪)
-
走那条路线寄送最快?(走哪种网络传输最效率)
实际场景中,我们要打电话互相告诉对方一些信息。而在音视频通讯中,也需要这个“打电话”步骤,形式上一般是通过建立“信令通道”来传送信令。对于 Web 前端来说最常见以 WebSocket 来作为信令通道,通过它来交换信令并进行协商。真正的媒体数据,则是通过 RTCPeerConnection 进行传输。
比如包含什么媒体流/轨,或者是我的编码是否被对方的解码器所支持等等这些问题,则通过 SDP 作为载体告诉给对方。
1.1 什么是媒体协商?
在没有建立 WebRTC 连接传输数据前,首先需要让本地端和远端确认彼此共同支持的媒体能力。如:音视频编解码器、使用的传输协议、IP 端口和传输速率等等。而这些信息需要通过前文所说的 SDP 来互换,这个过程称之为媒体协商。
1.2 媒体协商的流程
这里以在两个前端浏览器建立通讯来进行说明,我们暂且称“发起端”和“应答端”。
-
首先双方连接信令通道,(一般由业务决定如何实现),并能交换信令。
-
发起端调用 RTCPeerConnection.cr**eateOffer** 创建一个offer,并调用 setLocalDescription 设置本地的 SDP。
-
然后通过信令服务器 将含有 SDP 的 offer 设置给应答端。
-
应答端拿到此 offer 以后调用 setRemoteDescription 将此 SDP 信息保存。
-
应答端调用