1. 媒体协商基础:SDP协议概述、SDP结构解析与Offer/Answer模型
各位同学好,我是老张。今天咱们开始聊WebRTC最核心的一块——媒体协商。说实话,我当年刚接触WebRTC时,被SDP那一大段文本搞得一头雾水。后来踩了不少坑,才慢慢摸清楚这里面的门道。今天我就把这些经验掰开了揉碎了讲给你听。
1.1 SDP协议到底是什么?
SDP,全称Session Description Protocol,会话描述协议。它不是传输数据的协议,而是用来描述多媒体会话的。说白了,就是告诉对方:「我要发视频了,编码用H264,分辨率1080p,端口是5004,你准备好了吗?」
我在项目中遇到过不少新人,以为SDP是WebRTC自己发明的。其实不是,SDP是IETF的标准,RFC 4566。WebRTC只是把它拿来用,做了一些扩展。
核心要点:SDP只负责描述,不负责传输。它就像一份「会议议程」,告诉双方会议怎么开,但会议内容本身是另外的协议(如SRTP)来传输的。
1.2 SDP结构解析
SDP的结构其实不复杂。它分两大部分:会话描述(Session-level)和媒体描述(Media-level)。
咱们直接看一个真实的SDP片段,我加上了注释:
v=0 // 版本号,目前必须是0
o=- 123456 2 IN IP4 192.168.1.100 // 会话发起者信息
s=WebRTC Session // 会话名称
t=0 0 // 会话时间,0表示永久
a=group:BUNDLE audio video // 把音频和视频捆绑传输
m=audio 5004 RTP/AVP 111 // 音频媒体,端口5004,使用RTP,payload type 111
a=rtpmap:111 opus/48000/2 // 111对应Opus编码,48kHz采样率,双声道
a=fmtp:111 minptime=10 // 编码参数:最小打包时长10ms
a=sendrecv // 既能发也能收
m=video 5006 RTP/AVP 96 // 视频媒体,端口5006
a=rtpmap:96 H264/90000 // 96对应H264编码,90kHz时钟频率
a=fmtp:96 packetization-mode=1;profile-level-id=42e01f // H264参数
a=rtcp-fb:96 nack // 支持丢包重传
嗯,这里要注意:每一行都以一个单字符开头,后面跟等号。这些字符就是「类型标识」。
会话描述部分
会话描述描述的是整个通话的全局信息。常见的字段有:
| 字段 | 含义 | 示例 |
|---|---|---|
| v= | 协议版本 | v=0 |
| o= | 会话发起者信息 | o=- 123456 2 IN IP4 192.168.1.100 |
| s= | 会话名称 | s=WebRTC Session |
| t= | 会话时间 | t=0 0 |
| a= | 属性行(可扩展) | a=group:BUNDLE audio video |
媒体描述部分
媒体描述以m=开头,后面跟着具体的媒体信息。每个媒体流都有自己的描述块。
我习惯把媒体描述拆成三块来看:
- 媒体行(m=):媒体类型、端口、传输协议、payload type列表
- 编码映射(a=rtpmap):把payload type映射到具体的编码格式
- 编码参数(a=fmtp):编码的详细参数,比如H264的profile-level-id
我的小技巧:调试SDP时,我一般先看m=行,确认对方支持哪些编码。然后看a=rtpmap,把数字翻译成编码名。最后看a=fmtp,检查参数是否匹配。三步走,基本不会漏。
1.3 Offer/Answer模型原理
Offer/Answer模型是WebRTC媒体协商的核心机制。它解决了一个根本问题:两个浏览器之间,怎么商量好用什么样的编码、多大的分辨率、走哪个端口?
流程其实很简单:
- 发起方(Offerer)创建一份SDP,描述自己「想要」的媒体配置
- 通过信令通道(比如WebSocket)把SDP发给对方
- 应答方(Answerer)收到后,根据自己的能力生成一份应答SDP
- 应答方把应答SDP发回给发起方
- 双方各自应用协商结果,开始传输媒体
为什么会这样设计?你想想看,如果两边各说各的,一个要H264,一个要VP8,那不就鸡同鸭讲了?Offer/Answer模型保证了双方最终达成一致。
我曾经踩过的坑:有一次我忘了等远端SDP设置完就调了createAnswer,结果生成的SDP里媒体描述是空的。调试了半天才发现,原来setRemoteDescription是异步的,必须等它完成才能创建应答。记住:先setRemoteDescription,再createAnswer,顺序不能乱。
1.4 知识体系总览
为了让你对本章内容有个整体印象,我画了一张图:
从图上你能看到,这三个模块是环环相扣的。SDP协议提供了描述语言,SDP结构定义了描述格式,Offer/Answer模型则规定了协商流程。缺一个,媒体协商就跑不起来。
1.5 小结
这一章我们聊了SDP是什么、长什么样、怎么用。我个人觉得,理解SDP的关键不在于背字段,而在于理解它解决的是什么问题。说白了,它就是一份「媒体配置清单」,让两个端点能对上话。
下一章我们会深入SDP的细节,看看那些a=行到底能玩出什么花样。到时候我会分享一些我在实际项目中调试SDP的实战经验,保证让你少走弯路。
公众号:蓝海资料掘金营,微信deep3321