音視頻流媒體開(kāi)發(fā)-目錄
iOS知識(shí)點(diǎn)-目錄
Android-目錄
Flutter-目錄
數(shù)據(jù)結(jié)構(gòu)與算法-目錄
uni-pp-目錄
SDP(Session Description Protocol) 完全是?種會(huì)話描述格式 ― 它不屬于傳輸協(xié)議 ― 它只使?不同 的 適 當(dāng) 的 傳 輸 協(xié) 議 , 包 括 會(huì) 話 通 知 協(xié) 議 ( SAP ) 、 會(huì) 話 初 始 協(xié) 議 ( SIP ) 、 實(shí) 時(shí) 流 協(xié) 議 ( RTSP ) 、MIME 擴(kuò)展協(xié)議的電?郵件以及超?本傳輸協(xié)議(HTTP)。SDP協(xié)議是也是基于?本的協(xié)議,這樣就能保證協(xié)議的可擴(kuò)展性?較強(qiáng),這樣就使其具有?泛的應(yīng)?范圍。SDP 不?持會(huì)話內(nèi)容或媒體編碼的協(xié)商,所以在流媒體中只?來(lái)描述媒體信息。媒體協(xié)商這?塊要?RTSP來(lái)實(shí)現(xiàn).
SDP協(xié)議格式
SDP描述由許多?本?組成,?本?的格式為<類型>=<值>,<類型>是?個(gè)字?,<值>是結(jié)構(gòu)化的?本串,其格式依<類型>?定。
<type>=<value>[CRLF]。SDP在4566 中有詳細(xì)描述。
1.SDP的結(jié)構(gòu)
SDP僅僅提供了描述從會(huì)話信息到可能的會(huì)話參與者的格式。?個(gè)會(huì)話基本上有許多媒體流組成,因此,會(huì)話描述包含了許多與每個(gè)媒體流相關(guān)的參數(shù)說(shuō)明,此外還包括與會(huì)話整體相關(guān)的通?信息。所以,SDP消息中既包含了會(huì)話級(jí)參數(shù)?包括了媒體級(jí)參數(shù)。會(huì)話級(jí)參數(shù)包括如下信息,如會(huì)話名稱、會(huì)話發(fā)起者以及會(huì)話活動(dòng)時(shí)間。媒體級(jí)參數(shù)包括媒體類型、端?號(hào)、傳輸協(xié)議以及媒體格式。下圖描述了SDP消息的基本結(jié)構(gòu)。

