前言為什么要寫這個系列? 因為我自己在學(xué)習(xí)rtsp協(xié)議想自己從零寫一個rtsp服務(wù)器的時候,由于rtsp比較復(fù)雜,所以覺得這個過程非常的困難,網(wǎng)上許多相關(guān)文章或模棱兩可,或是復(fù)制粘貼。所以想寫這樣一個系列,來幫助想要學(xué)習(xí)rtsp協(xié)議或者想要從零寫一個rtsp服務(wù)器的初學(xué)者 本系列的文章特點 并系列文章實現(xiàn)追求精簡,能夠讓人明白rtsp協(xié)議的實現(xiàn)過程,不追求復(fù)雜和完美 如果想要實現(xiàn)一個比較完善的rtsp服務(wù)器,可以參考我的開源項目-RtspServer
言歸正傳,下面開始本系列的文章 一、什么是RTSP協(xié)議?RTSP是一個實時傳輸流協(xié)議,是一個應(yīng)用層的協(xié)議 通常說的RTSP包括RTSP協(xié)議 、RTP協(xié)議 、RTCP協(xié)議 對于這些協(xié)議的作用簡單的理解如下 RTSP協(xié)議:負責(zé)服務(wù)器與客戶端之間的請求與響應(yīng) RTP協(xié)議:負責(zé)傳輸媒體數(shù)據(jù) RTCP協(xié)議:在RTP傳輸過程中提供傳輸信息 rtsp承載與rtp和rtcp之上,rtsp并不會發(fā)送媒體數(shù)據(jù),而是使用rtp協(xié)議傳輸 rtp并沒有規(guī)定發(fā)送方式,可以選擇udp發(fā)送或者tcp發(fā)送 二、RTSP協(xié)議詳解rtsp的交互過程就是客戶端請求,服務(wù)器響應(yīng),下面看一看請求和響應(yīng)的數(shù)據(jù)格式 2.1 RTSP數(shù)據(jù)格式RTSP協(xié)議格式與HTTP協(xié)議格式類似 RTSP客戶端的請求格式 method url vesion\r\n
CSeq: x\r\n
xxx\r\n
...
\r\n method:方法,表明這次請求的方法,rtsp定義了很多方法,稍后介紹 url:格式一般為rtsp://ip:port/session ,ip表主機ip,port表端口好,如果不寫那么就是默認端口,rtsp的默認端口為554 ,session表明請求哪一個會話 version:表示rtsp的版本,現(xiàn)在為RTSP/1.0 CSeq:序列號,每個RTSP請求和響應(yīng)都對應(yīng)一個序列號,序列號是遞增的 RTSP服務(wù)端的響應(yīng)格式 vesion 200 OK\r\n
CSeq: x\r\n
xxx\r\n
...
\r\n version:表示rtsp的版本,現(xiàn)在為RTSP/1.0 CSeq:序列號,這個必須與對應(yīng)請求的序列號相同
2.2 RTSP請求的常用方法方法 | 描述 |
---|
OPTIONS | 獲取服務(wù)端提供的可用方法 | DESCRIBE | 向服務(wù)端獲取對應(yīng)會話的媒體描述信息 | SETUP | 向服務(wù)端發(fā)起建立請求,建立連接會話 | PLAY | 向服務(wù)端發(fā)起播放請求 | TEARDOWN | 向服務(wù)端發(fā)起關(guān)閉連接會話請求 |
2.3 RTSP交互過程有了上述的知識,我們下面來講解一個RTSP的交互過程 OPTIONS C–>S OPTIONS rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 2\r\n
\r\n 客戶端向服務(wù)器請求可用方法 S–>C RTSP/1.0 200 OK\r\n
CSeq: 2\r\n
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY\r\n
\r\n 服務(wù)端回復(fù)客戶端,當(dāng)前可用方法OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY
DESCRIBE C–>S DESCRIBE rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 3\r\n
Accept: application/sdp\r\n
\r\n 客戶端向服務(wù)器請求媒體描述文件,格式為sdp S–>C RTSP/1.0 200 OK\r\n
CSeq: 3\r\n
Content-length: 146\r\n
Content-type: application/sdp\r\n
\r\n
v=0\r\n
o=- 91565340853 1 in IP4 192.168.31.115\r\n
t=0 0\r\n
a=contol:*\r\n
m=video 0 RTP/AVP 96\r\n
a=rtpmap:96 H264/90000\r\n
a=framerate:25\r\n
a=control:track0\r\n 服務(wù)器回復(fù)了sdp文件,這個文件告訴客戶端當(dāng)前服務(wù)器有哪些音視頻流,有什么屬性,具體稍后再講解 這里只需要直到客戶端可以根據(jù)這些信息得知有哪些音視頻流可以發(fā)送
SETUP C–>S SETUP rtsp://192.168.31.115:8554/live/track0 RTSP/1.0\r\n
CSeq: 4\r\n
Transport: RTP/AVP;unicast;client_port=54492-54493\r\n
\r\n 客戶端發(fā)送建立請求,請求建立連接會話,準(zhǔn)備接收音視頻數(shù)據(jù) 解析一下Transport: RTP/AVP;unicast;client_port=54492-54493\r\n RTP/AVP:表示RTP通過UDP發(fā)送,如果是RTP/AVP/TCP則表示RTP通過TCP發(fā)送 unicast:表示單播,如果是multicast則表示多播 client_port=54492-54493:由于這里希望采用的是RTP OVER UDP,所以客戶端發(fā)送了兩個用于傳輸數(shù)據(jù)的端口,客戶端已經(jīng)將這兩個端口綁定到兩個udp套接字上,54492 表示是RTP端口,54493 表示RTCP端口(RTP端口為某個偶數(shù),RTCP端口為RTP端口+1) S–>C RTSP/1.0 200 OK\r\n
CSeq: 4\r\n
Transport: RTP/AVP;unicast;client_port=54492-54493;server_port=56400-56401\r\n
Session: 66334873\r\n
\r\n 服務(wù)端接收到請求之后,得知客戶端要求采用RTP OVER UDP 發(fā)送數(shù)據(jù),單播 ,客戶端 用于傳輸RTP 數(shù)據(jù)的端口為54492 ,RTCP的端口為54493 服務(wù)器也有兩個udp套接字 ,綁定好兩個端口,一個用于傳輸RTP,一個用于傳輸RTCP,這里的端口號為56400-56401 之后客戶端會使用54492-54493 這兩端口和服務(wù)器通過udp傳輸數(shù)據(jù),服務(wù)器會使用56400-56401 這兩端口和這個客戶端傳輸數(shù)據(jù)
PLAY C–>S PLAY rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 5\r\n
Session: 66334873\r\n
Range: npt=0.000-\r\n
\r\n 客戶端請求播放媒體 S–>C RTSP/1.0 200 OK\r\n
CSeq: 5\r\n
Range: npt=0.000-\r\n
Session: 66334873; timeout=60\r\n
\r\n 服務(wù)器回復(fù)之后,會開始使用RTP通過udp向客戶端的54492端口發(fā)送數(shù)據(jù)
TEARDOWN 2.4 sdp格式我們上面避開沒有講sdp文件,這里來好好補一補 sdp格式由多行的type=value 組成 sdp會話描述 由一個會話級描述 和多個媒體級描述 組成。會話級描述的作用域是整個會話,媒體級描述描述的是一個視頻流或者音頻流
會話級描述 由v= 開始到第一個媒體級描述結(jié)束
媒體級描述 由m= 開始到下一個媒體級描述結(jié)束
下面是上面示例的sdp文件,我們就來好好分析一下這個sdp文件 v=0\r\n
o=- 91565340853 1 in IP4 192.168.31.115\r\n
t=0 0\r\n
a=contol:*\r\n
m=video 0 RTP/AVP 96\r\n
a=rtpmap:96 H264/90000\r\n
a=framerate:25\r\n
a=control:track0\r\n 這個示例的sdp文件包含一個會話級描述 和一個媒體級描述 ,分別如下 會話級描述 v=0\r\n
o=- 91565340853 1 IN IP4 192.168.31.115\r\n
t=0 0\r\n
a=contol:*\r\n v=0 表示sdp的版本 o=- 91565340853 1 IN IP4 192.168.31.115 格式為 o=<用戶名> <會話id> <會話版本> <網(wǎng)絡(luò)類型><地址類型> <地址> 用戶名:- 會話id:91565340853,表示rtsp://192.168.31.115:8554/live請求中的live這個會話 會話版本:1 網(wǎng)絡(luò)類型:IN,表示internet 地址類型:IP4,表示ipv4 地址:192.168.31.115,表示服務(wù)器的地址 媒體級描述 m=video 0 RTP/AVP 96\r\n
a=rtpmap:96 H264/90000\r\n
a=framerate:25\r\n
a=control:track0\r\n m=video 0 RTP/AVP 96\r\n 格式為 m=<媒體類型> <端口號> <傳輸協(xié)議> <媒體格式 > 媒體類型:video 端口號:0,為什么是0?因為上面在SETUP 過程會告知端口號,所以這里就不需要了 傳輸協(xié)議:RTP/AVP,表示RTP OVER UDP,如果是RTP/AVP/TCP,表示RTP OVER TCP 媒體格式:表示負載類型(payload type),一般使用96表示H.264 a=rtpmap:96 H264/90000 格式為a=rtpmap:<媒體格式><編碼格式>/<時鐘頻率> a=framerate:25 表示幀率 a=control:track0 表示這路視頻流在這個會話中的編號
三、RTP協(xié)議3.1 RTP包格式rtp包由rtp頭部和rtp荷載構(gòu)成 版本號(V):2Bit,用來標(biāo)志使用RTP版本 填充位§:1Bit,如果該位置位,則該RTP包的尾部就包含填充的附加字節(jié) 擴展位(X):1Bit,如果該位置位,則該RTP包的固定頭部后面就跟著一個擴展頭部 CSRC技術(shù)器(CC):4Bit,含有固定頭部后面跟著的CSRC的數(shù)據(jù) 標(biāo)記位(M):1Bit,該位的解釋由配置文檔來承擔(dān) 載荷類型(PT):7Bit,標(biāo)識了RTP載荷的類型 序列號(SN):16Bit,發(fā)送方在每發(fā)送完一個RTP包后就將該域的值增加1,可以由該域檢測包的丟失及恢復(fù) 包的序列。序列號的初始值是隨機的 時間戳:32比特,記錄了該包中數(shù)據(jù)的第一個字節(jié)的采樣時刻 同步源標(biāo)識符(SSRC):32比特,同步源就是RTP包源的來源。在同一個RTP會話中不能有兩個相同的SSRC值 貢獻源列表(CSRC List):0-15項,每項32比特,這個不常用 rtp荷載 rtp載荷為音頻或者視頻數(shù)據(jù)
3.2 RTP OVER TCPRTP默認是采用UDP發(fā)送的,格式為RTP頭+RTP載荷,如果是使用TCP,那么需要在RTP頭之前再加上四個字節(jié) 第一個字節(jié):$,辨識符 第二個字節(jié):通道,在SETUP的過程中獲取 第三第四個字節(jié): RTP包的大小,最多只能12位,第三個字節(jié)保存高4位,第四個字節(jié)保存低8位 四、RTCPRTCP用于在RTP傳輸過程中提供傳輸信息,可以報道RTP傳輸情況,還可以用來音視頻同步,這里就不詳細講解了
|