目錄
- 一、介紹
- 二、標準 SDP 規范
- 1. SDP 的格式
- 2. SDP 的結構
- (1)會話描述
- (2)媒體描述
- 三、WebRTC 中的 SDP
一、介紹
SDP(Session Description Protocal)以文本描述各端(PC 端、Mac 端、Android 端、iOS 端等)的能力,
這里的能力指的是各端所支持的:
- 音頻編解碼器是什么,這些編解碼器設定的參數是什么
- 使用的傳輸協議是什么
- 以及包括的音視頻媒體是什么等等。
例子:
v=0
o=‐ 3409821183230872764 2 IN IP4 127.0.0.1
...
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
...
a=rtpmap:111 opus/48000/2
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
...
如上面的 SDP 片段所示,該 SDP 中描述了一路音頻流,即m=audio,該音頻支持的 Payload ( 即數據負載 )
類型包括 111、103、104 等等。
在該 SDP 片段中又進一步對 111、103、104 等 Payload 類型做了更詳細的描述,如 a=rtpmap:111
opus/48000/2 表示 Payload 類型為 111 的數據是 OPUS 編碼的音頻數據,并且它的采樣率是 48000,使用雙
聲道。以此類推,你也就可以知道 a=rtpmap:104 ISAC/32000 的含義是音頻數據使用 ISAC 編碼,采樣頻率
是 32000,使用單聲道。
1 對 1 WebRTC 處理過程圖:
如上圖所示,兩個客戶端 / 瀏覽器進行 1 對 1 通話時,首先要進行信令交互,而交互的一個重要信息就是
SDP 的交換。
交換 SDP 的目的是為了讓對方知道彼此具有哪些能力,然后根據雙方各自的能力進行協商,協商出大家認可
的音視頻編解碼器、編解碼器相關的參數(如音頻通道數,采樣率等)、傳輸協議等信息。
如上圖所示,阿花 與 阿強進行通訊,它們先各自在 SDP 中記錄自己支持的音頻參數、視頻參數、傳輸協議等
信息,然后再將自己的 SDP 信息通過信令服務器發送給對方。當一方收到對端傳來的 SDP 信息后,它會將接
收到的 SDP 與自己的 SDP 進行比較,并取出它們之間的交集,這個交集就是它們協商的結果,也就是它們最
終使用的音視頻參數及傳輸協議了。
二、標準 SDP 規范
標準 SDP 規范主要包括SDP 描述格式和SDP 結構,而 SDP 結構由會話描述和媒體信息描述兩個部分組成。
其中,媒體信息描述是整個 SDP 規范中最重要的知識,它又包括了:
媒體類型
媒體格式
傳輸協議
傳輸的 IP 和端口
1. SDP 的格式
SDP 是由多個 type=value 這樣的表達式組成的。其中,type是一個字符,value是一個字符串。需
要特別注意的是,“=” 兩邊是不能有空格的。如下所示:
v=0
o=‐ 7017624586836067756 2 IN IP4 127.0.0.1
s=‐
t=0 0
...
v=0
SDP 由一個會話級描述(session level description)和多個媒體級描述(media level description)組成。
會話級(session level)的作用域是整個會話,其位置是從 v= 行開始到第一個媒體描述為止。
媒體級(media level)是對單個的媒體流進行描述,其位置是從 m= 行開始到下一個媒體描述(即下一個
m=)為止。
另外,除非媒體部分重新對會話級的值做定義,否則會話級的值就是各個媒體的缺省默認值。
例子:
v=0
o=‐ 7017624586836067756 2 IN IP4 127.0.0.1
s=‐
t=0 0
// 下面 m= 開頭的兩行,是兩個媒體流:一個音頻,一個視頻。
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
...
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123
119 114 115 116
...
每一行都是以一個字符開頭,后面緊跟著等于號(=),等于號后面是一串字
符。
從“v=”開始一直到“m=audio”,這之間的描述是會話級的;而后面的兩個“m=”為媒體級。從中可以看出,在該
SDP 描述中有兩個媒體流,一個是音頻流,另一個是視頻流。
2. SDP 的結構
了解了 SDP 的格式,下面我們來看一下 SDP 的結構,它由會話描述和媒體描述兩部分組成。
(1)會話描述
會話描述的字段比較多,下面四個字段比較重要,我們來重點介紹一下。
第一個,v=(protocol version,必選)。例子:v=0 ,表示 SDP 的版本號,但不包括次版本號。第二個,o=(owner/creator and session identifier,必選)。例子:o=<username> <session id>
<version> <network type> <address type> <address>,該例子是對一個會話發起者的描述。其中,
o= 表示的是對會話發起者的描述;
<username>:用戶名,當不關心用戶名時,可以用 “-” 代替 ;
<session id> :數字串,在整個會話中,必須是唯一的,建議使用 NTP 時間戳;
<version>:版本號,每次會話數據修改后,該版本值會遞增;
<network type> :網絡類型,一般為“IN”,表示“internet”;
<address type>:地址類型,一般為 IP4;
<address>:IP 地址。第三個,Session Name(必選)。例子:s=<session name>,該例子表示一個會話,在整個 SDP 中有且只
有一個會話,也就是只有一個 s=。第四個,t=(time the session is active,必選)。例子:t=<start time> <stop time>,該例子描述了會話
的開始時間和結束時間。其中, <start time> 和 <stop time> 為 NTP 時間,單位是秒;當<start time>和
<stop time>均為零時,表示持久會話。```
(2)媒體描述
媒體描述的字段也不少,下面我們也重點介紹四個。
第一個,m=(media name and transport address,可選)。例子:m=<media> <port> <transport> <fmt
list>,表示一個會話。在一個 SDP 中一般會有多個媒體描述。每個媒體描述以“m=”開始到下一個“m=”結束。
其中:
<media>:媒體類型,比如 audio/video 等;
<port>:端口;
<transport>:傳輸協議,有兩種——RTP/AVP 和 UDP;
<fmt list>:媒體格式,即數據負載類型 (Payload Type) 列表。第二個,a=*(zero or more media attribute lines,可選)。例子:a=<TYPE>或 a=<TYPE>:<VALUES>, 表示
屬性,用于進一步描述媒體信息;在例子中, 指屬性的類型, a= 有兩個特別的屬性類型,即下面要介紹的
rtpmap 和 fmtp。第三個,rtpmap(可選)。例子:a=rtpmap:<payload type> <encoding name>/<clock rate>
[/<encodingparameters>]。
rtpmap 是 rtp 與 map 的結合,即 RTP 參數映射表。
<payload type> :負載類型,對應 RTP 包中的音視頻數據負載類型。
<encoding name>:編碼器名稱,如 VP8、VP9、OPUS 等。
<sample rate>:采樣率,如音頻的采樣率頻率 32000、48000 等。
<encodingparameters>:編碼參數,如音頻是否是雙聲道,默認為單聲道。第四個,fmtp。例子:a=fmtp:<payload type> <format specific parameters>。
fmtp,格式參數,即 format parameters;
<payload type> ,負載類型,同樣對應 RTP 包中的音視頻數據負載類型;
< format specific parameters>指具體參數。
具體的例子:
v=0
o=‐ 4007659306182774937 2 IN IP4 127.0.0.1
s=‐
t=0 0
// 以上表示會話描述
...
// 下面的媒體描述,在媒體描述部分包括音頻和視頻兩路媒體
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
...
a=rtpmap:111 opus/48000/2 // 對 RTP 數據的描述
a=fmtp:111 minptime=10;useinbandfec=1 // 對格式參數的描述
...
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
...
// 上面是音頻媒體描述,下面是視頻媒體描述
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123
119 114 115 116
...
a=rtpmap:96 VP8/90000
可以清楚地看到在這段 SDP 片段里包括會話信息與媒體信息。在媒體信息中又包括了音
頻流信息和視頻流信息。
在音頻流和視頻流信息中,通過 rtpmap 屬性對它們做了進一步的說明。如音頻流支持 OPUS 和 ISAC 編碼,
OPUS 編碼的采樣率是 48000,雙聲道,而 ISAC 編碼的采樣率可以是 16000 或 32000, 它們都是單聲道。
視頻流支持 VP8,采樣率是 90000(實質是指時鐘信息) 。
三、WebRTC 中的 SDP
WebRTC 對標準 SDP 規范做了一些調整,更詳細的信息可以看這里,它將 SDP 按功能分成幾大塊:
Session Metadata,會話元數據
Network Description,網絡描述
Stream Description,流描述
Security Descriptions,安全描述
Qos Grouping Descriptions, 服務質量描述
下面這張圖清晰地表達了它們之間的關系:
通過上圖我們可以看出,WebRTC 按功能將 SDP 劃分成了五部分,即會話元數據、網絡描述、流描述、安全
描述以及服務質量描述。WebRTC SDP 中的會話元數據(Session Metadata)其實就是 SDP 標準規范中的
會話層描述;流描述、網絡描述與 SDP 標準規范中的媒體層描述是一致的;而安全描述與服務質量描述都是
新增的一些屬性描述。
下圖我們來看一個具體的例子:
...
//======= 安全描述 ============
a=ice‐ufrag:1uEe // 進入連通性檢測的用戶名
a=ice‐pwd:RQe+y7SOLQJET+duNJ+Qbk7z// 密碼,這兩個是用于連通性檢測的憑證
a=fingerprint:sha‐256
35:6F:40:3D:F6:9B:BA:5B:F6:2A:7F:65:59:60:6D:6B:F9:C7:AE:46:44:B4:E4:73:F8:60:67:4D:58:E2:EB:
9C //DTLS 指紋認證,以識別是否是合法用戶
...
//======== 服務質量描述 =========
a=rtcp‐mux
a=rtcp‐rsiz
a=rtpmap:96 VP8/90000
a=rtcp‐fb:96 goog‐remb // 使用 google 的帶寬評估算法
a=rtcp‐fb:96 transport‐cc // 啟動防擁塞
a=rtcp‐fb:96 ccm fir // 解碼出錯,請求關鍵幀
a=rtcp‐fb:96 nack // 啟用丟包重傳功能
a=rtcp‐fb:96 nack pli // 與 fir 類似
...
//============= 會話描述 ====================
v=0
o=‐ 7017624586836067756 2 IN IP4 127.0.0.1
s=‐
t=0 0
...
//================ 媒體描述 =================
//================ 音頻媒體 =================
/*
* 音頻使用端口 1024 收發數據
* UDP/TLS/RTP/SAVPF 表示使用 dtls/srtp 協議對數據加密傳輸
* 111、103 ... 表示本會話音頻數據的 Payload Type
*/
m=audio 1024 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
//============== 網絡描述 ==================
// 指明接收或者發送音頻使用的 IP 地址,由于 WebRTC 使用 ICE 傳輸,這個被忽略。
c=IN IP4 0.0.0.0
// 用來設置 rtcp 地址和端口,WebRTC 不使用
a=rtcp:9 IN IP4 0.0.0.0
...
//============== 音頻安全描述 ================
//ICE 協商過程中的安全驗證信息
a=ice‐ufrag:khLS
a=ice‐pwd:cxLzteJaJBou3DspNaPsJhlQ
a=fingerprint:sha‐256
上面的 SDP 片段是摘取的 WebRTC SDP 中的安全描述與服務質量描述,這兩塊描述在標準 SDP 規范中沒有
明確定義,它更多屬于 WebRTC 業務的范疇。
其中,安全描述起到兩方面的作用,一方面是進行網絡連通性檢測時,對用戶身份進行認證;另一方面是收發
數據時,對用戶身份的認證,以免受到對方的攻擊。從中可以看出 WebRTC 對安全有多重視了
服務質量描述指明啟動哪些功能以保證音視頻的質量,如啟動帶寬評估,當用戶發送數據量太大超過評估的帶
寬時,要及時減少數據包的發送;啟動防擁塞功能,當預測到要發生擁塞時,通過降低流量的方式防止擁塞的
發生等等,這些都屬于服務質量描述的范疇。
為便于你更好地理解和使用 SDP,接下來看一個真實的例子。
下面這段 SDP 是我從一個真實的 1 對 1 場景中截取出來的 WebRTC SDP 的片段。并對 SDP 上做了詳細的
注釋。
//============= 會話描述 ====================
v=0
o=‐ 7017624586836067756 2 IN IP4 127.0.0.1
s=‐
t=0 0
...
//================ 媒體描述 =================
//================ 音頻媒體 =================
/*
* 音頻使用端口 1024 收發數據
* UDP/TLS/RTP/SAVPF 表示使用 dtls/srtp 協議對數據加密傳輸
* 111、103 ... 表示本會話音頻數據的 Payload Type
*/
m=audio 1024 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
//============== 網絡描述 ==================
// 指明接收或者發送音頻使用的 IP 地址,由于 WebRTC 使用 ICE 傳輸,這個被忽略。
c=IN IP4 0.0.0.0
// 用來設置 rtcp 地址和端口,WebRTC 不使用
a=rtcp:9 IN IP4 0.0.0.0
...
//============== 音頻安全描述 ================
//ICE 協商過程中的安全驗證信息
a=ice‐ufrag:khLS
a=ice‐pwd:cxLzteJaJBou3DspNaPsJhlQ
a=fingerprint:sha‐256
FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17
...
//============== 音頻流媒體描述 ================
a=rtpmap:111 opus/48000/2
//minptime 代表最小打包時長是 10ms,useinbandfec=1 代表使用 opus 編碼內置 fec 特性
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
...
//================= 視頻媒體 =================
m=video 9 UDP/TLS/RTP/SAVPF 100 101 107 116 117 96 97 99 98
...
//================= 網絡描述 =================
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
...
//================= 視頻安全描述 =================
a=ice‐ufrag:khLS
a=ice‐pwd:cxLzteJaJBou3DspNaPsJhlQ
a=fingerprint:sha‐256
FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17
...
//================ 視頻流描述 ===============
a=mid:video
...
a=rtpmap:100 VP8/90000
//================ 服務質量描述 ===============
a=rtcp‐fb:100 ccm fir
a=rtcp‐fb:100 nack // 支持丟包重傳,參考 rfc4585
a=rtcp‐fb:100 nack pli
a=rtcp‐fb:100 goog‐remb // 支持使用 rtcp 包來控制發送方的碼流
a=rtcp‐fb:100 transport‐cc
...
從上面這段 SDP 中你應該可以總結出:SDP 是由一個會話層和多個媒體層組成的;而對于每個媒體層,
WebRTC 又將其細劃為四部分,即媒體流、網絡描述、安全描述和服務質量描述。
并且在上面的例子中有兩個媒體層——音頻媒體層和視頻媒體層,而對于每個媒體層,也都有對應的媒體流描
述、網絡描述、安全描述及服務質量描述。