WebRTC 中的 SDP 協(xié)議

課程地址:零聲學院 WebRTC入門與提高 https://ke.qq.com/course/435382?tuin=137bb271

技術(shù)支持QQ群:782508536

簡介

SDP 完全是一種會話描述格式 ― 它不屬于傳輸協(xié)議 ― 它只使用不同的適當?shù)膫鬏攨f(xié)議窗慎,包括會話通知協(xié)議(SAP)纽什、會話初始協(xié)議(SIP)逻族、實時流協(xié)議(RTSP)、MIME 擴展協(xié)議的電子郵件以及超文本傳輸協(xié)議(HTTP)础钠。SDP協(xié)議是也是基于文本的協(xié)議排监,這樣就能保證協(xié)議的可擴展性比較強仇奶,這樣就使其具有廣泛的應用范圍捻艳。SDP 不支持會話內(nèi)容或媒體編碼的協(xié)商驾窟,所以在流媒體中只用來描述媒體信息。媒體協(xié)商這一塊要用RTSP來實現(xiàn).

當發(fā)起多媒體電話會議认轨,IP語音呼叫時绅络,流媒體視頻或其他會話,需要傳達媒體細節(jié)嘁字,傳輸?shù)刂泛推渌麜捗柙獢?shù)據(jù)給參與者恩急。SDP 為此類信息提供了標準。SDP純粹是會話描述的格式,它不包含傳輸協(xié)議纪蜒。

WebRTC 會話就是由 SDP 描述的衷恭。對于 WebRTC 來說,最重要的是 SDP 中的媒體和傳輸信息纯续。

媒體信息包括:

媒體類型(視頻匾荆,音頻)
傳輸協(xié)議(RTP/UDP/IP,H.320等)
媒體格式(H.261視頻杆烁,MPEG視頻等)

傳輸信息包括:

媒體的遠程地址
媒體的遠程傳輸端口

該地址和端口取決于媒體和傳輸協(xié)議定義牙丽。但需要注意的是,因為存在網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)和防火墻兔魂,所以傳輸過程比較復雜烤芦,在 SDP 中沒有定義相關(guān)的實現(xiàn)。WebRTC 中使用 ICE 協(xié)議來解決 NAT 的問題析校。

SDP 格式

SDP會話描述是由多行文本組成表格构罗。由會話級部分(session-level)和多個媒體級(media-level)部分組成。會話級部分以”v =”行開始智玻,到第一個媒體級部分結(jié)束遂唧。每個媒體級部分以”m =”行開始,持續(xù)到下一個媒體級吊奢。

下面是所有的字段描述盖彭,可選項目標有”*”。
會話描述

v =(協(xié)議版本)
o =(發(fā)起者和會話標識符)
s =(會話名稱)
i = *(會話信息)
u = *(描述的URI)
e = *(電子郵件地址)
p = *(電話號碼)
c = *(連接信息 - 如果包含在內(nèi)页滚,則不需要所有媒體)
b = *(零個或多個帶寬信息行)

一個或多個時間描述("t ="和"r ="行;見下文)
z = *(時區(qū)調(diào)整)
k = *(加密密鑰)
a = *(零個或多個會話屬性行)零個或多個媒體描述

時間描述

t =(會話活動時間)
r = *(零個或多個重復次數(shù))

媒體描述

m =(媒體名稱和傳輸?shù)刂罚?i = *(媒體標題)
c = *(連接信息 - 如果包含在內(nèi)召边,則為可選項會話級別)
b = *(零個或多個帶寬信息行)
k = *(加密密鑰)
a = *(零個或多個媒體屬性行)

下面是一個基本的 SDP 描述:

v=0
o=- 3925575362227037542 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
a=msid-semantic: WMS 735174861
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:KZ8M
a=ice-pwd:NZ1R3TFbpF9ZqEyg5PNSoM85
a=fingerprint:sha-256 7B:0B:B7:6C:C2:82:77:D2:70:18:3F:DD:18:98:AB:22:07:0E:5D:5B:6D:30:C0:05:42:50:C0:D7:53:AF:3E:9F
a=setup:active
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=sendrecv
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
a=ssrc:889008008 cname:JQsS3I1VR6oT0wUw
a=ssrc:889008008 msid:735174861 6446c8d1-1db2-4024-b0bd-1e03304810fe
a=ssrc:889008008 mslabel:735174861
a=ssrc:889008008 label:6446c8d1-1db2-4024-b0bd-1e03304810fe
m=video 9 UDP/TLS/RTP/SAVPF 98 96 100 127 99 97 101
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:KZ8M
a=ice-pwd:NZ1R3TFbpF9ZqEyg5PNSoM85
a=fingerprint:sha-256 7B:0B:B7:6C:C2:82:77:D2:70:18:3F:DD:18:98:AB:22:07:0E:5D:5B:6D:30:C0:05:42:50:C0:D7:53:AF:3E:9F
a=setup:active
a=mid:video
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:4 urn:3gpp:video-orientation
a=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=sendrecv
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:98 H264/90000
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=fmtp:98 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtpmap:100 red/90000
a=rtpmap:127 ulpfec/90000
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=ssrc-group:FID 687692313 4175760292
a=ssrc:687692313 cname:JQsS3I1VR6oT0wUw
a=ssrc:687692313 msid:735174861 54bc6a42-f281-4d75-ac41-ab709717abdb
a=ssrc:687692313 mslabel:735174861
a=ssrc:687692313 label:54bc6a42-f281-4d75-ac41-ab709717abdb
a=ssrc:4175760292 cname:JQsS3I1VR6oT0wUw
a=ssrc:4175760292 msid:735174861 54bc6a42-f281-4d75-ac41-ab709717abdb
a=ssrc:4175760292 mslabel:735174861
a=ssrc:4175760292 label:54bc6a42-f281-4d75-ac41-ab709717abdb
"

