音視頻學習筆記-SDP
? SDP 是會話描述協(xié)議, 它用文本描述各端的能力. 如各端多支持的音頻編解碼器是什么, 這些解碼器設定的參數(shù)是什么, 使用的傳輸協(xié)議是什么, 以及包括的音視頻媒體是什么等等.
在進行音視頻通話時, 首先要進行信令交互, 而交互的一個重要信息就是SDP的互換, 目的是為了讓對方知道彼此具有哪些能力, 然后根據(jù)雙方各自的能力進行協(xié)商, 協(xié)商出大家認可的音視頻編解碼器, 相關參數(shù), 傳輸協(xié)議等.
標準SDP規(guī)范
描述格式
-
SDP結(jié)構(gòu)
- 會話描述
- 媒體描述
- 媒體類型
- 媒體格式
- 傳輸協(xié)議
- 傳輸?shù)腎P和端口
SDP格式
由多個<type>=<value>表達式組成. SDP由一個會話級描述和多個媒體級描述組成.
- 會話級的作用是整個會話, 從v=行開始到第一個媒體描述為止.
- 媒體級是單個的媒體流進行描述, 從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
...
SDP的結(jié)構(gòu)
- 會話描述結(jié)構(gòu)
- v=(protocol version, require), 如v=0, 表示SDP的版本號.
- o=(owner/creator and session identifier, require), 如o=<username> < session id> <version> <network type> <address type> <address>
- o= 表示對會話發(fā)起者的描述.
- <username>: 用戶名, 不關心用戶名時, 用"-"代替.
- <session id>: 數(shù)字串, 在整個會話中, 必須唯一.
- <version>: 版本號, 每次會話數(shù)據(jù)修改后, 還版本值會遞增.
- <network type>: 網(wǎng)絡類型, 一般為"IN", 表示"internet".
- < address type > : 地址類型, 一般為IP4.
- < address >: IP地址.
- s=<session name> require, 表示一個會話, 在整個SDP中有且僅有一個會話.
- t=(time the session is active, require), 描述開始時間和結(jié)束時間.
- 媒體描述結(jié)構(gòu)
- m=(media name and transport address, optional), 如m=<media> <port> <transport> <fmt list>, 表示一個會話. 在一個SDP中一般會有多個媒體描述, 每個媒體描述以"m="開始到下一個"m="結(jié)束.
- <media>: 媒體類型, 如audio/video.
- <port>: 端口.
- <transport>: 傳輸協(xié)議, 如RTP/AVP, UDP.
- <fmt list>: 媒體格式, 即負載類型(Payload Type)列表.
- a=*(zero or more media attribute lines, optional), 如 a=<type> or a=<type>:<values>, 表示屬性, 用于進一步描述媒體信息.
- rtpmap(optional), a=rtpmap:<payload type> <encoding name> <clock rate>
- rtpmap是rtp與map的結(jié)合, 即RTP參數(shù)映射表.
- <payload type>: 負載類型, 對應RTP包中的音視頻數(shù)據(jù)負載類型.
- <encoding name>: 編碼器名稱, 如VP8, VP9, OPUS.
- <sample rate>: 采樣率.
- <encodingparameters>: 編碼參數(shù), 如音頻是否是雙聲道, 默認是單聲道.
- fmtp, 如a=fmtp:<payload type> <format specific parameters>
- fmtp, 格式參數(shù)
- <payload type>, 負載類型
- <format specific parameters> 指具體參數(shù).
- m=(media name and transport address, optional), 如m=<media> <port> <transport> <fmt list>, 表示一個會話. 在一個SDP中一般會有多個媒體描述, 每個媒體描述以"m="開始到下一個"m="結(jié)束.
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數(shù)據(jù)的描述
a=fmtp:111 minptime=10;useinbandfec=1 //對格式參數(shù)的描述
...
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
...
WebRTC中的SDP
WebRTC對標準SDP規(guī)范做了調(diào)整, 它將SDP按功能分成幾大塊:
- Session Metadata 會話元數(shù)據(jù)
- Network Description 網(wǎng)絡描述
- Stream Description 流描述
- Security Descriiption 安全描述
- Qos Grouping Description 服務質(zhì)量描述
216e0bc9ccfcb5dd3593f11e8b857dfa
60ac066baf39e92f4d9a3627cfe007ce
//=============會話描述====================
v=0
o=- 7017624586836067756 2 IN IP4 127.0.0.1
s=-
t=0 0
...
//================媒體描述=================
//================音頻媒體=================
/*
* 音頻使用端口1024收發(fā)數(shù)據(jù)
* UDP/TLS/RTP/SAVPF 表示使用 dtls/srtp 協(xié)議對數(shù)據(jù)加密傳輸
* 111、103 ... 表示本會話音頻數(shù)據(jù)的 Payload Type
*/
m=audio 1024 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
//==============網(wǎng)絡描述==================
//指明接收或者發(fā)送音頻使用的IP地址医窿,由于WebRTC使用ICE傳輸仰担,這個被忽略玩郊。
c=IN IP4 0.0.0.0
//用來設置rtcp地址和端口肢执,WebRTC不使用
a=rtcp:9 IN IP4 0.0.0.0
...
//==============音頻安全描述================
//ICE協(xié)商過程中的安全驗證信息
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編碼內(nèi)置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
...
//=================網(wǎng)絡描述=================
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
//================服務質(zhì)量描述===============
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包來控制發(fā)送方的碼流
a=rtcp-fb:100 transport-cc
...