一句话定义:SDP(Session Description Protocol,会话描述协议)是一种纯文本格式,用来把“这次通话要用哪些媒体、用什么编码、数据发到哪个地址”写成一份双方都能读懂的清单。
要强调一点:SDP 本身不传输音视频,也不负责建立连接。它就是一张“纸”,通常由信令通道(SIP、WebSocket 等)递给对方。真正搬运画面和声音的是 RTP/RTCP,打通网络路径的是 ICE。SDP 只负责说清楚“我们打算怎么谈”。
打个比方:两个人在嘈杂的会场要交谈,先得对几句暗号——“我说普通话,你听懂吗?我声音小,你靠近点;我在 3 号厅。”SDP 就是这几句暗号。
那这份清单里到底写了什么?几条关键内容:
| SDP 中的行 | 含义 | 例子 |
|---|---|---|
m= | 有几路媒体、走什么传输方式 | 一路音频用 RTP/AVP |
c= | 连接地址 | 收发媒体的 IP |
a=rtpmap | 载荷类型编号与编码器的对应关系 | 111 → Opus 48kHz 双声道 |
a=fmtp | 编码器的具体参数 | H.264 的 profile-level-id |
a=sendrecv 等 | 方向:双向、只发、只收、暂停 | 屏幕共享常是只发 |
a=ice-ufrag/a=candidate | 打洞用的凭据和候选地址 | 用于穿透 NAT |
a=fingerprint | 加密证书指纹 | 供 DTLS 校验 |
为什么叫“要约/应答(offer/answer)”?这借用了合同法的措辞。发起方递出一份“我会的全在这”的完整清单,这叫 offer;应答方从中挑一部分回过去,这叫 answer。规则很硬:answer 必须是 offer 的子集,不能凭空添加对方没提过的编码;两边 m= 行的数量和顺序必须一一对应;某一路不想要,就把它的端口写成 0,表示这路作废。这套规则的价值在于确定性——双方各自算一遍,得出的结果必须完全一致,不会出现“我以为用 A、你以为用 B”。
编解码器不匹配时会发生什么?假设 offer 里只有 Opus 音频和 VP8 视频,而对方只会 H.264 和 AAC,两边没有任何交集。这时 answer 会把对应的 m= 行端口置 0,结果是这通电话可能只剩一路能通,或者干脆建立不起来。用户侧看到的现象是“接通了,但黑屏”“有画面没声音”“单向声音”。还有一种更隐蔽的情况:双方都写 H.264,但 fmtp 里的档次参数不同,协商看起来成功了,解码器却解不出画面——这也是“连上了但没画面”的常见来源。
对从业者的意义:做实时语音助手、实时字幕、数字人这类产品,底层大多跑在 WebRTC 上,联调卡住时第一步就该把两端的 SDP 打出来逐行对,多半问题出在编码列表没有交集、方向写反、或者候选地址不通。对普通职场人:视频会议黑屏、单边没声音,别急着重装软件,很多时候是两端的编码谈不拢,换个客户端或让对方关掉某个“高清模式”就好了。具体支持哪些编码,以各产品和浏览器官方页面为准。