s=-
會話名,沒有的話使用-代替


a=group
需要共用一個傳輸通道傳輸?shù)拿襟w裹驰,如果沒有這一行隧熙,音視頻,數(shù)據(jù)就會分別單獨用一個udp端口來發(fā)送
在同一個RTP會話中多路復用幾個媒體流,也就是在后面以”m =”開始的媒體段


a=msid-semantic
WMS是WebRTC Media Stream簡稱幻林,這一行定義了本客戶端支持同時傳輸多個流贞盯,一個流可以包括多個track音念。
在PeerConnection生命周期內(nèi)為 WebRTC Media Stream (WMS) 定義一個唯一的標識符,用于確定其他獨立的RTP媒體流(下面以”m = “開始的媒體段)屬于該 WMS躏敢。
接下來是三個以 “m = “開始的媒體段闷愤,分別是audio、video父丰、application肝谭。


m =
后面跟著四個參數(shù)
是媒體類型,包括audio, video, text, application, message
是發(fā)送媒體流的傳輸端口
是傳輸協(xié)議
是媒體格式說明蛾扇,有效負載類型

有效負載類型可以看 這篇文檔攘烛。其中0-95是靜態(tài)負載類型,96-127是動態(tài)負載類型镀首,需要使用”a = rtpmap:”屬性指定格式參數(shù)坟漱。


m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
m=audio說明本會話包含音頻,9代表音頻使用端口9來傳輸更哄,但是在webrtc中一現(xiàn)在一般不使用芋齿,如果設(shè)置為0,代表不傳輸音頻,UDP/TLS/RTP/SAVPF是表示用戶來傳輸音頻支持的協(xié)議成翩,udp觅捆,tls,rtp代表使用udp來傳輸rtp包,并使用tls加密
SAVPF代表使用srtcp的反饋機制來控制通信過程,后臺111 103 104 9 0 8 106 105 13 126表示本會話音頻支持的編碼麻敌,后臺幾行會有詳細補充說明


c=IN IP4 0.0.0.0
c 字段中包含了連接數(shù)據(jù)栅炒,但這一個地址不會被實際使用,只有 ICE 候選項中的 IP 地址和端口才會用于建立對話术羔。


a=rtcp:9 IN IP4 0.0.0.0
用來傳輸rtcp地地址和端口赢赊,webrtc中不使用


a=ice-ufrag
a=ice-pwd
指定了用于ICE的用戶名片段和密碼,不同的媒體段會使用不同的用戶名和密碼级历。


a=fingerprint
指紋是用于建立DTLS連接的自簽名證書的SHA-256散列释移,這行是dtls協(xié)商過程中需要的認證信息


a=setup:active
以上這行代表本客戶端在dtls協(xié)商過程中,可以做客戶端也可以做服務(wù)端寥殖,參考rfc4145 rfc4572


a=mid:audio
在前面BUNDLE這一行中用到的媒體標識


a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
上一行指出我要在rtp頭部中加入音量信息玩讳,參考 rfc6464


a=sendrecv
上一行指出我是雙向通信,另外幾種類型是recvonly,sendonly,inactive


a=rtcp-mux
上一行指出rtp,rtcp包使用同一個端口來傳輸

a = rtpmap
參數(shù)為 <payload type> <encoding name> / <clock rate> [/ <encoding parameters>]
對于 a=rtpmap:111 opus/48000/2 扛禽,就是對應”m =”中的有效負載111锋边,使用Opus編解碼器,采樣頻率48kHz编曼,立體聲。
一般每個媒體段會有多條”a=rtpmap”字段剩辟,位于前面的編解碼器具有較高的優(yōu)先級掐场。


a=fmtp:111 minptime=10;useinbandfec=1
這里講一下a=fmtp:參數(shù)設(shè)置往扔,這里講音頻的
將有效負載111,即 Opus 數(shù)據(jù)包的最短分時時間設(shè)置為10ms熊户,且使用in-band FEC(前向糾錯編碼)


