RTSP簡介
RTSP(Real Time Streaming Protocol)是由Real Network和Netscape共同提出的如何有效地在IP網絡上傳輸流媒體數據的應用層協議。RTSP對流媒體提供了諸如暫停,快進等控制,而它本身並不傳輸數據,RTSP的作用相當於流媒體服務器的遠程控制。服務器端可以自行選擇使用TCP或UDP來傳送串流內容,它的語法和運作跟HTTP 1.1類似,但並不特別強調時間同步,所以比較能容忍網絡延遲。
RTSP和HTTP RTP(RTCP)的關系
RTSP和HTTP
- 聯系:兩者都用純文本來發送消息,且rtsp協議的語法也和HTTP類似。Rtsp一開始這樣設計,也是為了能夠兼容使用以前寫的HTTP協議分析代碼 。
- 區別:rtsp是有狀態的,不同的是RTSP的命令需要知道現在正處於一個什么狀態,也就是說rtsp的命令總是按照順序來發送,某個命令總在另外一個命令之前要發送。Rtsp不管處於什么狀態都不會斷掉連接。而http則不保存狀態,協議在發送一個命令以后,連接就會斷開,且命令之間是沒有依賴性。rtsp協議使用554端口,http使用80端口。
RTSP和RTP(RTCP)
- RTP:Realtime Transport Potocol 實時傳輸協議
RTP提供時間標志,序列號以及其他能夠保證在實時數據傳輸時處理時間的方法。 - RTCP:Realtime Transport Control Potocol 實時傳輸控制協議
RTCP是RTP的控制部分,用來保證服務質量和成員管理。RTP和RTCP是一起使用的。 - RTSP:RealTime Streaming Potocol 實時流協議
RTSP具體數據傳輸交給RTP,提供對流的遠程控制
RTP是基於 UDP協議的, UDP不用建立連接,效率更高;但允許丟包, 這就要求在重新組裝媒體的時候多做些工作
RTP只是包裹內容信息,而RTCP是交換控制信息的,Qos是通過RTCP實現的
應用程序對應的是play, seek, pause, stop等命令,RTSP則是處理這些命令,在UDP傳輸時並使用RTP(RTCP)來完成。如果是TCP連接則不會使用RTP(RTCP)。
RTSP的client連接server通過SDP(會話描述協議)傳遞信息,詳細請見:RTSP消息
RTSP消息
RTSP的消息有兩大類,一是請求消息(request),一是回應消息(response),兩種消息的格式不同。
請求消息格式:
方法 URI RTSP版本 CR LF
消息頭 CR LF CR LF
消息體 CR LF
方法包括:OPTIONS、SETUP、PLAY、TEARDOWN DESCRIBE
URI是接收方(服務端)的地址,例如:rtsp://192.168.22.136:5000/v0
每行后面的CR LF表示回車換行,需要接收端有相應的解析,消息頭需要有兩個CR LF。
DESCRIBE rtsp://192.168.1.211 RTSP/1.0 CSeq: 1 Accept: application/sdp User-Agent: magnus-fc
回應消息格式:
RTSP版本 狀態碼 解釋 CR LF
消息頭 CR LF CR LF
消息體 CR LF
其中RTSP版本一般都是RTSP/1.0,狀態碼是一個數值,200表示成功,解釋是與狀態碼對應的文本解釋,詳細請見:SDP協議介紹。
RTSP/1.0 200 OK
CSeq: 1
Server: GrandStream Rtsp Server V100R001
Content-Type: application/sdp
Content-length: 256
Content-Base: rtsp://192.168.1.211/0
v=0 o=StreamingServer 3331435948 1116907222000 IN IP4 192.168.1.211 s=h264.mp4 c=IN IP4 0.0.0.0 t=0 0 a=control:* m=video 0 RTP/AVP 96 a=control:trackID=0 a=rtpmap:96 H264/90000 m=audio 0 RTP/AVP 97 a=control:trackID=1 a=rtpmap:97 G726-16/8000
簡單的rtsp交互過程:
C表示rtsp客戶端, S表示rtsp服務端
step1:
C->S:OPTION request //詢問S有哪些方法可用
S->C:OPTION response //S回應信息中包括提供的所有可用方法step2:
C->S:DESCRIBE request //要求得到S提供的媒體初始化描述信息
S->C:DESCRIBE response //S回應媒體初始化描述信息,主要是sdpstep3:
C->S:SETUP request //設置會話的屬性,以及傳輸模式,提醒S建立會話
S->C:SETUP response //S建立會話,返回會話標識符,以及會話相關信息step4:
C->S:PLAY request //C請求播放
S->C:PLAY response //S回應該請求的信息S->C:發送流媒體數據
step5:
C->S:TEARDOWN request //C請求關閉會話
S->C:TEARDOWN response //S回應該請求
RTSP中常用方法
OPTION
得到服務器提供的可用方法
OPTIONS rtsp://192.168.20.136:5000/xxx666 RTSP/1.0 CSeq: 1 //每個消息都有序號來標記,第一個包通常是option請求消息 User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
服務器的回應信息包括提供的一些方法,例如:
RTSP/1.0 200 OK Server: UServer 0.9.7_rc1 Cseq: 1 //每個回應消息的cseq數值和請求消息的cseq相對應 Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, SCALE,GET_PARAMETER //服務器提供的可用的方法
DESCRIBE
C向S發起DESCRIBE請求,為了得到會話描述信息(SDP):
DESCRIBE rtsp://192.168.20.136:5000/xxx666 RTSP/1.0 CSeq: 2 token: Accept: application/sdp User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
服務器回應一些對此會話的描述信息(sdp):
RTSP/1.0 200 OK Server: UServer 0.9.7_rc1 Cseq: 2 x-prev-url: rtsp://192.168.20.136:5000 x-next-url: rtsp://192.168.20.136:5000 x-Accept-Retransmit: our-retransmit x-Accept-Dynamic-Rate: 1 Cache-Control: must-revalidate Last-Modified: Fri, 10 Nov 2006 12:34:38 GMT Date: Fri, 10 Nov 2006 12:34:38 GMT Expires: Fri, 10 Nov 2006 12:34:38 GMT Content-Base: rtsp://192.168.20.136:5000/xxx666/ Content-Length: 344 Content-Type: application/sdp v=0 //以下都是sdp信息 o=OnewaveUServerNG 1451516402 1025358037 IN IP4 192.168.20.136 s=/xxx666 u=http:/// e=admin@ c=IN IP4 0.0.0.0 t=0 0 a=isma-compliance:1,1.0,1 a=range:npt=0- m=video 0 RTP/AVP 96 //m表示媒體描述,下面是對會話中視頻通道的媒體描述 a=rtpmap:96 MP4V-ES/90000 a=fmtp:96 profile-level-id=245;config=000001B0F5000001B509000001000000012000C888B0E0E0FA62D089028307 a=control:trackID=0 //trackID=0表示視頻流用的是通道0
SETUP
客戶端提醒服務器建立會話,並確定傳輸模式:
SETUP rtsp://192.168.20.136:5000/xxx666/trackID=0 RTSP/1.0 CSeq: 3 Transport: RTP/AVP/TCP;unicast;interleaved=0-1 User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10) //uri中 帶有trackID=0,表示對該通道進行設置。Transport參數設置了傳輸模式,包的結構。接下來的數據包頭部第二個字節位置就是 interleaved,它的值是每個通道都不同的,trackID=0的interleaved值有兩個0或1,0表示rtp包,1表示rtcp包,接收端根據interleaved的值來區別是哪種數據包。
服務器回應信息:
RTSP/1.0 200 OK Server: UServer 0.9.7_rc1 Cseq: 3 Session: 6310936469860791894 //服務器回應的會話標識符 Cache-Control: no-cache Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=6B8B4567
PLAY
客戶端發送播放請求:
PLAY rtsp://192.168.20.136:5000/xxx666 RTSP/1.0 CSeq: 4 Session: 6310936469860791894 Range: npt=0.000- //設置播放時間的范圍 User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
服務器回應信息:
RTSP/1.0 200 OK Server: UServer 0.9.7_rc1 Cseq: 4 Session: 6310936469860791894 Range: npt=0.000000- RTP-Info: url=trackID=0;seq=17040;rtptime=1467265309 //seq和rtptime都是rtp包中的信息
TEARDOWN
客戶端發起關閉請求:
TEARDOWN rtsp://192.168.20.136:5000/xxx666 RTSP/1.0 CSeq: 5 Session: 6310936469860791894 User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
服務器回應:
RTSP/1.0 200 OK Server: UServer 0.9.7_rc1 Cseq: 5 Session: 6310936469860791894
SDP協議
sdp的格式:
v=<version> o=<username> <session id> <version> <network type> <address type> <address> s=<session name> i=<session description> u=<URI> e=<email address> p=<phone number> c=<network type> <address type> <connection address> b=<modifier>:<bandwidth-value> t=<start time> <stop time> r=<repeat interval> <active duration> <list of offsets from start-time> z=<adjustment time> <offset> <adjustment time> <offset> .... k=<method> k=<method>:<encryption key> a=<attribute> a=<attribute>:<value> m=<media> <port> <transport> <fmt list>
v = (協議版本)
o = (所有者/創建者和會話標識符)
s = (會話名稱)
i = * (會話信息)
u = * (URI 描述)
e = * (Email 地址)
p = * (電話號碼)
c = * (連接信息)
b = * (帶寬信息)
z = * (時間區域調整)
k = * (加密密鑰)
a = * (0 個或多個會話屬性行)
-
時間描述:
t = (會話活動時間)
r = * (0或多次重復次數) -
媒體描述:
m = (媒體名稱和傳輸地址)
i = * (媒體標題)
c = * (連接信息 — 如果包含在會話層則該字段可選)
b = * (帶寬信息)
k = * (加密密鑰)
a = * (0 個或多個媒體屬性行)
SDP一會話描述協議一描述SAP、SIP和RTSR會話的協議,是一種文件描述協議,是由服務器生成的描述媒體文件編碼信息以及所在服務器的鏈接等的信息。在多媒體會話 中sDP傳送有關媒體流的信息,使會話描述的參人方加人會話。SDP主要用於Intemet網中,但也可以在其它網絡環境下使用。SDP十分通用,可描述其它網絡環境中的會話,但主要用 於Intemet中。在Intemet環境下,SDP有兩個主要目的:一是表明會話存在,二是傳送足夠信息給接收方,以便能加人、參加該會話。SDP所傳達的信息包括:會話名稱和目的,會話 活動時間,組成會話媒體種類,接收這些媒體的控制信息(如地址、端口、格式、帶寬和會議管理人員資料等)。
總結:在RTSP交互過程中,只要在客戶端發出Describe請求的時候,服務端回應的時候會有SDP消息發出,用SDP來描述會話情況和內容,方便客戶端能夠加入該會話。