SDP協議基本分析(RTSP、WebRTC使用)

目錄

  • 一、介紹
  • 二、標準 SDP 規范
    • 1. SDP 的格式
    • 2. SDP 的結構
      • (1)會話描述
      • (2)媒體描述
  • 三、WebRTC 中的 SDP

一、介紹

SDP(Session Description Protocal)以文本描述各端(PC 端、Mac 端、Android 端、iOS 端等)的能力,
這里的能力指的是各端所支持的:

  1. 音頻編解碼器是什么,這些編解碼器設定的參數是什么
  2. 使用的傳輸協議是什么
  3. 以及包括的音視頻媒體是什么等等。

例子:

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是一個字符串。需
要特別注意的是,“=” 兩邊是不能有空格的。如下所示:

v=0
o=7017624586836067756 2 IN IP4 127.0.0.1
s=‐
t=0 0
...
v=0

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>:采樣率,如音頻的采樣率頻率 3200048000 等。
<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 標準規范中的媒體層描述是一致的;而安全描述與服務質量描述都是
新增的一些屬性描述。
下圖我們來看一個具體的例子:

...
//======= 安全描述 ============
a=ice‐ufrag:1uEe // 進入連通性檢測的用戶名
a=ice‐pwd:RQe+y7SOLQJET+duNJ+Qbk7z// 密碼,這兩個是用于連通性檢測的憑證
a=fingerprint:sha‐256
35:6F:40:3D:F6:9B:BA:5B:F6:2A:7F:65:59:60:6D:6B:F9:C7:AE:46:44:B4:E4:73:F8:60:67:4D:58:E2:EB:
9C //DTLS 指紋認證,以識別是否是合法用戶
...
//======== 服務質量描述 =========
a=rtcp‐mux
a=rtcp‐rsiz
a=rtpmap:96 VP8/90000
a=rtcp‐fb:96 goog‐remb // 使用 google 的帶寬評估算法
a=rtcp‐fb:96 transport‐cc // 啟動防擁塞
a=rtcp‐fb:96 ccm fir // 解碼出錯,請求關鍵幀
a=rtcp‐fb:96 nack // 啟用丟包重傳功能
a=rtcp‐fb:96 nack pli // 與 fir 類似
...
//============= 會話描述 ====================
v=0
o=7017624586836067756 2 IN IP4 127.0.0.1
s=‐
t=0 0
...
//================ 媒體描述 =================
//================ 音頻媒體 =================
/*
* 音頻使用端口 1024 收發數據
* UDP/TLS/RTP/SAVPF 表示使用 dtls/srtp 協議對數據加密傳輸
* 111、103 ... 表示本會話音頻數據的 Payload Type
*/
m=audio 1024 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
//============== 網絡描述 ==================
// 指明接收或者發送音頻使用的 IP 地址,由于 WebRTC 使用 ICE 傳輸,這個被忽略。
c=IN IP4 0.0.0.0
// 用來設置 rtcp 地址和端口,WebRTC 不使用
a=rtcp:9 IN IP4 0.0.0.0
...
//============== 音頻安全描述 ================
//ICE 協商過程中的安全驗證信息
a=ice‐ufrag:khLS
a=ice‐pwd:cxLzteJaJBou3DspNaPsJhlQ
a=fingerprint:sha‐256

上面的 SDP 片段是摘取的 WebRTC SDP 中的安全描述與服務質量描述,這兩塊描述在標準 SDP 規范中沒有
明確定義,它更多屬于 WebRTC 業務的范疇。
其中,安全描述起到兩方面的作用,一方面是進行網絡連通性檢測時,對用戶身份進行認證;另一方面是收發
數據時,對用戶身份的認證,以免受到對方的攻擊。從中可以看出 WebRTC 對安全有多重視了
服務質量描述指明啟動哪些功能以保證音視頻的質量,如啟動帶寬評估,當用戶發送數據量太大超過評估的帶
寬時,要及時減少數據包的發送;啟動防擁塞功能,當預測到要發生擁塞時,通過降低流量的方式防止擁塞的
發生等等,這些都屬于服務質量描述的范疇。

為便于你更好地理解和使用 SDP,接下來看一個真實的例子。
下面這段 SDP 是我從一個真實的 1 對 1 場景中截取出來的 WebRTC SDP 的片段。并對 SDP 上做了詳細的
注釋。

