SDP在4566 中有詳細描述。
SDP 全稱是 Session Description Protocol,
翻譯過來就是描述會話的協議。
主要用于兩個會話實體之間的媒體協商。
什么叫會話呢,比如一次網絡電話、一次電話會議、一次視頻聊天,這些都可以稱之為一次會話。
那為什么要去發這個描述文本呢,主要是為了解決參與會話的各成員之間能力不對等的問題,如果參加本次通話的成員都支持高質量的通話,但是我們沒有去進行協議,為了兼容性,使用的都是普通質量的通話格式,這樣就很浪費資源了。所以 SDP 的作用還是很有必要的。
SDP 協議結構 key = value?
key 一般是一個字母,
value 的值由key的啥 對應不同的值
協議中的特殊符號 *
由兩大部分組成 或者三大部分組成,原始協議中將會話時間和重復信息劃分到 (time description中)

協議部分說明是三大部分
會話級別信息
協議版本號(v)(必選)
version的縮寫
作用:?個會話描述的開始,前?個會話結束標志。
描述: 表示sdp的版本號,不包含次版本號
會話源(o)(必選)
origin的縮寫
作用:(會話源或者會話?成者,以及會話標識符)
會話名稱(s)(必選)
Session Name 的縮寫
????????(會話名稱)這個字段是個?本字符串,可以顯示給會話參與者。
????????s=SDP Seminar
? ? ? ? s=No Name
時間描述(t)(必選)
- 描述:t字段描述了會話的開始時間和結束時間,?為?NTP時間,單位是秒;如果?為0表示過了之后,會話一直持續;當 和?都為0的時候,表示持久會話,如拉實時流;
屬性(a)(可選)一般都會有值
會話信息(i)(可選)
例子
URI(u)(可選)
u=http://www.example.com/seminars/sdp.pdf
E-mail地址(e)(可選)
電話號碼(p)(可選)
連接信息(c)(可選)
Connection Data
- network type:網絡類型,一般為IN,表示internet;
- address type:地址類型,一般為IP4;
- connection address,地址,可能為域名或ip地址兩種形式;
帶寬信息(b)(可選)
- 描述:該選項描述了建議的帶寬,單位 kbs/s,可選,modifier包括兩種類型,CT和AS,CT表示總帶寬,AS表示單個媒體帶寬的最大值;bandwidth表示具體的帶寬;
重復信息(r)(可選)
活動持續時間
與開始時間的偏移
時區調整(z)(可選)
加密密鑰(k)(可選)
媒體級別信息
媒體描述(m)
表示一個會話的媒體信息;
格式: m=(媒體類型)(端?號碼)(傳送層協議)(格式列表)
????????media:媒體類型。有"audio",“video”,“application”,“data”(不向用戶顯示的數據),“control”(描述額外的控制通道);
????????port:表示媒體流發往傳輸層的端口,對于RTP,偶數端口用來傳輸數據,奇數端口對應RTCP用來傳輸信令;
????????transport type:表示傳輸協議,與"c="一行相關聯,一般用RTP/AVP表示,即 Realtime Transport Protocol using the Audio/Video profile over udp,即我們常說的RTP over udp;
????????fmt list:表示媒體格式,分為靜態綁定和動態綁定;
????????????????靜態綁定:媒體編碼方式與RTP負載類型有確定的一一對應關系,如: m=audio 0 RTP/AVP 8;
????????????????動態綁定:媒體編碼方式沒有完全確定,需要使用rtpmap進行進一步的說明;如下例子
????????????????????????m=video 0 RTP/AVP 96
????????????????????????a=rtpmap:96 H264/90000
媒體信息(i)(可選)
連接信息(c)(會話級進?了規定,這?可選)
帶寬信息(b)(可選)
加密密鑰(k)(可選)
屬性(a)(可選,但是一般都要填充)
屬性有兩種形式,第?種是特征屬性,第?種屬于值屬性。SDP描述了多個建議屬性。
特征屬性:
例如a=sendonly??表明會話描述的發送者只希望發送數據?不打算接收數據,端?號?意義,可以置為0。
值屬性:
a=rtpmap在協議中,SIP建議盡量使用該屬性,因此要特別分析一下,
參見上面的分析
a=fmtp
fmtp(format parameters)用于指定媒體數據格式。
格式:a=fmtp:<format> <format specific parameters>
示例:a=fmtp:111 minptime=10;useinbandfec=1
表示PayloadType值為111的數據(Opus數據):以10ms長的音頻數據為一幀,且數據經FEC(Forward Error Correction,前向糾錯)編碼。
?結合起來分析:
Media Description, name and address (m): video 0 RTP/AVP 96? ?
? ? ? ? Media Attribute (a): rtpmap:96 H264/90000
? ? ? ? Media Attribute (a): fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAKKzZQHgGWwFqAgICgAAAAwCAAAAYB4wYyw==,aOvjyyLA; profile-level-id=640028
? ? ? ? Media Attribute (a): control:streamid=0
我是video媒體類型,目前接口為0,,使用RTP/AVP協議,使用媒體格式編號為96
? ? ? ? rtpmap 則說明 96代碼的是 h264編碼,時鐘速率為90000
? ? ? ? fmtp (format parameters)說明 96媒體數據的格式 :
????????????????????????packetization-mode =1;
????????????????????????sprop-parameter-sets =?Z2QAKKzZQHgGWwFqAgICgAAAAwCAAAAYB4wYyw==,aOvjyyLA;
????????????????????????profile-level-id=640028
???????? control:streamid=0 說明ffmpeg對應的streamid 為0
例子
? ? Session Description Protocol
? ? ? ? Session Description Protocol Version (v): 0
? ? ? ? Owner/Creator, Session Id (o): - 0 0 IN IP4 127.0.0.1
? ? ? ? Session Name (s): No Name
? ? ? ? Connection Information (c): IN IP4 192.168.245.130
? ? ? ? Time Description, active time (t): 0 0
? ? ? ? Session Attribute (a): tool:libavformat 60.3.100
? ? ? ? Media Description, name and address (m): video 0 RTP/AVP 96
? ? ? ? Media Attribute (a): rtpmap:96 H264/90000
? ? ? ? Media Attribute (a): fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAKKzZQHgGWwFqAgICgAAAAwCAAAAYB4wYyw==,aOvjyyLA; profile-level-id=640028
? ? ? ? Media Attribute (a): control:streamid=0
? ? ? ? Media Description, name and address (m): audio 0 RTP/AVP 97
? ? ? ? Bandwidth Information (b): AS:128
? ? ? ? Media Attribute (a): rtpmap:97 MPEG4-GENERIC/44100/2
? ? ? ? Media Attribute (a): fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=121056E500
? ? ? ? Media Attribute (a): control:streamid=1
技巧:在 cmd 上打開 SDP 的log用來觀察SDP的 內容
1. 啟動 RTSP 服務器后
2. 使用ffmpeg 推流 或者ffplay拉流的時候 后面加上? -loglevel 40
使用推流 和 拉流的 方式打開
ffmpeg -re -i "zerenlian.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.245.130/test/002zerenlianmp4 -loglevel 40
?
ffplay -rtsp_transport tcp rtsp://192.168.245.130/test/002zerenlianmp4 -loglevel 40