SDP
概念
- SDP 是一種描述多媒體通信會話的文本格式(基于 MIME,RFC 4566)。
- 本身 不傳輸數據,僅用于在會話建立階段傳遞信息。
- 常與 SIP(VoIP)、RTSP、WebRTC 等協議配合使用。
用途
- 描述媒體類型(音頻、視頻等);
- 指定編解碼器、媒體格式;
- 提供媒體的傳輸信息(IP 地址、端口、傳輸協議等);
- 協商媒體能力(能力協商);
- 描述時鐘信息(同步);
- 支持多路流(多 track)。
結構
字段 | 含義 | 示例 | 說明 |
---|---|---|---|
v= | 協議版本 | v=0 | 始終為 0,表示 SDP 的版本 |
o= | 會話起始者 | o=john 2890844526 2890842807 IN IP4 192.0.2.1 | 包含用戶名、會話 ID、版本號、網絡類型、地址類型和 IP 地址 |
s= | 會話名稱 | s=Example Session | 必填項,但可為任意字符串 |
i= | 會話信息 | i=A demo of SDP | 可選項,對會話的簡要描述 |
u= | URI | u=http://example.com | 可選項,指向更多信息 |
e= | 電子郵件地址 | e=john@example.com | 可選項 |
p= | 電話號碼 | p=+1 555 555 5555 | 可選項 |
c= | 連接信息 | c=IN IP4 203.0.113.1 | 指定媒體的傳輸地址(可用于全局或每個媒體段) |
b= | 帶寬信息 | b=AS:2000 | 可選,AS 表示應用帶寬,單位 kbps |
t= | 會話活動時間 | t=0 0 | 表示會話起止時間,0 0 表示無限期 |
r= | 重復時間 | r=604800 3600 0 90000 | 可選項,描述周期性會話 |
z= | 時區調整 | z=2882844526 -3600 2898848070 0 | 可選項,調整為夏令時等 |
k= | 加密密鑰 | k=clear:password | 已棄用,不推薦使用 |
a= | 屬性字段 | 多種形式 | 詳見下文“屬性字段詳解” |
m= | 媒體信息 | m=audio 49170 RTP/AVP 0 | 定義媒體類型、端口、傳輸協議和 payload type |
y= | 會話標識符(非標準) | - | 某些系統私有擴展 |
f= | 格式參數(非標準) | - | 某些系統私有擴展 |
WebRTC中的SDP
在 WebRTC 中,SDP(Session Description Protocol) 是用于完成多媒體會話協商的關鍵格式,盡管 WebRTC 本身并不強依賴 SDP 協議(也有 ORTC 替代方案),但當前主流實現如 Chrome、Firefox、Safari 都基于 SDP 的 Offer/Answer 模型進行媒體協商。
基本結構
WebRTC 中 SDP 文本結構遵循 SDP 規范(RFC 4566)+ 一些擴展,主要由兩部分組成:
- Session-level(全局)字段:描述整個會話的元數據;
- Media-level 字段:每個音頻、視頻流的參數(每個 m= 開頭段落)。
常見結構如下:
v=0 # SDP版本
o=- 12345 2 IN IP4 0.0.0.0 # 會話起始者
s=- # 會話名(必須字段)
t=0 0 # 時間
a=group:BUNDLE 0 1 # BUNDLE分組
a=msid-semantic: WMS # Media Stream 語義m=audio 9 UDP/TLS/RTP/SAVPF 111
...m=video 9 UDP/TLS/RTP/SAVPF 96
...
SDP字段
會話級別字段(Session-Level)
字段 | 示例 | 說明 |
---|---|---|
v= | v=0 | 版本號,固定為 0 |
o= | o=- 123456 2 IN IP4 127.0.0.1 | 會話擁有者:用戶名、會話ID、版本、IP等 |
s= | s=- | 會話名,必須存在但可為 - |
t= | t=0 0 | 時間,0 0 表示永遠有效 |
a=group:BUNDLE 0 1 | 表示將 media MID 為 0 和 1 的媒體復用到一個 DTLS/ICE 通道 | |
a=msid-semantic: WMS | 表示支持 MediaStream 概念 | |
a=ice-lite | 某些場景中表示是 ICE Lite 模式的端(如 SFU) |
媒體描述字段(Media-Level)
m= 行:媒體定義
m=audio 9 UDP/TLS/RTP/SAVPF 111
含義:
audio
:媒體類型9
:端口(通常為 9,占位,由 ICE 協商真實端口)UDP/TLS/RTP/SAVPF
:傳輸協議,表示使用 SRTP over DTLS111
:payload type,用于后續a=rtpmap
對應實際編解碼器
ICE 相關字段(NAT 穿透)
字段 | 示例 | 說明 |
---|---|---|
a=ice-ufrag | a=ice-ufrag:F7gI | ICE用戶名 |
a=ice-pwd | a=ice-pwd:x9cml/Yz... | ICE密碼 |
a=candidate: | a=candidate:1 1 udp 2130706431 192.168.1.2 5000 typ host | 描述網絡候選地址(host, srflx, relay) |
a=end-of-candidates | 表示候選地址發送完畢 | |
a=ice-options:trickle | 表示支持 trickle ICE(邊發送邊收集候選) |
DTLS 安全字段(加密通道)
字段 | 示例 | 說明 |
---|---|---|
a=fingerprint: | a=fingerprint:sha-256 AB:CD:... | DTLS 指紋,用于身份驗證 |
a=setup: | a=setup:actpass | 指示 DTLS 握手的角色:active / passive / actpass (默認) |
媒體流屬性
字段 | 示例 | 說明 |
---|---|---|
a=mid:0 | 媒體 ID,與 group:BUNDLE 搭配使用 | |
a=sendrecv | 表示媒體方向,其他有 sendonly , recvonly , inactive | |
a=rtpmap: | a=rtpmap:111 opus/48000/2 | 映射 Payload Type 到 編解碼器名稱 |
a=fmtp: | a=fmtp:111 minptime=10;useinbandfec=1 | 格式參數(如 Opus 的 FEC) |
a=rtcp-mux | 表示 RTP 和 RTCP 使用同一端口 | |
a=rtcp-rsize | 表示使用 Reduced-Size RTCP |
媒體同步與標識
字段 | 示例 | 說明 |
---|---|---|
a=msid:stream1 track1 | MediaStream ID 和 Track ID,用于 Web 應用層標識流 | |
a=ssrc:<ssrc-id> cname:<value> | a=ssrc:1234 cname:abcd | 標識 RTP 流的同步源 SSRC 及同步名字 |
a=ssrc:<id> msid:<stream-id> <track-id> | 指定 track 對應的 ssrc |
rtpmap
功能
描述 RTP 載荷類型(Payload Type)對應的編解碼器信息。
SDP 中的 a=rtpmap
用于將 動態載荷類型(PT)編號 映射到 實際的編解碼器名稱、采樣率、聲道數 等信息。
語法格式
a=rtpmap:<payload-type> <codec-name>/<clock-rate>[/<channels>]
作用總結
- 明確指定每個 PT 對應的編解碼器;
- 告訴接收方如何解析接收到的 RTP 包;
- 提供采樣率和聲道信息(音頻)或 RTP 時鐘頻率(視頻);
示例
a=rtpmap:111 opus/48000/2
說明 PT 111 表示 Opus 編碼,采樣率 48kHz,雙聲道。
fmtp
功能
提供編解碼器的格式化參數(Format Parameters)。
SDP 中的 a=fmtp
是 rtpmap
的擴展,用于定義該編解碼器的具體參數,如打包方式、Profile、Level、糾錯支持等。
語法格式
a=fmtp:<payload-type> <parameter1>=<value1>; <parameter2>=<value2>; ...
作用總結
- 指定編解碼器的高級參數;
- 協商功能特性(如 H264 的
packetization-mode
); - 確保發送端和接收端兼容配置,避免播放異常;
示例(H.264):
a=fmtp:109 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
含義:
- 允許編碼解碼器使用不同的 Level;
- 使用 NALU 分片打包方式;
- 使用 H.264 Baseline profile level 3.1
Payload Type列表
Payload Type | Codec | 示例 rtpmap | 示例 fmtp | 用途 |
---|---|---|---|---|
111 | Opus | a=rtpmap:111 opus/48000/2 | a=fmtp:111 minptime=10; useinbandfec=1 | 音頻,WebRTC 默認 |
103 | ISAC (16kHz) | a=rtpmap:103 ISAC/16000 | — | 音頻 |
104 | ISAC (32kHz) | a=rtpmap:104 ISAC/32000 | — | 音頻 |
9 | G722 | a=rtpmap:9 G722/8000 | — | 音頻(靜態) |
0 | PCMU | a=rtpmap:0 PCMU/8000 | — | 音頻(靜態) |
8 | PCMA | a=rtpmap:8 PCMA/8000 | — | 音頻(靜態) |
96 | VP8 | a=rtpmap:96 VP8/90000 | — | 視頻,兼容性好 |
98 | VP9 | a=rtpmap:98 VP9/90000 | a=fmtp:98 profile-id=0 | 視頻,高壓縮率 |
102 | H264 | a=rtpmap:102 H264/90000 | level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f | 視頻(通常會配多個) |
109 | H264 | a=rtpmap:109 H264/90000 | 同上 | 視頻(動態 PT) |
100 | RTX (VP8) | a=rtpmap:100 rtx/90000 | a=fmtp:100 apt=96 | VP8 重傳流 |
101 | Telephone-event | a=rtpmap:101 telephone-event/8000 | — | DTMF |
示例
v=0
o=private 51472368 2 IN IP4 0.0.0.0
s=PlaySession
t=0 0
a=ice-lite
a=group:BUNDLE 0 1
a=msid-semantic: WMS live/xxx
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=ice-ufrag:02150669
a=ice-pwd:xxx
a=fingerprint:sha-256 3C:BF:C9:FA:D7:BD:14:F5:99:EA:11:0E:4D:80:70:FA:B0:58:FC:95:B2:C3:52:47:87:83:4E:CF:8A:C8:79:1F
a=setup:passive
a=mid:0
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:111 opus/48000/2
a=ssrc:849342908 cname:zzz
a=ssrc:849342908 label:audio-41rt248x
a=candidate:0 1 udp 2130706431 112.118.101.218 16938 typ host generation 0
a=candidate:1 1 udp 2130706431 127.0.0.1 16938 typ host generation 0
a=candidate:2 1 udp 2130706431 112.20.4.5 16938 typ host generation 0
m=video 9 UDP/TLS/RTP/SAVPF 109
c=IN IP4 0.0.0.0
a=ice-ufrag:02150669
a=ice-pwd:xxx
a=fingerprint:sha-256 3C:BF:C9:FA:D7:BD:14:F5:99:EA:11:0E:4D:80:70:FA:B0:58:FC:95:B2:C3:52:47:87:83:4E:CF:8A:C8:79:1F
a=setup:passive
a=mid:1
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:109 H264/90000
a=fmtp:109 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=ssrc:849342909 cname:xxx
a=ssrc:849342909 label:video-6v319bim
a=candidate:0 1 udp 2130706431 112.118.101.218 16938 typ host generation 0
a=candidate:1 1 udp 2130706431 127.0.0.1 16938 typ host generation 0
a=candidate:2 1 udp 2130706431 112.20.4.5 16938 typ host generation 0
會話級字段(全局)
v=0
- SDP 協議版本,始終為 0。
o=private 51472368 2 IN IP4 0.0.0.0
- o=用戶名(private);
- 51472368:會話ID;
- 2:版本號(每次修改遞增);
IN IP4 0.0.0.0
:網絡類型和地址(一般占位符,實際由 ICE 決定)。
s=PlaySession
- 會話名稱,可為任意字符串。
t=0 0
- 表示 SDP 會話有效期為永久(起始時間 = 截止時間 = 0)。
a=ice-lite
- 表示該端是 ICE-lite 模式(常用于服務端,如 SFU,表示只被動響應 ICE 協商,不發起連接)。
a=group:BUNDLE 0 1
- 表示啟用 BUNDLE,將 MID 為 0(音頻)和 1(視頻)的媒體流復用在同一個傳輸通道上(節省端口/資源)。
a=msid-semantic: WMS live/xxx
- 表示使用 MediaStream 語義,流名為
live/xxx
,供 JavaScript 層識別 track 屬于哪個 stream。
音頻媒體段(m=audio)
m=audio 9 UDP/TLS/RTP/SAVPF 111
- 音頻媒體,端口為占位符
9
(真實由 ICE 協商); UDP/TLS/RTP/SAVPF
:表示使用 DTLS 加密的 SRTP;111
是 payload type,后續用rtpmap
指定編碼類型。
c=IN IP4 0.0.0.0
- 網絡地址(無實際含義,占位,真實通過 ICE 協議確定)。
a=ice-ufrag:02150669
a=ice-pwd:xxx
- ICE 協商用戶名片段和密碼,用于 STUN 交互過程。
a=fingerprint:sha-256 3C:BF:...:1F
a=setup:passive
- DTLS 指紋,用于驗證傳輸安全性;
setup:passive
表示此端 不發起 DTLS 握手,對端應 actpass/active。
a=mid:0
- 媒體流的唯一標識(用于 BUNDLE 映射)。
a=sendonly
- 表示此媒體方向是只發送(如服務端推流)。
a=rtcp-mux
a=rtcp-rsize
- 使用 RTP 和 RTCP 端口復用;
- 使用縮減大小的 RTCP(節省帶寬)。
a=rtpmap:111 opus/48000/2
111
編解碼器為 Opus,48kHz 采樣,雙聲道。
a=ssrc:849342908 cname:xxx
a=ssrc:849342908 label:audio-41rt248x
- SSRC(同步源 ID)= 849342908,用于標識此 RTP 流;
cname
:跨媒體同步標識;label
:track label(供 JS 層識別)。
a=candidate:...112.118.101.218...
- 提供 ICE 候選地址:
typ host
表示本地 IP;- generation 0 表示首次協商;
- 提供了多個候選,包括公網、私網地址。
視頻媒體段(m=video)
m=video 9 UDP/TLS/RTP/SAVPF 109
- 視頻媒體流,使用 PT = 109;
- 支持 SRTP over DTLS。
a=rtpmap:109 H264/90000
- PT 109 映射為 H.264 編解碼器,90kHz 時鐘。
a=fmtp:109 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
- 描述 H264 的特性參數:
level-asymmetry-allowed=1
:允許解碼器水平不對稱;packetization-mode=1
:分片模式,必需用于 WebRTC;profile-level-id=42e01f
:表示 Baseline Profile Level 3.1。
a=ssrc:849342909 cname:xxx
a=ssrc:849342909 label:video-6v319bim
- 視頻 RTP 流 SSRC;
label
標識該 track。
a=ice-ufrag:02150669
a=ice-pwd:xxx
a=fingerprint:sha-256 ...
- 和音頻共享相同的 ICE 參數;
- 多路復用(BUNDLE)場景下,音視頻媒體共享 ICE 通道(節省資源)。
a=mid:1
a=sendonly
a=rtcp-mux
mid:1
:媒體 ID;sendonly
:只發送視頻;rtcp-mux
:復用 RTP/RTCP;