SDP协议基本分析(RTSP、WebRTC使用)
目錄
- 一、介紹
- 二、標準 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是一個字符串。需
要特別注意的是,“=” 兩邊是不能有空格的。如下所示:
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 標準規范中的媒體層描述是一致的;而安全描述與服務質量描述都是
新增的一些屬性描述。
下圖我們來看一個具體的例子:
上面的 SDP 片段是摘取的 WebRTC SDP 中的安全描述與服務質量描述,這兩塊描述在標準 SDP 規范中沒有
明確定義,它更多屬于 WebRTC 業務的范疇。
其中,安全描述起到兩方面的作用,一方面是進行網絡連通性檢測時,對用戶身份進行認證;另一方面是收發
數據時,對用戶身份的認證,以免受到對方的攻擊。從中可以看出 WebRTC 對安全有多重視了
服務質量描述指明啟動哪些功能以保證音視頻的質量,如啟動帶寬評估,當用戶發送數據量太大超過評估的帶
寬時,要及時減少數據包的發送;啟動防擁塞功能,當預測到要發生擁塞時,通過降低流量的方式防止擁塞的
發生等等,這些都屬于服務質量描述的范疇。
為便于你更好地理解和使用 SDP,接下來看一個真實的例子。
下面這段 SDP 是我從一個真實的 1 對 1 場景中截取出來的 WebRTC SDP 的片段。并對 SDP 上做了詳細的
注釋。
從上面這段 SDP 中你應該可以總結出:SDP 是由一個會話層和多個媒體層組成的;而對于每個媒體層,
WebRTC 又將其細劃為四部分,即媒體流、網絡描述、安全描述和服務質量描述。
并且在上面的例子中有兩個媒體層——音頻媒體層和視頻媒體層,而對于每個媒體層,也都有對應的媒體流描
述、網絡描述、安全描述及服務質量描述。
總結
以上是生活随笔為你收集整理的SDP协议基本分析(RTSP、WebRTC使用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dnf中想漂亮地拍摄完成的游戏的整张截图
- 下一篇: bs架构 erp 进销存_从依赖经验到用