一個基於JRTPLIB的輕量級RTSP客戶端(myRTSPClient)——收流篇:(三)RTSP命令解析


一、RTSP命令簡述

RTSP是用來控制實時流媒體“播放”、“暫停”、“停止”、“錄像”等行為的傳輸協議。該協議規定了一系列命令以及這些命令的發送格式,RTSP客戶端可以通過發送這些指定的命令,從而控制媒體流數據的傳輸。rfc2326上明確指定的有以下11個命令:DESCRIBE, ANNOUNCE, GET_PARAMETER, OPTIONS, PAUSE, PLAY, RECORD, REDIRECT, SETUP, SET_PARAMETER, TEARDOWN。要完成基本的視頻流傳輸,至少需要4個命令:DESCRIBE, SETUP, PLAY, TEARDOWN,而myRTSPClient中的example就是以這4個命令展開的,講完了這4個命令,那我們的example程序也就基本講完了。

我們現在就先來看看這4個命令是如何實現客戶端與服務端之間的交互的。

(詳細敘述可以參考:http://www.cnblogs.com/qq78292959/archive/2010/08/12/2077039.html) 

 

二、DESCRIBE、SETUP、PLAY、TEARDOWN

客戶端在發送這些命令的過程中,最關鍵的一個元素就是RTSP服務端的URI,在說明以下命令的過程中,我們假設RTSP服務端的URI為:rtsp://127.0.0.1/ansersion

1. DECRIBE

命令名稱:DESCRIBE

命令作用:請求SDP

命令格式:

DESCRIBE<BLANK><RTSP URI><BLANK>RTSP/<RTSP VERSION>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n\r\n

(Note:<BLANK>:空格;<COMMAND SEQUENCE>:命令序列,每一次發送命令該數字加1)

命令示例:

DESCRIBE rtsp://127.0.0.1/ansersion RTSP/1.0
CSeq: 1

 

(Note:雖然看不見,但示例中最后是有空行的,必不可少哦!看看“命令格式”最后連着兩個"\r\n"你就明白了。空行(\r\n)是RTSP數據包的結束標識。)

服務端返回信息格式:

RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n<OTHER>\r\n\r\n<SDP>

(Note:<OTHER>: 其他描述信息;<SDP>: SDP描述信息,SDP不屬於RTSP的打包數據,這里可以看到空行(\r\n)在SDP之前)

服務端返回信息示例:

RTSP/1.0 200 OK
CSeq: 1
Date: Sun, Dec 27 2015 02:16:50 GMT
Content-Base: rtsp://127.0.0.1/ansersion/
Content-Type: application/sdp
Content-Length: 510

v=0
o=- 1451182595570866 1 IN IP4 192.168.81.145
s=Session streamed by "testOnDemandRTSPServer"
i=ansersion
t=0 0
a=tool:LIVE555 Streaming Media v2015.11.09
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:Session streamed by "testOnDemandRTSPServer"
a=x-qt-text-inf:ansersion
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:500
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=4D4033;sprop-parameter-sets=Z01AM5JUDAS0IAAAAwBAAAAM0eMGVA==,aO48gA==
a=control:track1

Note:以RTSP客戶端的角度,以上紅字部分信息必須理解。

首先是"RTSP/1.0 200 OK",這個表示RTSP服務端成功受理客戶端的請求。

再者是“m=video 0 RTP/AVP 96”,該信息指出了RTSP客戶端提供傳輸的流媒體類型,“a=control:track1”指出了訪問該流媒體的方式,是后續SETUP命令的重要參數,這是一個簡化的版本,有時候服務端會返回完整版本:“a=control:rtsp://127.0.0.1/ansersion/track1”。

最后是“Z01AM5JUDAS0IAAAAwBAAAAM0eMGVA==”和“aO48gA==”,這是H264的SPS和PPS的Base64編碼。老實說,要讓RTSP客戶端去考慮具體編碼格式的問題,着實是一個設計上的瑕疵。后續我打算把這部分改掉,現在我們將其看作H264的重要參數即可)

 

2. SETUP

