RTSP(Real-Time Stream Protocol)協議是一個基於文本的多媒體播放控制協議,屬於應用層。RTSP以客戶端方式工做,對流媒體提供播放、暫停、後退、前進等操做。該標準由IETF指定,對應的協議是RFC2326。服務器
RTSP做爲一個應用層協議,提供了一個可供擴展的框架,使得流媒體的受控和點播變得可能,它主要用來控制具備實時特性的數據的發送,但其自己並不用於傳送流媒體數據,而必須依賴下層傳輸協議(如RTP/RTCP)所提供的服務來完成流媒體數據的傳送。RTSP負責定義具體的控制信息、操做方法、狀態碼,以及描述與RTP之間的交互操做。RTSP媒體服務協議框架以下:網絡
客戶端要播放RTSP媒體流,就須要知道媒體源的URL,RTSP的URL格式通常以下:session
rtsp://host[:port]/[abs_path]/content_name
例如,一個完整的RTSP URL可寫爲:併發
rtsp://192.168.1.67:554/test
又如目前市面上經常使用的海康網絡攝像頭的RTSP地址格式爲:app
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
示例:框架
rtsp://admin:12345@192.168.1.67:554/h264/ch1/main/av_stream
rtsp://admin:12345@192.168.1.67/mpeg4/ch1/sub/av_stream
對RTSP協議的使用有了一個大概的瞭解以後,咱們來看一下RTSP報文結構。ide
RTSP是一種基於文本的協議,用CRLF(回車換行)做爲每一行的結束符,其好處是,在使用過程當中能夠方便地增長自定義參數,也方便抓包分析。從消息傳送方向上來分,RTSP的報文有兩類:請求報文和響應報文。請求報文是指從客戶端向服務器發送的請求(也有少許從服務器向客戶端發送的請求),響應報文是指從服務器到客戶端的迴應。測試
RTSP請求報文的經常使用方法與做用:ui
一次基本的RTSP交互過程以下,C表示客戶端,S表示服務端。url
首先客戶端鏈接到流媒體服務器併發送一個RTSP描述請求(DESCRIBE request),服務器經過一個SDP(Session DescriptionProtocol)描述來進行反饋(DESCRIBEresponse),反饋信息包括流數量、媒體類型等信息。客戶端分析該SDP描述,併爲會話中的每個流發送一個RTSP鏈接創建請求(SETUPrequest),該命令會告訴服務器用於接收媒體數據的端口,服務器響應該請求(SETUP response)並創建鏈接以後,就開始傳送媒體流(RTP包)到客戶端。在播放過程當中客戶端還能夠向服務器發送請求來控制快進、快退和暫停等。最後,客戶端可發送一個終止請求(TEARDOWN request)來結束流媒體會話。
下面咱們經過具體的消息實例來進一步瞭解一下RTSP的工做過程:
OPTIONS請求是客戶端向服務器詢問可用的方法,請求和回覆實例以下:
C->S: OPTIONS rtsp://example.com/media.mp4 RTSP/1.0 CSeq: 1 Require: implicit-play Proxy-Require: gzipped-messages S->C: RTSP/1.0 200 OK CSeq: 1 Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE
客戶端向服務器請求媒體資源描述,服務器端經過SDP(Session Description Protocol)格式迴應客戶端的請求。資源描述中會列出所請求媒體的媒體流及其相關信息,典型狀況下,音頻和視頻分別做爲一個媒體流傳輸。實例以下:
C->S: DESCRIBE rtsp://example.com/media.mp4 RTSP/1.0 CSeq: 2 S->C: RTSP/1.0 200 OK CSeq: 2 Content-Base: rtsp://example.com/media.mp4 Content-Type: application/sdp Content-Length: 460 m=video 0 RTP/AVP 96 a=control:streamid=0 a=range:npt=0-7.741000 a=length:npt=7.741000 a=rtpmap:96 MP4V-ES/5544 a=mimetype:string;"video/MP4V-ES" a=AvgBitRate:integer;304018 a=StreamName:string;"hinted video track" m=audio 0 RTP/AVP 97 a=control:streamid=1 a=range:npt=0-7.712000 a=length:npt=7.712000 a=rtpmap:97 mpeg4-generic/32000/2 a=mimetype:string;"audio/mpeg4-generic" a=AvgBitRate:integer;65790 a=StreamName:string;"hinted audio track"
SETUP請求肯定了具體的媒體流如何傳輸,該請求必須在PLAY請求以前發送。SETUP請求包含媒體流的URL和客戶端用於接收RTP數據(audio or video)的端口以及接收RTCP數據(meta information)的端口。服務器端的回覆一般包含客戶端請求參數的確認,並會補充缺失的部分,好比服務器選擇的發送端口。每個媒體流在發送PLAY請求以前,都要首先經過SETUP請求來進行相應的配置。
C->S: SETUP rtsp://example.com/media.mp4/streamid=0 RTSP/1.0 CSeq: 3 Transport: RTP/AVP;unicast;client_port=8000-8001 S->C: RTSP/1.0 200 OK CSeq: 3 Transport: RTP/AVP;unicast;client_port=8000-8001;server_port=9000-9001;ssrc=1234ABCD Session: 12345678
客戶端經過PLAY請求來播放一個或所有媒體流,PLAY請求能夠發送一次或屢次,發送一次時,URL爲包含全部媒體流的地址,發送屢次時,每一次請求攜帶的URL只包含一個相應的媒體流。PLAY請求中可指定播放的range,若未指定,則從媒體流的開始播放到結束,若是媒體流在播放過程當中被暫停,則可在暫停處從新啓動流的播放。
C->S: PLAY rtsp://example.com/media.mp4 RTSP/1.0 CSeq: 4 Range: npt=5-20 Session: 12345678 S->C: RTSP/1.0 200 OK CSeq: 4 Session: 12345678 RTP-Info: url=rtsp://example.com/media.mp4/streamid=0;seq=9810092;rtptime=3450012
PAUSE請求會暫停一個或全部媒體流,後續可經過PLAY請求恢復播放。PAUSE請求中攜帶所請求媒體流的URL,若參數range存在,則指明在何處暫停,若該參數不存在,則暫停當即生效,且暫停時長不肯定。
C->S: PAUSE rtsp://example.com/media.mp4 RTSP/1.0 CSeq: 5 Session: 12345678 S->C: RTSP/1.0 200 OK CSeq: 5 Session: 12345678
結束會話請求,該請求會中止全部媒體流,並釋放服務器上的相關會話數據。
C->S: TEARDOWN rtsp://example.com/media.mp4 RTSP/1.0 CSeq: 8 Session: 12345678 S->C: RTSP/1.0 200 OK CSeq: 8
檢索指定URI數據中的參數值。不攜帶消息體的GET_PARAMETER可用來測試服務器端或客戶端是否可通(相似ping的功能)。
S->C: GET_PARAMETER rtsp://example.com/media.mp4 RTSP/1.0 CSeq: 9 Content-Type: text/parameters Session: 12345678 Content-Length: 15 packets_received jitter C->S: RTSP/1.0 200 OK CSeq: 9 Content-Length: 46 Content-Type: text/parameters packets_received: 10 jitter: 0.3838
用於設置指定媒體流的參數。
C->S: SET_PARAMETER rtsp://example.com/media.mp4 RTSP/1.0 CSeq: 10 Content-length: 20 Content-type: text/parameters barparam: barstuff S->C: RTSP/1.0 451 Invalid Parameter CSeq: 10 Content-length: 10 Content-type: text/parameters barparam
重定向請求,用於服務器通知客戶端新的服務地址,客戶端須要向這個新地址從新發起請求。重定向請求中可能包含Range參數,指明重定向生效的時間。客戶端若需向新服務地址發起請求,必須先teardown當前會話,再向指定的新主機setup一個新的會話。
S->C: REDIRECT rtsp://example.com/media.mp4 RTSP/1.0 CSeq: 11 Location: rtsp://bigserver.com:8001 Range: clock=19960213T143205
ANNOUNCE請求有兩個用途:(1)C->S:客戶端向服務器端發佈URL指定的媒體信息描述;(2) S->C:實時更新對話描述。若媒體表示中新增了一個媒體流,例如在直播過程當中,則整個媒體表示的description都要被從新發送,而不是隻發送新增部分。
C->S: ANNOUNCE rtsp://example.com/media.mp4 RTSP/1.0 CSeq: 7 Date: 23 Jan 1997 15:35:06 GMT Session: 12345678 Content-Type: application/sdp Content-Length: 332 v=0 o=mhandley 2890844526 2890845468 IN IP4 126.16.64.4 s=SDP Seminar i=A Seminar on the session description protocol u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps e=mjh@isi.edu (Mark Handley) c=IN IP4 224.2.17.12/127 t=2873397496 2873404696 a=recvonly m=audio 3456 RTP/AVP 0 m=video 2232 RTP/AVP 31 S->C: RTSP/1.0 200 OK CSeq: 7
請求錄製指定範圍的媒體數據,請求中可指定錄製的起止時間戳;若未指定時間範圍,則使用presentation description中的開始和結束時間,這種狀況下,若是會話已開始,則當即啓動錄製操做。
C->S: RECORD rtsp://example.com/media.mp4 RTSP/1.0 CSeq: 6 Session: 12345678 S->C: RTSP/1.0 200 OK CSeq: 6 Session: 12345678
以上就是RTSP中經常使用的命令及其實例介紹。最後,來看一段實際使用的RTSP命令交互過程,該過程是經過PC對海康攝像頭視頻流的拉取和播放,並經過Wireshark抓取客戶端的數據獲得的:
OPTIONS rtsp://10.3.8.202:554 RTSP/1.0 CSeq: 2 User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22) RTSP/1.0 200 OK CSeq: 2 Public: OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER Date: Mon, Jan 29 2018 16:56:47 GMT DESCRIBE rtsp://10.3.8.202:554 RTSP/1.0 CSeq: 3 User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22) Accept: application/sdp RTSP/1.0 401 Unauthorized CSeq: 3 WWW-Authenticate: Digest realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", stale="FALSE" Date: Mon, Jan 29 2018 16:56:47 GMT DESCRIBE rtsp://10.3.8.202:554 RTSP/1.0 CSeq: 4 Authorization: Digest username="admin", realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554", response="3fc4b15d7a923fc36f32897e3cee69aa" User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22) Accept: application/sdp RTSP/1.0 200 OK CSeq: 4 Content-Type: application/sdp Content-Base: rtsp://10.3.8.202:554/ Content-Length: 551 v=0 o=- 1517245007527432 1517245007527432 IN IP4 10.3.8.202 s=Media Presentation e=NONE b=AS:5050 t=0 0 a=control:rtsp://10.3.8.202:554/ m=video 0 RTP/AVP 96 c=IN IP4 0.0.0.0 b=AS:5000 a=recvonly a=x-dimensions:2048,1536 a=control:rtsp://10.3.8.202:554/trackID=1 a=rtpmap:96 H264/90000 a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z00AMp2oCAAwabgICAoAAAMAAgAAAwBlCA==,aO48gA== a=Media_header:MEDIAINFO=494D4B48010200000400000100000000000000000000000000000000000000000000000000000000; a=appversion:1.0 SETUP rtsp://10.3.8.202:554/trackID=1 RTSP/1.0 CSeq: 5 Authorization: Digest username="admin", realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554/", response="ddfbf3e268ae954979407369a104a620" User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22) Transport: RTP/AVP;unicast;client_port=57844-57845 RTSP/1.0 200 OK CSeq: 5 Session: 1273222592;timeout=60 Transport: RTP/AVP;unicast;client_port=57844-57845;server_port=8218-8219;ssrc=5181c73a;mode="play" Date: Mon, Jan 29 2018 16:56:47 GMT PLAY rtsp://10.3.8.202:554/ RTSP/1.0 CSeq: 6 Authorization: Digest username="admin", realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554/", response="b5abf0b230de4b49d6c6d42569f88e91" User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22) Session: 1273222592 Range: npt=0.000- RTSP/1.0 200 OK CSeq: 6 Session: 1273222592 RTP-Info: url=rtsp://10.3.8.202:554/trackID=1;seq=65373;rtptime=3566398668 Date: Mon, Jan 29 2018 16:56:47 GMT GET_PARAMETER rtsp://10.3.8.202:554/ RTSP/1.0 CSeq: 7 Authorization: Digest username="admin", realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554/", response="bb2309dcd083b25991c13e165673687b" User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22) Session: 1273222592 RTSP/1.0 200 OK CSeq: 7 Date: Mon, Jan 29 2018 16:56:47 GMT TEARDOWN rtsp://10.3.8.202:554/ RTSP/1.0 CSeq: 8 Authorization: Digest username="admin", realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554/", response="e08a15c27d3daac14fd4b4bcab424a5e" User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22) Session: 1273222592 RTSP/1.0 200 OK CSeq: 8 Session: 1273222592 Date: Mon, Jan 29 2018 16:57:03 GMT