a=rtcp-fb:111 transport-cc
以上這行說明opus編碼支持使用rtcp來控制擁塞萍膛,參考https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01


a=rtcp-fb
反饋消息,接收方向發(fā)送方發(fā)送的反饋消息


a=ssrc
同步源標識符嚷堡,用于在使用多個源時表示不同源的屬性


a=extmap
RTP 擴展項蝗罗,接收者可以自己解碼獲取里面的數(shù)據(jù)


a=rtcp-mux
支持對RTP的同一端口多路復用RTCP


b=
該屬性在上面沒有列出,可以自己添加
格式為<bwtype>:<bandwidth>
可以為CT或AS蝌戒,CT是所有媒體的總帶寬上限串塑,AS是指定單個媒體的帶寬


a=ssrc:18509423 cname:sTjtznXLCNH7nbRw
cname用來標識一個數(shù)據(jù)源,ssrc當發(fā)生沖突時可能會發(fā)生變化北苟,但是cname不會發(fā)生變化桩匪,也會出現(xiàn)在rtcp包中SDEC中,用于音視頻同步


a=ssrc:18509423 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C 15598a91-caf9-4fff-a28f-3082310b2b7a
以上這一行定義了ssrc和WebRTC中的MediaStream,AudioTrack之間的關(guān)系友鼻,msid后面第一個屬性是stream-d,第二個是track-id


m=video 9 UDP/TLS/RTP/SAVPF 98 96 100 127 99 97 101
是對視頻的編碼設(shè)置傻昙,在這里,你可以指定是使用H264編碼還是使用VP8編碼彩扔。如96代表VP8編碼妆档,98代表H264編碼,如果你要指定編碼方式為VP8就將96放在前面虫碉,指定H264贾惦,就將98放在前面


a=rtpmap:98 H264/90000
每個codec都有類似的描述都有以下類似的描述


a=rtcp-fb:98 ccm fir
ccm是codec control using RTCP feedback message簡稱,意思是支持使用rtcp反饋機制來實現(xiàn)編碼控制蔗衡,fir是Full Intra Request
簡稱纤虽,意思是接收方通知發(fā)送方發(fā)送幅完全幀過來


a=rtcp-fb:98 nack
支持丟包重傳,參考rfc4585


a=rtcp-fb:98 nack pli
支持關(guān)鍵幀丟包重傳,參考rfc4585


a=rtcp-fb:98 goog-remb
支持使用rtcp包來控制發(fā)送方的碼流


a=rtcp-fb:98 transport-cc
參考上面opus


注意

  1. 由于H264的rtp中不能區(qū)分視頻流中是否每一幀的圖像都連續(xù),對于丟幀的情況無法處理,所以fec+nack會導致fec包丟失后,nack去申請重傳fec的包.造成帶寬的浪費绞惦。
  2. WebRTC對FEC的冗余度計算是動態(tài)的, 會根據(jù)丟包情況和網(wǎng)絡(luò)帶寬估計(BWE)的結(jié)果動態(tài)調(diào)整冗余度,
    內(nèi)部會維護一個靜態(tài)的冗余度表. 冗余度范圍: 0-255.(255相當于100%冗余度)
  3. ULPFEC: Uneven Level Protection FEC.
    將需要保護的媒體流按照重要性分成若干區(qū)域(section)逼纸,
    不同的區(qū)域使用不同的保護級別(levels),每個ulpfec可以攜帶多個級別的保護區(qū)域济蝉。

精讀

音視頻 RED 與 FEC 的 RTP 格式封裝
什么是FEC/NACK/RTX /RED

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贺嫂,隨后出現(xiàn)的幾起案子踱稍,更是在濱河造成了極大的恐慌扩淀,老刑警劉巖卵凑,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件区端,死亡現(xiàn)場離奇詭異织盼,居然都是意外死亡危虱,警方通過查閱死者的電腦和手機埃跷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門剪勿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事〖淖荩” “怎么了程拭?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵棍潘,是天一觀的道長。 經(jīng)常有香客問我恤浪,道長,這世上最難降的妖魔是什么肴楷? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任砂客,我火速辦了婚禮渗钉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己瘫怜,他們只是感情好术徊,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宝磨,像睡著了一般弧关。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唤锉,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天世囊,我揣著相機與錄音,去河邊找鬼窿祥。 笑死株憾,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嗤瞎,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼墙歪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贝奇?” 一聲冷哼從身側(cè)響起虹菲,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掉瞳,沒想到半個月后毕源,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡陕习,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年霎褐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片该镣。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡冻璃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出损合,到底是詐尸還是另有隱情省艳,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布塌忽,位于F島的核電站拍埠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏土居。R本人自食惡果不足惜枣购,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望擦耀。 院中可真熱鬧棉圈,春花似錦、人聲如沸眷蜓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽米者。三九已至辑舷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間汽纤,已是汗流浹背上岗。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蕴坪,地道東北人肴掷。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓敬锐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呆瞻。 傳聞我的和親對象是個殘疾皇子台夺,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容