SDP僅僅提供了對(duì)會(huì)話的描述,沒(méi)有提供將會(huì)話和可能的參與者聯(lián)系起來(lái)的?法,所以必須把SDP與其他協(xié)議(如SIP協(xié)議)聯(lián)系起來(lái)使?。SDP協(xié)議同SIP協(xié)議?樣基于?本的協(xié)議,需要使?特定的編碼集。字段名稱只能使?US-ASCII字符集,?本信息可以使?任何語(yǔ)?。由于SDP的ASCII編碼??進(jìn)制編碼占?帶寬多,所以SDP采?緊湊格式提?帶寬利?率。如v=version,s=session name等等。
SDP采?多?本?傳遞會(huì)話信息,每?使?“字段名=字段值”的格式。字段名只??個(gè)字符表示(??寫敏感),字段值可以有多個(gè)信息塊組成,?分號(hào)隔開(kāi),“=”左右不能有空格。
2. SDP語(yǔ)法
會(huì)話級(jí)別字段必須放在前?,然后才是媒體級(jí)參數(shù),會(huì)話數(shù)據(jù)與媒體數(shù)據(jù)之間的界限就是第?個(gè)媒體描述字段(m=)的出現(xiàn),之后的每個(gè)媒體描述字段的出現(xiàn)標(biāo)志著這個(gè)會(huì)話中??個(gè)媒體流數(shù)據(jù)的開(kāi)始。
SDP字段包括必必需字段與可選字段。
2.1 必需字段
- v=(協(xié)議版本號(hào)),?個(gè)會(huì)話描述的開(kāi)始,前?個(gè)會(huì)話結(jié)束標(biāo)志。
- o=(會(huì)話源或者會(huì)話?成者,以及會(huì)話標(biāo)識(shí)符)
- s=(會(huì)話名稱)這個(gè)字段是個(gè)?本字符串,可以顯示給會(huì)話參與者。
- t=(會(huì)話時(shí)間)這個(gè)字段指明會(huì)話開(kāi)始時(shí)間與結(jié)束時(shí)間。
- m=(媒體)該字段?來(lái)指明媒體類型、數(shù)據(jù)應(yīng)該發(fā)送到的傳輸端?,傳輸協(xié)議(例如RTP)以及媒體格式(例如RTP負(fù)載格式)
2.2 可選字段
SDP可選字段中,?些只能應(yīng)?于會(huì)話級(jí),?些只能應(yīng)?于媒體級(jí),還有?些可以應(yīng)?于兩種級(jí)別。對(duì)于應(yīng)?于兩種級(jí)別的字段,在某個(gè)具體媒體上,應(yīng)?于媒體級(jí)的字段會(huì)覆蓋應(yīng)?于會(huì)話級(jí)的字段值。例如,某個(gè)字段其會(huì)話級(jí)的字段值為X,媒體1的該字段值為Y,那么值X應(yīng)?于會(huì)話中除媒體類型1之外的所有媒體,?媒體1應(yīng)?值Y.
可選字段如下:
- i=(會(huì)話信息)對(duì)字段的?本描述,提供了?會(huì)話名稱更多的信息。該字段既可以?于會(huì)話級(jí)也可以?于媒體級(jí)。
- u=(描述的URI地址)URI信息,通過(guò)這個(gè)地址可以獲取更多會(huì)話相關(guān)信息。例如,?個(gè)會(huì)議可能公布在WEB??上,所以需要該WEB的URI。每個(gè)會(huì)話只能提供?個(gè)URI
- E=(E-mail地址)負(fù)責(zé)會(huì)話個(gè)體的E-mail地址,可以有多個(gè)。只能?于會(huì)話級(jí)別。
- p=(電話號(hào)碼)同email?樣,多個(gè),會(huì)話級(jí)別。
- c=(連接信息)該字段提供連接數(shù)據(jù),包括連接類型、?絡(luò)類型和連接地址??蓱?yīng)?于會(huì)話級(jí)也可以?于媒體級(jí)。
- b=(帶寬信息)指明帶寬需求,單位kbit/s, 可?于兩個(gè)級(jí)別
- r=(重復(fù)次數(shù))如果是有規(guī)律的?程安排活動(dòng),這個(gè)字段?來(lái)指明會(huì)話重復(fù)頻次和時(shí)間。
- z=(時(shí)區(qū)調(diào)整)?于按?程安排的有規(guī)律活動(dòng)會(huì)話。會(huì)話可能會(huì)夸時(shí)區(qū),避免時(shí)區(qū)變更造成的混亂。
- k=(加密密鑰)為了對(duì)媒體加密、解密,該字段提供了?個(gè)加密密鑰或者規(guī)定了?個(gè)獲取密鑰的機(jī)制???于兩個(gè)級(jí)別。
- a=(屬性)?于描述會(huì)話或者某個(gè)媒體的額外屬性。
可選字段中,連接信息字段是特別與條件相關(guān)的。因?yàn)樵撟侄味x了數(shù)據(jù)應(yīng)發(fā)送到的?絡(luò)地址,所以必須被包含進(jìn)會(huì)話描述中的某個(gè)地?。
2.3 字段順序
因?yàn)橛行┳侄渭瓤梢詰?yīng)?于會(huì)話級(jí)?可以?于媒體級(jí),所以字段順序?qū)τ诒苊夂x模糊特別重要。SDP所要求的字段順序如下:
會(huì)話級(jí)
協(xié)議版本號(hào)(v)
會(huì)話源(o)
會(huì)話名稱(s)
會(huì)話信息(i)(可選)
URI(u)(可選)
E-mail地址(e)(可選)
電話號(hào)碼(p)(可選)
連接信息(c)(可選)
帶寬信息(b)(可選)
時(shí)間描述(t)
重復(fù)信息(r)(可選)
時(shí)區(qū)調(diào)整(z)(可選)
加密密鑰(k)(可選)
屬性(a)(可選)
媒體級(jí)
媒體描述(m)
媒體信息(i)(可選)
連接信息(c)(會(huì)話級(jí)進(jìn)?了規(guī)定,這?可選)
帶寬信息(b)(可選)
加密密鑰(k)(可選)
屬性(a)(可選)
2.4 ?字段
在SDP中許多字段采?多個(gè)?字段的形式,此時(shí),這些字段值由多個(gè)以空格符間隔的多個(gè)值組成。格式如下:
字段 名稱=<?字段1的值> <?字段2的值> <?字段3的值>
下?舉例說(shuō)明?較重要的字段
- 會(huì)話源(o)
有6個(gè)?字段:?戶名、會(huì)話ID、版本、?絡(luò)類型、地址類型、地址。 - 連接信息
連接數(shù)據(jù)有3個(gè)?字段:?絡(luò)類型、地址類型和連接地址。同會(huì)話源中含義不同,他們表示需要接收媒體數(shù)據(jù)的?絡(luò)和地址,?不是?成會(huì)話的?絡(luò)和地址。 - 媒體信息
媒體信息(m)有四個(gè)?字段:媒體類型、端?、傳輸協(xié)議、格式。
m描敘?:
格式: m=(媒體)(端?)(傳送層)(格式列表)
媒體類型:?頻(audio),視頻(video),應(yīng)?,數(shù)據(jù)和控制
端?:媒體傳送層端?
傳送層:ip4上?多基于rtp/udp上傳送(RTP/AVP)IETF RTP協(xié)議,在udp上傳輸
格式列表: 對(duì)應(yīng)對(duì)應(yīng)的?頻負(fù)載類型(PT)
m=video 0 RTP/AVP 96