//============= 會話描述 ====================
v=0
o=7017624586836067756 2 IN IP4 127.0.0.1
s=‐
t=0 0
...
//================ 媒體描述 =================
//================ 音頻媒體 =================
/*
* 音頻使用端口 1024 收發數據
* UDP/TLS/RTP/SAVPF 表示使用 dtls/srtp 協議對數據加密傳輸
* 111、103 ... 表示本會話音頻數據的 Payload Type
*/
m=audio 1024 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
//============== 網絡描述 ==================
// 指明接收或者發送音頻使用的 IP 地址,由于 WebRTC 使用 ICE 傳輸,這個被忽略。
c=IN IP4 0.0.0.0
// 用來設置 rtcp 地址和端口,WebRTC 不使用
a=rtcp:9 IN IP4 0.0.0.0
...
//============== 音頻安全描述 ================
//ICE 協商過程中的安全驗證信息
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 編碼內置 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
...
//================= 網絡描述 =================
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
//================ 服務質量描述 ===============
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 包來控制發送方的碼流
a=rtcp‐fb:100 transport‐cc
...

從上面這段 SDP 中你應該可以總結出:SDP 是由一個會話層和多個媒體層組成的;而對于每個媒體層,
WebRTC 又將其細劃為四部分,即媒體流、網絡描述、安全描述和服務質量描述。
并且在上面的例子中有兩個媒體層——音頻媒體層和視頻媒體層,而對于每個媒體層,也都有對應的媒體流描
述、網絡描述、安全描述及服務質量描述。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378826.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378826.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378826.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MFC六大關鍵技術(第四部分)——永久保存(串行化)

MFC 六大關鍵技術 ( 第四部分 ) ——永久保存&#xff08;串行化&#xff09; 先用一句話來說明永久保存的重要&#xff1a;弄懂它以后&#xff0c;你就越來越像個程序員了&#xff01; 如果我們的程序不需要永久保存&#xff0c;那幾乎可以肯定是一個小玩兒。那怕我們的記事本…

在網絡中配置思科交換機

By default, all ports of a switch are enabled. As we are talking about layer 2 switching, there is no need to configure IP address or any routing protocol on the switch. In such a situation, the configuration is not focused on the switch. 缺省情況下&#…

黑色背景下,描繪照片的輪廓形狀并保存

描繪照片的輪廓形狀并保存 import cv2 from matplotlib import pyplot as plt # 1.先找到輪廓 img cv2.imread(E:\Python-workspace\OpenCV\OpenCV/beyond.png, 0) _, thresh cv2.threshold(img, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) image, conturs, hierarchy c…

java pdf合并_Java 合并、拆分PDF文檔

本文將介紹如何在Java程序中合并及拆分PDF文檔&#xff0c;合并文檔時&#xff0c;包括合并多個不同PDF文檔為一個文檔&#xff0c;以及合并PDF文檔的不同頁面為一頁&#xff1b;拆分文檔是&#xff0c;包括將PDF文檔按每一頁拆分&#xff0c;以及按指定頁數范圍來拆分。下面將…

HDU4405 期望

對于期望&#xff0c;首先&#xff0c;對于這個公式中p表示概率&#xff0c;x表示隨機變量 展開則為 ex p1*x1p2*x2p3*x3....... 對于本題 假設 ex[ i ]表示當前 i 走到 n 的期望值。所以若 i 處沒有飛機&#xff0c;ex[ i ]sigma(1/6*ex[ik])1 其中(k1...6) &#xff08;1表示…

調用本地電腦攝像頭并進行按P進行捕獲照片并保存,按下Q退出

調用本地電腦攝像頭并進行按P進行捕獲照片并保存&#xff0c;按下Q退出 灰度攝像頭顯示&#xff1a; import cv2 cap cv2.VideoCapture(0) if not cap.isOpened():print("Cannot open camera")exit() while True:# 逐幀捕獲ret, frame cap.read()# 如果正確讀取幀…

intersect函數_PHP array_intersect()函數與示例

intersect函數PHP array_intersect()函數 (PHP array_intersect() Function ) array_intersect() function is used to find the matched elements from two or more elements. Function “array_intersect()” compares the values of the first array with the other arrays …

很全的SQL注入語句

1、返回的是連接的數據庫名and db_name()>02、作用是獲取連接用戶名and user>03、將數據庫備份到Web目錄下面;backup database 數據庫名 to diskc:\inetpub\wwwroot\1.db;--4、顯示SQL系統版本and 1(select VERSION) 或and 1convert(int,version)--5、判斷xp_cmdshell擴展…

使用DataTable更新數據庫

1、修改數據 DataRow dr hRDataSet.Tables["emp"].Rows.Find(textBox3.Text);//DataRow dr hRDataSet.Tables["emp"].Select("id"textBox3.Text)[0];dr.BeginEdit();dr["name"] textBox1.Text;dr.EndEdit();SqlCommandBuilder cmdn…