命令名稱:SETUP

命令作用:建立流媒體會話,告知RTSP服務端准備資源,以待后續進一步操作(比如“PLAY”)

命令格式:

SETUP<BLANK><RTSP URI>/<SDP ATTRIBUTE CONTROL>RTSP/<RTSP VERSION>\r\nTransport:<BLANK><PROTOCOL>;<CAST METHOD>;client_port=<RTP PORT>-<RTCP PORT>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n\r\n

(Note:<SDP ATTRIBUTE CONTROL>:SDP中“a=control:track1”;<PROTOCOL>:實時流傳輸協議,一般為RTP+UDP;<CAST METHOD>:傳輸方式,單播或組播;)

命令示例:

SETUP rtsp://127.0.0.1/ansersion/track1 RTSP/1.0
Transport: RTP/AVP/UDP;unicast;client_port=10330-10331
CSeq: 2

 

(Note:使用RTP傳輸(RTP/AVP/UDP),傳輸方式為單播(unicast),RTP和RTCP的端口號分別為10330和10331(client_port=10330-10331))

服務端返回信息格式:

RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n<OTHER>\r\n<SESSION ID>\r\n\r\n

(Note:<SESSION ID>:服務端建立好資源后,通過該標識訪問其媒體流資源。)

服務端返回信息示例:

RTSP/1.0 200 OK
CSeq: 2
Date: Sun, Dec 27 2015 02:28:01 GMT
Transport: RTP/AVP;unicast;destination=127.0.0.1;source=127.0.0.1;client_port=10330-10331;server_port=6970-6971
Session: ABF519D9;timeout=65

 

(Note:其中“ABF519D9”為SESSION ID,PLAY命令以此為參數,告知服務端以SETUP命令中指定的方式(RTP、unicast、client_port=10330-10331)進行媒體流傳輸)

 

3. PLAY

命令名稱:PLAY

命令作用:告知服務端開始傳輸媒體流

命令格式:

PLAY<BLANK><RTSP URI>RTSP/<RTSP VERSION>\r\nCSeq:<BLANK><COMMAND SEQUENCE>Session:<BLANK><SESSION ID>\r\n\r\n

命令示例:

PLAY rtsp://127.0.0.1/ansersion RTSP/1.0
CSeq: 3
Session: ABF519D9

 

(Note:“ABF519D9”為SETUP返回信息中指定的ID)

服務端返回信息格式:

RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n<OTHER>\r\n\r\n

服務端返回信息示例:

RTSP/1.0 200 OK
CSeq: 3
Date: Sun, Dec 27 2015 02:28:01 GMT
Range: npt=0.000-
Session: ABF519D9
RTP-Info: url=rtsp://127.0.0.1/ansersion/track1;seq=35825;rtptime=3103868658

  

(Note:服務端受理PLAY命令之后,就會有媒體流數據向客戶端發送過來了。依照SETUP中的傳輸方式,媒體流會通過RTP/UDP封包發送至客戶端的10330端口)

 

4. TEARDOWN

命令名稱:TEARDOWN

命令作用:取消會話,告知服務端停止繼續發包,並銷毀相關資源。

命令格式:

TEARDOWN<BLANK><RTSP URI>RTSP/<RTSP VERSION>\r\nCSeq:<BLANK><COMMAND SEQUENCE>Session:<BLANK><SESSION ID>\r\n\r\n

命令示例:

TEARDOWN rtsp://127.0.0.1/ansersion RTSP/1.0
CSeq: 4
Session: ABF519D9

 

服務端返回信息格式:

RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n<OTHER>\r\n\r\n

服務端返回信息示例:

RTSP/1.0 200 OK
CSeq: 4
Date: Sun, Dec 27 2015 02:17:29 GMT

  

(Note:服務端受理TEARDOWN命令之后,服務端就不會再發送數據“騷擾”客戶端了。)

 

三、附錄

以下是一份截獲的網絡數據包,可使用wireshark打開,以供參考。

http://pan.baidu.com/s/1gfae1wv

 

上一篇     回目錄    下一篇


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM