▶M3U8 SPACE

WebRTC SDP详解:Offer/Answer模型的工作原理

WebRTC SDP详解:Offer/Answer模型的工作原理

WebRTC通话以两个对等节点交换文本块开始,该文本即为WebRTC SDP。本文深入解析了SDP的作用,以及在Offer/Answer模型中每个步骤的详细解析。

WebRTC通话的开始是以两个对等节点交换文本块为标志,该文本块被称为WebRTC SDP。如果SDP错误,那么音频、视频和数据通道的交换将无法进行。

SDP(会话描述协议)用于两个浏览器之间就编解码器、加密密钥、网络地址和媒体流交换达成一致。通常,许多开发人员只会从教程中复制SDP而不会深入研究它。

直到调用失败,显示“设置远程答案SDP失败”的错误信息时,开发者才会面对多达80行的a=属性。

通过理解SDP,大多数这类问题就能得到自我解答。本文提供了一段代码中Offer/Answer交换过程,解析了一个真正的WebRTC SDP的每一行,并且附上了常见错误的表格。

SDP是描述多媒体会话的文本格式,它指明了哪些媒体类型会被传输,每端支持的编解码器,媒体的加密方式和如何在网络中找到每端节点。WebRTC利用SDP作为offer/answer协商机制的载荷,该机制通过RTCPeerConnection API由浏览器生成。

SDP不是一个传输协议,它不传输音频或视频。在任何媒体开始传输之前,它是双方都需要读取的描述信息,更像是一份合同。

SDP格式早于WebRTC十多年。它最初用于SIP电话和流媒体。

最新的规格是2021年1月发布的RFC 8866,它取代了RFC 4566。WebRTC通过JSEP(JavaScript Session Establishment Protocol)为其添加了更多的规则,规定了浏览器能够产生和接受的SDP行。

如果你搜索“什么是SDP”,你会发现这个缩写被用于软件定义的边界、安全产品,甚至工资系统。但在实时视频中,SDP始终指代会话描述协议。

你也会看到.sdp文件与RTSP和FFmpeg一起使用,用于描述一个RTP流。SDP文件是保存到磁盘的相同格式。

SDP是更大的握手过程的一部分,它喂养每一部分。

一个WebRTC连接需要四个步骤完成:

SDP承载着ICE用户名和密码、DTLS指纹和角色以及RTP载荷映射。如果这些值中的任何一个错误,依赖它的步骤就会失败,通常会返回一个不提及SDP错误的错误信息。

这也是为什么你需要一个WebRTC信令服务器。浏览器构建SDP,但没有内置的方法将其交付给远程对等。你可以选择传输方式:WebSocket、HTTP POST,甚至是用于演示的复制和粘贴。

WebRTC的协商是通过RFC 3264定义的Offer/Answer模型进行的。一个节点提议一个会话,另一个节点接受它能接受的部分并拒绝其余部分。

交换过程是不对称的:答复节点只能缩小提议节点提出的范围,而不能添加任何提议。

这里是两个节点Alice(调用方)和Bob之间的交互序列:

在代码中,调用方一侧看起来如下:

而被叫方一侧:

顺序很重要。在调用setRemoteDescription()之前调用createAnswer(),并且只能在存在远程描述之后添加远程候选人。违反任何一条规则都会产生InvalidStateError。

RTCSessionDescription有四个可能的类型值:

这是一个从Chrome截取的简化SDP-offer,包含一个音频轨道和一个视频轨道。实际上,真实的offer可能包含80到150行,但结构是相同的。

SDP有两个层次。会话部分首先出现且适用于所有内容。

每个媒体部分从一个m=行开始,直到下一个m=行。媒体部分内的属性仅适用于该流。