java異常體系_JAVA異常體系結構詳解

一、什么是異常異常&#xff1a;程序在運行過程中發生由于硬件設備問題、軟件設計錯誤等導致的程序異常事件。(在Java等面向對象的編程語言中)異常本身是一個對象&#xff0c;產生異常就是產生了一個異常對象。 ——百度百科二、異常體系Java把異常當作對象來處理&#xf…

對照片質量進行壓縮

對照片質量進行壓縮 其實無論是jpg還是png都是已經壓縮編碼化的格式罷了&#xff0c;原圖片的大小要遠遠大于壓縮編碼后的格式 1&#xff0c;像素&#xff1a;圖片放大到一定程度之后的一個個的小方塊 2&#xff0c;RGB&#xff1a;每一個像素&#xff08;小方塊&#xff09;都…

Silverlight訪問 Apache服務器(Tomcat,Geronimo)中部署的Webservice

Silverlight 訪問 Apache服務器中的Webservice 開發環境 Vs2010 、 Silverlight4 、 Java Jdk1.6 U 21 、 Apache-tomcat-6.0.20 、 Myeclipse8.5 、 Apache-ant-1.8.1 、 Axis2 、 Geronimo-tomcat6-javaee5-2.2. 下載地址&#xff1a; Apache-tomcat &#xff1a; http://apa…

那些幫助你成為優秀前端工程師的講座——《性能篇》

這篇文章是前端優秀講座和討論列表系列連載第七篇&#xff0c;介紹前端性能優化技巧。前端領域發展迅速&#xff0c;只有時刻掌握前端發展趨勢和技術動態&#xff0c;學習前沿的開發思想和理念才能讓自己跟上時代的步伐&#xff0c;保持自己的技術優勢。 您可能感興趣的相關文章…

mca終端_MCA的完整形式是什么?

mca終端1)MCA&#xff1a;計算機應用碩士 (1) MCA: Master of Computer Application) MCA is an abbreviation of Master of Computer Application. It is a masters degree program for post-graduation in Computer applications. This post-graduate course duration is abo…

鋼鐵俠java_現代版“鋼鐵俠”,無所不能的程序員,java工程師實現人造器官!...

一位名叫利亞姆澤貝迪(Liam Zebedee)的軟件工程師已經厭倦了糖尿病患者的生活挑戰&#xff0c;因此他決定入侵他的胰島素泵&#xff0c;并將其轉變成一種嶄新的高科技胰腺胰腺。Zebedee詳細介紹了查找和訂購零件的過程&#xff0c;為智能胰島素泵編寫軟件的代碼以及在其博客中組…

Windows下的Memcache安裝 (轉)

Windows下的Memcache安裝&#xff1a;1. 下載memcache的windows穩定版&#xff0c;解壓放某個盤下面&#xff0c;比如在c:\memcached2. 在終端&#xff08;也即cmd命令界面&#xff09;下輸入 ‘c:\memcached\memcached.exe -d install’ 安裝3. 再輸入&#xff1a; ‘c:\memca…

C#中實現js中的eval函數功能

在js中有eval函數&#xff0c;比如 eval&#xff08;‘33*4’&#xff09;結果為15&#xff1b; 但C#中想要完成這樣的功能&#xff0c;卻沒有相應的函數&#xff0c;可以用sql語句的方式實現&#xff0c;比如&#xff0c;執行 select 33*4 的方式。 可以先構造公式 Formula …

查看照片的指定位置的像素點值,并在照片中繪制一條指定像素顏色的線段

查看照片的指定位置的像素點值&#xff0c;并在照片中繪制一條指定像素的線段 import cv2 img cv2.imread(E:\Python-workspace\OpenCV\yanyu/beyond.png,1)#1為彩色圖片&#xff0c;0為灰度圖片 (b,g,r) img[20,20]#取照片的(20,20)處的像素點&#xff0c;左上角為(0,0)&am…

大數據和云計算涉及的技術_云計算涉及的風險

大數據和云計算涉及的技術In todays life using of cloud is very common among people, we use different clouds like Google cloud, cloud Azure etc. to store our photos, Videos, documents, data etc. to save space as well as we think that we will be able to retri…

int 轉interger java_Java中Integer和int之間的轉換

int到Integer:int a3;Integer Anew Integer(a);或:Integer AInteger.valueOf(a);Integer到int:Integer Anew Integer(5);int aA.intValue();至于Integer.parseInt(String str)則是將String類型轉為int類型。int類型是放在棧空間的&#xff0c;Integer是作為對象放在堆空間的;in…