网络-RTSP简单理解
網絡上有很多介紹RTSP的文章,但是看后還是印象不深刻,這里就記錄一下讀學習筆記吧。
1.協議介紹
RTSP協議以CS的方式工作,它是一個應用層的多媒體播放控制協議,用來使用戶在播放從互聯網下載的實時數據時能夠對其進行控制,如暫停、繼續、快進、快退等
RTSP的語法和操作與HTTP相似了,所有請求和響應都是基于ASCII文本。不同的是RTSP是有狀態的協議,而HTTP是無狀態的。RTSP記錄客戶端的狀態,如是播放還是暫停等。RTSP沒有規定音視頻的壓縮方法,這個都是開發人自己選擇的,只要客戶端和服務端能夠統一好就行。
詳細的內容請點擊:https://tools.ietf.org/html/rfc2326
2.可用方法
下面詞條引用自:https://baike.baidu.com/item/RTSP/1276768?fr=aladdin
| DESCRIBE | C->S | P,S | 推薦 | 檢查演示或媒體對象的描述,也允許使用接收頭指定用戶理解的描述格式。DESCRIBE的答復-響應組成媒體RTSP初始階段 |
| ANNOUNCE | C->SS->C | P,S | 可選 | 當從用戶發往服務器時,ANNOUNCE將請求URL識別的演示或媒體對象描述發送給服務器;反之,ANNOUNCE實時更新連接描述。如新媒體流加入演示,整個演示描述再次發送,而不僅僅是附加組件,使組件能被刪除 |
| GET_PARAMETER | C->SS->C | P,S | 可選 | GET_PARAMETER請求檢查URL指定的演示與媒體的參數值。沒有實體體時,GET_PARAMETER也許能用來測試用戶與服務器的連通情況 |
| OPTIONS | C->SS->C | P,S | 要求 | 可在任意時刻發出OPTIONS請求,如用戶打算嘗試非標準請求,并不影響服務器狀態 |
| PAUSE | C->S | P,S | 推薦 | PAUSE請求引起流發送臨時中斷。如請求URL命名一個流,僅回放和記錄被停止;如請求URL命名一個演示或流組,演示或組中所有當前活動的流發送都停止。恢復回放或記錄后,必須維持同步。在SETUP消息中連接頭超時參數所指定時段期間被暫停后,盡管服務器可能關閉連接并釋放資源,但服務器資源會被預訂 |
| PLAY | C->S | P,S | 要求 | PLAY告訴服務器以SETUP指定的機制開始發送數據;直到一些SETUP請求被成功響應,客戶端才可發布PLAY請求。PLAY請求將正常播放時間設置在所指定范圍的起始處,發送流數據直到范圍的結束處。PLAY請求可排成隊列,服務器將PLAY請求排成隊列,順序執行 |
| RECORD | C->S | P,S | 可選 | 該方法根據演示描述初始化媒體數據記錄范圍,時標反映開始和結束時間;如沒有給出時間范圍,使用演示描述提供的開始和結束時間。如連接已經啟動,立即開始記錄,服務器數據請求URL或其他URL決定是否存儲記錄的數據;如服務器沒有使用URL請求,響應應為201(創建),并包含描述請求狀態和參考新資源的實體與位置頭。支持現場演示記錄的媒體服務器必須支持時鐘范圍格式,smpte格式沒有意義 |
| REDIRECT | S->C | P,S | 可選 | 重定向請求通知客戶端連接到另一服務器地址。它包含強制頭地址,指示客戶端發布URL請求;也可能包括參數范圍,以指明重定向何時生效。若客戶端要繼續發送或接收URL媒體,客戶端必須對當前連接發送TEARDOWN請求,而對指定主執新連接發送SETUP請求 |
| SETUP | C->S | S | 要求 | 對URL的SETUP請求指定用于流媒體的傳輸機制。客戶端對正播放的流發布一個SETUP請求,以改變服務器允許的傳輸參數。如不允許這樣做,響應錯誤為"455 Method Not Valid In This State”。為了透過防火墻,客戶端必須指明傳輸參數,即使對這些參數沒有影響 |
| SET_PARAMETER | C->SS->C | P,S | 可選 | 這個方法請求設置演示或URL指定流的參數值。請求僅應包含單個參數,允許客戶端決定某個特殊請求為何失敗。如請求包含多個參數,所有參數可成功設置,服務器必須只對該請求起作用。服務器必須允許參數可重復設置成同一值,但不讓改變參數值。注意:媒體流傳輸參數必須用SETUP命令設置。將設置傳輸參數限制為SETUP有利于防火墻。將參數劃分成規則排列形式,結果有更多有意義的錯誤指示 |
| TEARDOWN | C->S | P,S | 要求 | TEARDOWN請求停止給定URL流發送,釋放相關資源。如URL是此演示URL,任何RTSP連接標識不再有效。除非全部傳輸參數是連接描述定義的,SETUP請求必須在連接可再次播放前發布 |
注:P----演示,S----流,C----用戶端,S----服務器端
3.工作流程
下面這個是根據本人抓包分畫出的工作流程,這是簡單的連接、播放、停止。不過其它的請求也類似,待用的時候查官方想協議查看即可。
- 6步驟會返回一個session id給客戶端進程
- 9過程開始傳送音視頻數據,協議可以運行在UDP、RTP、TCP。在播放過程中可以隨時暫停。
注意:OPTIONS 請求用于返回服務端支持的 RTSP方法列表 。也可以定時發送這個請求來保活相關的 RTSP 會話。
4.實例分析
從網上找到一個可以使用rtsp協議播放的大熊兔視頻,鏈接為:rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov
使用ffplay播放該視頻 ffplay.exe rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov,效果如下所示:
這里使用ffplay播放文件時打印出如下日志,可以看到一開始想使用UDP協議的,但是超時,使用TCP傳輸。
使用wireshark抓包后獲取如下日志,這里把日志分開來分析,并詳細分析關鍵字段的意思。
<1> OPTION
客戶可在任意時刻發出OPTIONS請求,OPTION發出后服務器會返回支持的方法
OPTIONS rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov RTSP/1.0 CSeq: 1 User-Agent: Lavf58.20.100RTSP/1.0 200 OK CSeq: 1 Server: Wowza Streaming Engine 4.7.5.01 build21752 Cache-Control: no-cache Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD, GET_PARAMETER Supported: play.basic, con.persistent上面的Supported: play.basic, con.persistent 支持持續的播放服務。
<2> DESCRIBE
DESCRIBE方法根據URL來檢索服務器的描述信息,可以根據accept頭部來指定描述信息的格式(下面例子就是這樣),請求發出后服務器返回對應的格式的描述信息,供客戶端使用。需要注意的是服務器返回的數據必須包含所有媒體資源的初始化信息。
1)SDP(Session Description Protocol)
由于這里返回的SDP的數據包,下面簡單介紹一下SDP常用字段意思。更詳細的可以看官方文檔 https://tools.ietf.org/html/rfc4566
2)結合上面SDP數據包格式分析下面實時抓包的數據。
DESCRIBE rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov RTSP/1.0 Accept: application/sdp //客戶端請求時指定sdp格式 CSeq: 2 User-Agent: Lavf58.20.100RTSP/1.0 200 OK CSeq: 2 Server: Wowza Streaming Engine 4.7.5.01 build21752 Cache-Control: no-cache Expires: Sun, 17 Feb 2019 05:55:05 UTC Content-Length: 590 //內容長度有590個字節 Content-Base: rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/ Date: Sun, 17 Feb 2019 05:55:05 UTC Content-Type: application/sdp //返回的數據類型sdp Session: 1372529946;timeout=60 //下面是協議的內容 v=0 o=- 1372529946 1372529946 IN IP4 184.72.239.149 s=BigBuckBunny_175k.mov c=IN IP4 184.72.239.149 //連接信息,這里是服務器的ip t=0 0 a=sdplang:en a=range:npt=0- 596.458 //數據源的長度是596.458s a=control:* m=audio 0 RTP/AVP 96 //m的意思就是media stream ,這里是audio stream使用RTP傳輸,內容類型是96,96的意思看下面的Payload types a=rtpmap:96 mpeg4-generic/48000/2 //48000采樣率,通道2 a=fmtp:96 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1190 a=control:trackID=1 //audio的trackID是1 m=video 0 RTP/AVP 97 //m的意思就是media stream ,這里是video stream使用RTP傳輸,內容類型是97,97的意思看下面的Payload types a=rtpmap:97 H264/90000 //H264編碼的碼流,采樣率90000 a=fmtp:97 packetization-mode=1;profile-level-id=42C01E;sprop-parameter-sets=Z0LAHtkDxWhAAAADAEAAAAwDxYuS,aMuMsg== a=cliprect:0,0,160,240 //窗口屬性 a=framesize:97 240-160 //幀格式和幀大小 a=framerate:24.0 //幀率 a=control:trackID=2 //這里video的trackID=2下面就擴展下面2項內容,其它自行看文檔查閱吧。
- trackID:服務器會為每一路流分配一個id,這里上面可以看到聲音和視頻均分配一個trackID。
- Payload types:就是傳送數據的格式,數據在互聯網傳輸時需要先壓縮一下,傳送到目的主機后在進行解碼。下面是官方描述的一些格式,更詳細的可以查看 https://tools.ietf.org/html/rfc1890
<3> SETUP
SETUP方法用于對請求指定流媒體的傳輸機制,包含端口,是否使用cache。
//音頻流的傳輸機制獲取 SETUP rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/trackID=1 RTSP/1.0 //traceID=1 這是音頻流 Transport: RTP/AVP/UDP;unicast;client_port=26952-26953 //音頻流端口號 CSeq: 3 User-Agent: Lavf58.20.100 Session: 1372529946RTSP/1.0 200 OK CSeq: 3 Server: Wowza Streaming Engine 4.7.5.01 build21752 Cache-Control: no-cache Expires: Sun, 17 Feb 2019 05:55:05 UTC Transport: RTP/AVP/UDP;unicast;client_port=26952-26953;source=184.72.239.149;server_port=12860-12861;ssrc=07C68CF2 //服務器返回客戶端端口號已經對應的服務端口號。 Date: Sun, 17 Feb 2019 05:55:05 UTC Session: 1372529946;timeout=60//視頻流的傳輸機制獲取 SETUP rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/trackID=2 RTSP/1.0 //traceID=2 這是視頻流 Transport: RTP/AVP/UDP;unicast;client_port=26954-26955 //視頻流端口號 CSeq: 4 User-Agent: Lavf58.20.100 Session: 1372529946RTSP/1.0 200 OK CSeq: 4 Server: Wowza Streaming Engine 4.7.5.01 build21752 Cache-Control: no-cache Expires: Sun, 17 Feb 2019 05:55:06 UTC Transport: RTP/AVP/UDP;unicast;client_port=26954-26955;source=184.72.239.149;server_port=12868-12869;ssrc=281B60E7 //服務器返回客戶端端口號已經對應的服務端口號,注意和上面音頻流對比。 Date: Sun, 17 Feb 2019 05:55:06 UTC Session: 1372529946;timeout=60這兩根據DESCRIBE返回的信息可以了解到,有2個媒體流。而且服務器已經給它們各分配了一個trackID,用于標示這個資源。由音視頻請求中可以發現,音視頻流請求對應不同端口,而且服務端也是對應不同端口,這里要特別注意。
<4> PLAY
上面該請求的數據已經獲取了,發送PLAY方法開始播放視頻。
PLAY rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/ RTSP/1.0 Range: npt=0.000- CSeq: 5 User-Agent: Lavf58.20.100 Session: 1372529946RTSP/1.0 200 OK RTP-Info: url=rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/trackID=1;seq=1;rtptime=0,url=rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/trackID=2;seq=1;rtptime=0 CSeq: 5 Server: Wowza Streaming Engine 4.7.5.01 build21752 Cache-Control: no-cache Range: npt=0.0-596.458 Session: 1372529946;timeout=60- RTP-Info:在服務器響應PLAY方法時,此字段用于設置RTP特定參數。這里簡單引用一下(詳細查看:https://tools.ietf.org/html/rfc2326#page-55)
<5> PAUSE
PAUSE方法用于通知服務器停止發送音視頻流。
PAUSE rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/ RTSP/1.0 CSeq: 6 User-Agent: Lavf58.20.100 Session: 1372529946RTSP/1.0 200 OK CSeq: 6 Server: Wowza Streaming Engine 4.7.5.01 build21752 Cache-Control: no-cache Session: 1372529946;timeout=60這里由于在使用UDP傳輸時超時了,ffplay又重新選擇了TCP傳輸,所以下面又看到了。SETUP、PLAY方法。
SETUP rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/trackID=1 RTSP/1.0 Transport: RTP/AVP/TCP;unicast;interleaved=0-1 CSeq: 7 User-Agent: Lavf58.20.100RTSP/1.0 200 OK CSeq: 7 Server: Wowza Streaming Engine 4.7.5.01 build21752 Cache-Control: no-cache Expires: Sun, 17 Feb 2019 05:55:17 UTC Transport: RTP/AVP/TCP;unicast;interleaved=0-1 Date: Sun, 17 Feb 2019 05:55:17 UTC Session: 1372529946;timeout=60SETUP rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/trackID=2 RTSP/1.0 Transport: RTP/AVP/TCP;unicast;interleaved=2-3 CSeq: 8 User-Agent: Lavf58.20.100 Session: 1372529946RTSP/1.0 200 OK CSeq: 8 Server: Wowza Streaming Engine 4.7.5.01 build21752 Cache-Control: no-cache Expires: Sun, 17 Feb 2019 05:55:18 UTC Transport: RTP/AVP/TCP;unicast;interleaved=2-3 Date: Sun, 17 Feb 2019 05:55:18 UTC Session: 1372529946;timeout=60 PLAY rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/ RTSP/1.0 Range: npt=0.000- CSeq: 9 User-Agent: Lavf58.20.100 Session: 1372529946RTSP/1.0 200 OK RTP-Info: url=rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/trackID=1;seq=178;rtptime=0,url=rtsp://184.72.239.149:554/vod/mp4://BigBuckBunny_175k.mov/trackID=2;seq=274;rtptime=0 CSeq: 9 Server: Wowza Streaming Engine 4.7.5.01 build21752 Cache-Control: no-cache Range: npt=0.0-596.458 Session: 1372529946;timeout=605.總結
轉眼間天黑了,一下午一篇文檔,算是初步了解了RTSP協議的使用,但是還沒進入真正的網絡編程實踐。接下來繼續學習RTP、RTCP,百度輸入文件編號即可找到文件。
| RTSP | 《RFC2326》 |
| RTP | 《RFC3550》《RFC 3605》 |
| RTCP | 《RFC3550》 |
| SDP | 《RFC 4566》 |
總結
以上是生活随笔為你收集整理的网络-RTSP简单理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【个人总结】win10 + ubuntu
- 下一篇: 无线蹭网卡