a是對(duì)m描述? 的格式列表的 PT 做?步的描述。
媒體類型可以是?頻、視頻、應(yīng)?程序、數(shù)據(jù)或控制,如果是語(yǔ)?,媒體類型就是?頻。
端?指明媒體要發(fā)送到的端?號(hào),端?號(hào)與所有的連接類型和傳輸協(xié)議有關(guān)。例如VoIP,媒體通常在UDP傳輸協(xié)議上采?RTP承載,這樣端?號(hào)將是1024和65535之間的?個(gè)偶數(shù)值。相應(yīng)奇數(shù)對(duì)應(yīng)RTCP 端 ?號(hào)。
格式?字段列出了所?持的所有不同類型的媒體格式。優(yōu)先使?靠前的格式。
如某個(gè)系統(tǒng)準(zhǔn)備在端?45678接收語(yǔ)?,并且只能處理G.711 u編碼的語(yǔ)?,那么RTP負(fù)載類型為0,媒體信息如下:
m=audio 45678 RTP/AVP 0
如果某個(gè)系統(tǒng)準(zhǔn)備在端?45678可以處理?種編碼的語(yǔ)?:G.728編碼格式(負(fù)載類型為15)、GSM編碼格式(負(fù)載類型為3)、G.711 u編碼格式(負(fù)載類型為0),?且系統(tǒng)優(yōu)先采?G.728格式,則相應(yīng)的媒體信息如下所示:
m=audio 45678 RTP/AVP 15 3 0
- 屬性(a)
屬性可以描述額外信息,可應(yīng)?于會(huì)話級(jí),也可?于媒體級(jí)或者兩者兼有。
a描敘?(?部分情況是必須):
格式:a=rtpmap:(凈荷類型)(編碼名)/(時(shí)鐘速率)【/(編碼參數(shù))】
a=control:(?/視頻連接信息)
a=control:rtsp://192.168.1.197/h264stream0/trackID=0
a=rtpmap:96 H264/90000
屬性有兩種形式,第?種是特征屬性,第?種屬于值屬性。SDP描述了多個(gè)建議屬性。
例如a=sendonly
表明會(huì)話描述的發(fā)送者只希望發(fā)送數(shù)據(jù)?不打算接收數(shù)據(jù),端?號(hào)?意義,可以置為0。
例如a=recvonly
表明這個(gè)會(huì)話描述的發(fā)送者只想接收數(shù)據(jù)?不打算發(fā)送數(shù)據(jù)。
例如a=rtpmp:<負(fù)載類型><編碼名稱>/<時(shí)鐘速率>[<編碼參數(shù)>]
rtpmap屬性提供了?個(gè)在VoIP應(yīng)?中的重要屬性使??法,該屬性可?于媒體流,在媒體格式不是靜態(tài)的RTP負(fù)載類型時(shí)特別有?。
嚴(yán)格來(lái)說(shuō),“rtpmap”只在使?動(dòng)態(tài)負(fù)載類型情況下才是必須的,例如標(biāo)準(zhǔn)的G.711語(yǔ)?是靜態(tài)RTP負(fù)載類型,采?如下?法就可以對(duì)它完整描述:
m=audio 45678 RTP/AVP 0
?對(duì)動(dòng)態(tài)負(fù)載來(lái)說(shuō)需要指定更多信息才能使遠(yuǎn)端完全識(shí)別到媒體編碼,例如16位線性編碼16kHz取樣的?體聲?就是?個(gè)動(dòng)態(tài)RTP負(fù)載類型,如果我們采?動(dòng)態(tài)負(fù)載類型98表示這個(gè)媒體流,那么SDP格式如下:
m=audio 45678 RTP/AVP 98
a=rtpmap 98 L16/16000/2
SIP建議?論是靜態(tài)負(fù)載還是動(dòng)態(tài)負(fù)載,盡量都要采?該屬性。
3 SDP協(xié)議例?
下?是?個(gè)helix 流媒體服務(wù)器的RTSP協(xié)議中的SDP協(xié)議:
v=0 //SDP version
// o field定義的源的?些信息。其格式為:o=<username> <sess-id> <sess-version> <nettype><addrtype> <unicast-address>
o=- 1271659412 1271659412 IN IP4 10.56.136.37 s=<No title>
i=<No author> <No copyright> //session的信息
c=IN IP4 0.0.0.0 //connect 的信息,分別描述了:?絡(luò)協(xié)議,地址的類型,連接地址。
c=IN IP4 0.0.0.0
t=0 0 //時(shí)間信息,分別表示開(kāi)始的時(shí)間和結(jié)束的時(shí)間,?般在流媒體的直播的時(shí)移中?的?較多。
a=SdpplinVersion:1610641560 //描述性的信息
a=StreamCount:integer;2 //?來(lái)描述媒體流的信息,表示有兩個(gè)媒體流。integer表示信息的格式為整數(shù)。
a=control:*
a=DefaultLicenseValue:integer;0 //License信息
a=FileType:string;"MPEG4" ////?來(lái)描述媒體流的信息說(shuō)明當(dāng)前協(xié)商的?件是mpeg4格式的?件
a=LicenseKey:string;"license.Summary.Datatypes.RealMPEG4.Enabled"
a=range:npt=0-72.080000 //?來(lái)表示媒體流的?度
m=audio 0 RTP/AVP 96 //做為媒體描述信息的重要組成部分描述了媒體信息的詳細(xì)內(nèi)容:表示session的audio是通過(guò)RTP來(lái)格式傳送的,其payload值為96傳送的端?還沒(méi)有定。
b=as:24 //audio 的bitrate
b=RR:1800
b=RS:600
a=control:streamid=1 //通過(guò)媒體流1來(lái)發(fā)送?頻
a=range:npt=0-72.080000 //說(shuō)明媒體流的?度。
a=length:npt=72.080000
a=rtpmap:96 MPEG4-GENERIC/32000/2 //rtpmap的信息,表示?頻為AAC的其sample為32000
a=fmtp:96 profile-level-id=15;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210 //config為AAC的詳細(xì)格式信息
a=mimetype:string;"audio/MPEG4-GENERIC"
a=Helix-Adaptation-Support:1
a=AvgBitRate:integer;48000
a=HasOutOfOrderTS:integer;1
a=MaxBitRate:integer;48000
a=Preroll:integer;1000
a=OpaqueData:buffer;"A4CAgCIAAAAEgICAFEAVABgAAAC7gAAAu4AFgICAAhKIBoCAgAEC"
a=StreamName:string;"Audio Track"
下?是video的信息基本和audio的信息相對(duì)稱,這?就不再說(shuō)了。
m=video 0 RTP/AVP 97
b=as:150
b=RR:11250
b=RS:3750
a=control:streamid=2
a=range:npt=0-72.080000
a=length:npt=72.080000
a=rtpmap:97 MP4V-ES/2500
a=fmtp:97 profile-level-id=1;
a=mimetype:string;"video/MP4V-ES"
a=Helix-Adaptation-Support:1
a=AvgBitRate:integer;300000
a=HasOutOfOrderTS:integer;1
a=Height:integer;240 //影?的?度
a=MaxBitRate:integer;300000
a=MaxPacketSize:integer;1400
a=Preroll:integer;1000
a=Width:integer;320 //影?的寬度
a=OpaqueData:buffer;"AzcAAB8ELyARAbd0AAST4AAEk+AFIAAAAbDzAAABtQ7gQMDPAAABAAA
AASAAhED6KFAg8KIfBgEC"
a=StreamName:string;"Video Track"
例?2
1 v=0
2 o=StreamingServer 3677033027 1437537780000 IN IP4 192.168.1.44
3 s=\demo.mp4
4 u=http:///
5 e=admin@
6 c=IN IP4 0.0.0.0
7 b=AS:1398
8 t=0 0
9 a=control:*
10 a=x-copyright: MP4/3GP File hinted with GPAC 0.5.0-rev4065 (C)2000-2005 - [http://gpac.sourceforge.net](http://gpac.sourceforge.net/)
11 a=range:npt=0- 216.52167
12
13 m=video 0 RTP/AVP 96
14 b=AS:1242
15 a=3GPP-Adaptation-Support:1
16 a=rtpmap:96 H264/90000
17 a=control:trackID=65536
18 a=fmtp:96 profile-level-id=42000A; packetization-mode=1; sprop-parameter-sets=Z0IACpZUBQHogA==,aM44gA==
19 a=framesize:96 640-480
20
21 m=audio 0 RTP/AVP 97
22 b=AS:156
23 a=3GPP-Adaptation-Support:1
24 a=rtpmap:97 mpeg4-generic/48000/1
25 a=control:trackID=65537
26 a=fmtp:97 profile-level-id=41; config=1188; streamType=5; mode=AAC-hbr; objectType=64; constantDuration=1024; sizeLength=13; index Length=3; indexDeltaLength=3
視頻”a=fmtp”字段的解析 參考 RFC3984的8.2節(jié)
?頻config描述符的解析 參考 RFC 3016
WebRTC:會(huì)話描述協(xié)議SDP
什么是SDP
SDP(Session Description Protocol)是?種通?的會(huì)話描述協(xié)議,主要?來(lái)描述多媒體會(huì)話,?途包括會(huì)話聲明、會(huì)話邀請(qǐng)、會(huì)話初始化等。
WebRTC主要在連接建?階段?到SDP,連接雙?通過(guò)信令服務(wù)交換會(huì)話信息,包括?視頻編解碼器(codec)、主機(jī)候選地址、?絡(luò)傳輸協(xié)議等。
下?先簡(jiǎn)單介紹下SDP的格式、常?屬性,然后通過(guò)WebRTC連接建?過(guò)程?成的SDP實(shí)例進(jìn)?進(jìn)?步講解。
協(xié)議格式說(shuō)明
SDP的格式?常簡(jiǎn)單,由多個(gè)?組成,每個(gè)?都是如下格式。
<type>=<value>
其中:
- <type> :??寫敏感的?個(gè)字符,代表特定的屬性,?如 v 代表版本;
- <value> :結(jié)構(gòu)化?本,格式與屬性類型有關(guān),UTF8編碼;
- = 兩邊不允許存在空格;
- =* 表示是可選的;
常?屬性
以下?的SDP為例:
1 v=0
2 o=alice 2890844526 2890844526 IN IP4 host.anywhere.com
3 s=
4 c=IN IP4 host.anywhere.com
5 t=0 0
6 m=audio 49170 RTP/AVP 0
7 a=rtpmap:0 PCMU/8000
8 m=video 51372 RTP/AVP 31
9 a=rtpmap:31 H261/90000
10 m=video 53000 RTP/AVP 32
11 a=rtpmap:32 MPV/90000
協(xié)議版本號(hào): v=
格式如下,注意,沒(méi)有?版本號(hào)。
v=0
會(huì)話發(fā)起者: o
格式如下,其中,username、session-id、nettype、addrtype、unicast-address ?起,唯?標(biāo)識(shí)?個(gè)會(huì)話。
o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
各字段含義如下:
- username:發(fā)起者的?戶名,不允許存在空格,如果應(yīng)?不?持?戶名,則為 - 。
- sess-id:會(huì)話id,由應(yīng)???定義,規(guī)范的建議是NTP(Network Time Protocol)時(shí)間戳。
- sess-version:會(huì)話版本,?途由應(yīng)???定義,只要會(huì)話數(shù)據(jù)發(fā)?變化時(shí)(?如編碼),sess-
- version隨著遞增就?。同樣的,規(guī)范的建議是NTP時(shí)間戳。
- nettype:?絡(luò)類型,?如 IN 表示 Internet 。
- addrtype:地址類型,?如 IP4 、 IV6
- unicast-address:域名,或者IP地址。
會(huì)話名 s=
必選,有且僅有?個(gè) s= 字段,且不能為空。如果實(shí)在沒(méi)有有意義的會(huì)話名,可以賦?個(gè)空格,即 s= 。
s=<session name>
連接數(shù)據(jù):c=
格式如下:
c=<nettype> <addrtype> <connection-address>
每個(gè)SDP?少需要包含?個(gè)會(huì)話級(jí)別的 c= 字段,或者在每個(gè)媒體描述后?各包含?個(gè) c= 字段。(媒體描述后的 c= 會(huì)覆蓋會(huì)話級(jí)別的 c= )
- nettype:?絡(luò)類型,?如 IN ,表示 Internet。
- addrtype:地址類型,?如 IP4 、 IP6 。
- connection-address:如果是?播,則為?播地址組;如果是單播,則為單播地址;
舉例01:
c=IN IP4 224.2.36.42/127
舉例02:
c=IN IP4 host.anywhere.com
媒體描述: m=
SDP可能同時(shí)包含多個(gè)媒體描述。格式如下:
m=<media> <port> <proto> <fmt> ...
其中:
- media:媒體類型。包括 video、audio、text、application、message等。
- port:傳輸媒體流的端?,具體含義取決于使?的?絡(luò)類型(在 c= 中聲明)和使?的協(xié)議(proto,在m= 中聲明)。
- proto:傳輸協(xié)議,具體含義取決于 c= 中定義的地址類型,?如 c= 是IP4,那么這?的傳輸協(xié)議運(yùn)?在IP4之上。?如:
UDP:傳輸層協(xié)議是UDP。
RTP/AVP:針對(duì)視頻、?頻的RTP協(xié)議,跑在UDP之上。
RTP/SAVP:針對(duì)視頻、?頻的SRTP協(xié)議,跑在UDP之上。 - fmt:媒體格式的描述,可能有多個(gè)。根據(jù) proto 的不同,fmt 的含義也不同。?如 proto 為RTP/SAVP 時(shí),fmt 表示 RTP payload 的類型。如果有多個(gè),表示在這次會(huì)話中,多種payload類型可能會(huì)?到,且第?個(gè)為默認(rèn)的payload類型。
舉例,下?表示媒體類型是視頻,采?SRTP傳輸流媒體數(shù)據(jù),且RTP包的類型可能是122、102...119,默認(rèn)是122。
m=video 9 UDP/TLS/RTP/SAVPF 122 102 100 101 124 120 123 119
對(duì)于 RTP/SAVP,需要注意的是,payload type ?分兩種類型:
- 靜態(tài)類型:參考 RTP/AVP audio and video payload types。
- 動(dòng)態(tài)類型:在 a=fmtp: ?進(jìn)?定義。( a= 為附加屬性,?后??節(jié))
舉例,下?的SDP中:
- 對(duì)于audio,111 是動(dòng)態(tài)類型,表示 opus/48000/2 。
- 對(duì)于video,122 是動(dòng)態(tài)類型,表示 H264/90000 。
1 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 126
2 a=rtpmap:111 opus/48000/2
3 m=video 9 UDP/TLS/RTP/SAVPF 122 102 100 101 124 120 123 119
4 a=rtpmap:122 H264/90000
附加屬性: a=
作?:?于擴(kuò)展SDP。
有兩種作?范圍:會(huì)話級(jí)別(session-level)、媒體級(jí)別(media-level)。
- 媒體級(jí)別:媒體描述(m=)后?可以跟任意數(shù)量的 a= 字段,對(duì)媒體描述進(jìn)?擴(kuò)展。
- 會(huì)話級(jí)別:在第?個(gè)媒體字段(media field)前,添加的 a= 字段是會(huì)話級(jí)別的。
有如下兩種格式:
a=<attribute>
a=<attribute>:<value>
格式1舉例:
a=recvonly
格式2舉例:
a=rtpmap:0 PCMU/8000
時(shí)間: t=
作?:聲明會(huì)話的開(kāi)始、結(jié)束時(shí)間。
格式如下:
t=<start-time> <stop-time>
如果 <stop-time> 是0,表示會(huì)話沒(méi)有結(jié)束的邊界,但是需要在 <start-time> 之后會(huì)話才是活躍(active)的。如果 <start-time> 是0,表示會(huì)話是永久的。
舉例:
t=0 0
WebRTC實(shí)例
下?例?來(lái)?騰訊云WebRTC服務(wù)的遠(yuǎn)端offer。
1 // sdp版本號(hào)為0
2 v=0
3 // o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
4 // ?戶名為空,會(huì)話id是8100750360520823155,會(huì)話版本是2(后?如果有類似改變編碼的操作,sess-version加1),地址類型為IP4,地址為127.0.0.1(這?可以忽略)
5 o=- 7595655801978680453 2 IN IP4 112.90.139.105
6 // 會(huì)話名為空
7 s=-
8 // 會(huì)話的起始時(shí)間,都為0表示沒(méi)有限制
9 t=0 0
10 a=ice-lite
11 // ?頻、視頻的傳輸?shù)膫鬏敳扇《嗦窂?fù)?,通過(guò)同?個(gè)RTP通道傳輸?頻、視頻,可以參考 https://tools.ietf.org/html/draft-ietf-mmusic-sdp-bundle-negotiation-54
12 a=group:BUNDLE 0 1
13 // WMS是WebRTC Media Stram的縮寫,這?給Media Stream定義了?個(gè)唯?的標(biāo)識(shí)符。?個(gè)Media Stream可以有多個(gè)track(video track、audio track),這些track就是通過(guò)這個(gè)唯?標(biāo)識(shí)符關(guān)聯(lián)起來(lái)的,具體?下?的媒體?(m=)以及它對(duì)應(yīng)的附加屬性(a=ssrc:)
14 // 可以參考這? http://tools.ietf.org/html/draft-ietf-mmusic-msid
15 a=msid-semantic: WMS 5Y2wZK8nANNAoVw6dSAHVjNxrD1ObBM2kBPV
16 // m=<media> <port> <proto> <fmt> ...
17 // 本次會(huì)話有?頻,端?為9(可忽略,端?9為Discard Protocol專?),采?UDP傳輸加密的RTP包,并使?基于SRTCP的?視頻反饋機(jī)制來(lái)提升傳輸質(zhì)量,111、103、104等是audio可能采?的編碼(參?前?m=的說(shuō)明)
18 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 126
19 // ?頻發(fā)送者的IP4地址,WebRTC采?ICE,這?的 0.0.0.0 可直接忽略
20 c=IN IP4 0.0.0.0
21 // RTCP采?的端?、IP地址(可忽略)
22 a=rtcp:9 IN IP4 0.0.0.0
23 // ice-ufrag、ice-pwd 分別為ICE協(xié)商?到的認(rèn)證信息
24 a=ice-ufrag:58142170598604946
25 a=ice-pwd:71696ad0528c4adb02bb40e1
26 // DTLS協(xié)商過(guò)程的指紋信息
27 a=fingerprint:sha-256 7F:98:08:AC:17:6A:34:DB:CF:3B:EC:93:ED:57:3F:5A:9E:1F:4A:F3:DB:D5:BF:66:EE:17:58:E0:57:EC:1B:19
28 // 當(dāng)前客戶端在DTLS協(xié)商過(guò)程中,既可以作為客戶端,也可以作為服務(wù)端,具體可參考RFC4572
29 a=setup:actpass
30 // 當(dāng)前媒體?的標(biāo)識(shí)符(在a=group:BUNDLE 0 1 這????到,這?0表示audio)
31 a=mid:0
32 // RTP允許擴(kuò)展?部,這?表示采?了RFC6464定義的針對(duì)audio的擴(kuò)展?部,?來(lái)調(diào)節(jié)?量,?如在?型會(huì)議中,有多個(gè)?頻流,就可以?這個(gè)來(lái)調(diào)整?頻混流的策略
33 // 這?沒(méi)有vad=1,表示不啟?這個(gè)?量控制
34 a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
35 // 表示既可以發(fā)送?頻,也可以接收?頻
36 a=sendrecv
37 // 表示啟?多路復(fù)?,RTP、RTCP共?同個(gè)通道
38 a=rtcp-mux
39 // 下???都是對(duì)audio媒體?的補(bǔ)充說(shuō)明(針對(duì)111),包括rtpmap、rtcp-fb、fmtp
40 // rtpmap:編解碼器為opus,采樣率是48000,2聲道
41 a=rtpmap:111 opus/48000/2
42 // rtcp-fb:基于RTCP的反饋控制機(jī)制,可以參考 https://tools.ietf.org/html/rfc5124、https://webrtc.org/experiments/rtp-hdrext/transport-wide-cc-02/
43 a=rtcp-fb:111 transport-cc
44 a=rtcp-fb:111 nack
45 // 最?的?頻打包時(shí)間
46 a=fmtp:111 minptime=20
47 // 跟前?的rtpmap類似
48 a=rtpmap:126 telephone-event/8000
49 // ssrc?來(lái)對(duì)媒體進(jìn)?描述,格式為a=ssrc:<ssrc-id> <attribute>:<value>,具體可參考 RFC5576
50 // cname?來(lái)唯?標(biāo)識(shí)媒體的數(shù)據(jù)源
51 a=ssrc:16864608 cname:YZcxBwerFFm6GH69
52 // msid后?帶兩個(gè)id,第?個(gè)是MediaStream的id,第?個(gè)是audio track的id(跟后?的mslabel、label對(duì)應(yīng))
53 a=ssrc:16864608 msid:5Y2wZK8nANNAoVw6dSAHVjNxrD1ObBM2kBPV 128f4fa0-81dd-4c3a-bbcd-22e71e29d178
54 a=ssrc:16864608 mslabel:5Y2wZK8nANNAoVw6dSAHVjNxrD1ObBM2kBPV
55 a=ssrc:16864608 label:128f4fa0-81dd-4c3a-bbcd-22e71e29d178
56 // 跟audio類似,不贅述
57 m=video 9 UDP/TLS/RTP/SAVPF 122 102 125 107 124 120 123 119
58 c=IN IP4 0.0.0.0
59 a=rtcp:9 IN IP4 0.0.0.0
60 a=ice-ufrag:58142170598604946
61 a=ice-pwd:71696ad0528c4adb02bb40e1
62 a=fingerprint:sha-256 7F:98:08:AC:17:6A:34:DB:CF:3B:EC:93:ED:57:3F:5A:9E:1F:4A:F3:DB:D5:BF:66:EE:17:58:E0:57:EC:1B:19
63 a=setup:actpass
64 a=mid:1
65 a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
66 a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
67 a=extmap:4 urn:3gpp:video-orientation
68 a=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
69 a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
70 a=sendrecv
71 a=rtcp-mux
72 a=rtcp-rsize
73 a=rtpmap:122 H264/90000
74 a=rtcp-fb:122 ccm fir
75 a=rtcp-fb:122 nack
76 a=rtcp-fb:122 nack pli
77 a=rtcp-fb:122 goog-remb
78 a=rtcp-fb:122 transport-cc
79 a=fmtp:122 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
80 a=rtpmap:102 rtx/90000
81 a=fmtp:102 apt=122
82 a=rtpmap:125 H264/90000
83 a=rtcp-fb:125 ccm fir
84 a=rtcp-fb:125 nack
85 a=rtcp-fb:125 nack pli
86 a=rtcp-fb:125 goog-remb
87 a=rtcp-fb:125 transport-cc
88 a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
89 a=rtpmap:107 rtx/90000
90 a=fmtp:107 apt=125
91 a=rtpmap:124 H264/90000
92 a=rtcp-fb:124 ccm fir
93 a=rtcp-fb:124 nack
94 a=rtcp-fb:124 nack pli
95 a=rtcp-fb:124 goog-remb
96 a=rtcp-fb:124 transport-cc
97 a=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032
98 a=rtpmap:120 rtx/90000
99 a=fmtp:120 apt=124
100 a=rtpmap:123 H264/90000
101 a=rtcp-fb:123 ccm fir
102 a=rtcp-fb:123 nack
103 a=rtcp-fb:123 nack pli
104 a=rtcp-fb:123 goog-remb
105 a=rtcp-fb:123 transport-cc
106 a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032
107 a=rtpmap:119 rtx/90000
108 a=fmtp:119 apt=123
109 a=ssrc-group:FID 33718809 50483271
110 a=ssrc:33718809 cname:ovaCctnHP9Asci9c
111 a=ssrc:33718809 msid:5Y2wZK8nANNAoVw6dSAHVjNxrD1ObBM2kBPV 1d7fc300-9889-4f94-9f35-c0bcc77a260d
112 a=ssrc:33718809 mslabel:5Y2wZK8nANNAoVw6dSAHVjNxrD1ObBM2kBPV
113 a=ssrc:33718809 label:1d7fc300-9889-4f94-9f35-c0bcc77a260d
114 a=ssrc:50483271 cname:ovaCctnHP9Asci9c
115 a=ssrc:50483271 msid:5Y2wZK8nANNAoVw6dSAHVjNxrD1ObBM2kBPV 1d7fc300-9889-4f94-9f35-c0bcc77a260d
116 a=ssrc:50483271 mslabel:5Y2wZK8nANNAoVw6dSAHVjNxrD1ObBM2kBPV
117 a=ssrc:50483271 label:1d7fc300-9889-4f94-9f35-c0bcc77a260d
寫在后?
SDP協(xié)議格式本身很簡(jiǎn)單,難點(diǎn)?般在于應(yīng)?層在不同場(chǎng)景下擴(kuò)展出來(lái)的屬性,以及不同擴(kuò)展屬性對(duì)應(yīng)的含義。?如上?舉的例?,擴(kuò)展屬性、屬性值的說(shuō)明分散在數(shù)?個(gè)RFC?,查找、理解都費(fèi)了?番功夫。
相關(guān)鏈接
SDP: Session Description Protocol
Annotated Example SDP for WebRTC