网络-RTSP简单理解
網(wǎng)絡(luò)上有很多介紹RTSP的文章,但是看后還是印象不深刻,這里就記錄一下讀學(xué)習(xí)筆記吧。
1.協(xié)議介紹
RTSP協(xié)議以CS的方式工作,它是一個應(yīng)用層的多媒體播放控制協(xié)議,用來使用戶在播放從互聯(lián)網(wǎng)下載的實時數(shù)據(jù)時能夠?qū)ζ溥M(jìn)行控制,如暫停、繼續(xù)、快進(jìn)、快退等
RTSP的語法和操作與HTTP相似了,所有請求和響應(yīng)都是基于ASCII文本。不同的是RTSP是有狀態(tài)的協(xié)議,而HTTP是無狀態(tài)的。RTSP記錄客戶端的狀態(tài),如是播放還是暫停等。RTSP沒有規(guī)定音視頻的壓縮方法,這個都是開發(fā)人自己選擇的,只要客戶端和服務(wù)端能夠統(tǒng)一好就行。
詳細(xì)的內(nèi)容請點(diǎn)擊:https://tools.ietf.org/html/rfc2326
2.可用方法
下面詞條引用自:https://baike.baidu.com/item/RTSP/1276768?fr=aladdin
| DESCRIBE | C->S | P,S | 推薦 | 檢查演示或媒體對象的描述,也允許使用接收頭指定用戶理解的描述格式。DESCRIBE的答復(fù)-響應(yīng)組成媒體RTSP初始階段 |
| ANNOUNCE | C->SS->C | P,S | 可選 | 當(dāng)從用戶發(fā)往服務(wù)器時,ANNOUNCE將請求URL識別的演示或媒體對象描述發(fā)送給服務(wù)器;反之,ANNOUNCE實時更新連接描述。如新媒體流加入演示,整個演示描述再次發(fā)送,而不僅僅是附加組件,使組件能被刪除 |
| GET_PARAMETER | C->SS->C | P,S | 可選 | GET_PARAMETER請求檢查URL指定的演示與媒體的參數(shù)值。沒有實體體時,GET_PARAMETER也許能用來測試用戶與服務(wù)器的連通情況 |
| OPTIONS | C->SS->C | P,S | 要求 | 可在任意時刻發(fā)出OPTIONS請求,如用戶打算嘗試非標(biāo)準(zhǔn)請求,并不影響服務(wù)器狀態(tài) |
| PAUSE | C->S | P,S | 推薦 | PAUSE請求引起流發(fā)送臨時中斷。如請求URL命名一個流,僅回放和記錄被停止;如請求URL命名一個演示或流組,演示或組中所有當(dāng)前活動的流發(fā)送都停止。恢復(fù)回放或記錄后,必須維持同步。在SETUP消息中連接頭超時參數(shù)所指定時段期間被暫停后,盡管服務(wù)器可能關(guān)閉連接并釋放資源,但服務(wù)器資源會被預(yù)訂 |
| PLAY | C->S | P,S | 要求 | PLAY告訴服務(wù)器以SETUP指定的機(jī)制開始發(fā)送數(shù)據(jù);直到一些SETUP請求被成功響應(yīng),客戶端才可發(fā)布PLAY請求。PLAY請求將正常播放時間設(shè)置在所指定范圍的起始處,發(fā)送流數(shù)據(jù)直到范圍的結(jié)束處。PLAY請求可排成隊列,服務(wù)器將PLAY請求排成隊列,順序執(zhí)行 |
| RECORD | C->S | P,S | 可選 | 該方法根據(jù)演示描述初始化媒體數(shù)據(jù)記錄范圍,時標(biāo)反映開始和結(jié)束時間;如沒有給出時間范圍,使用演示描述提供的開始和結(jié)束時間。如連接已經(jīng)啟動,立即開始記錄,服務(wù)器數(shù)據(jù)請求URL或其他URL決定是否存儲記錄的數(shù)據(jù);如服務(wù)器沒有使用URL請求,響應(yīng)應(yīng)為201(創(chuàng)建),并包含描述請求狀態(tài)和參考新資源的實體與位置頭。支持現(xiàn)場演示記錄的媒體服務(wù)器必須支持時鐘范圍格式,smpte格式?jīng)]有意義 |
| REDIRECT | S->C | P,S | 可選 | 重定向請求通知客戶端連接到另一服務(wù)器地址。它包含強(qiáng)制頭地址,指示客戶端發(fā)布URL請求;也可能包括參數(shù)范圍,以指明重定向何時生效。若客戶端要繼續(xù)發(fā)送或接收URL媒體,客戶端必須對當(dāng)前連接發(fā)送TEARDOWN請求,而對指定主執(zhí)新連接發(fā)送SETUP請求 |
| SETUP | C->S | S | 要求 | 對URL的SETUP請求指定用于流媒體的傳輸機(jī)制。客戶端對正播放的流發(fā)布一個SETUP請求,以改變服務(wù)器允許的傳輸參數(shù)。如不允許這樣做,響應(yīng)錯誤為"455 Method Not Valid In This State”。為了透過防火墻,客戶端必須指明傳輸參數(shù),即使對這些參數(shù)沒有影響 |
| SET_PARAMETER | C->SS->C | P,S | 可選 | 這個方法請求設(shè)置演示或URL指定流的參數(shù)值。請求僅應(yīng)包含單個參數(shù),允許客戶端決定某個特殊請求為何失敗。如請求包含多個參數(shù),所有參數(shù)可成功設(shè)置,服務(wù)器必須只對該請求起作用。服務(wù)器必須允許參數(shù)可重復(fù)設(shè)置成同一值,但不讓改變參數(shù)值。注意:媒體流傳輸參數(shù)必須用SETUP命令設(shè)置。將設(shè)置傳輸參數(shù)限制為SETUP有利于防火墻。將參數(shù)劃分成規(guī)則排列形式,結(jié)果有更多有意義的錯誤指示 |
| TEARDOWN | C->S | P,S | 要求 | TEARDOWN請求停止給定URL流發(fā)送,釋放相關(guān)資源。如URL是此演示URL,任何RTSP連接標(biāo)識不再有效。除非全部傳輸參數(shù)是連接描述定義的,SETUP請求必須在連接可再次播放前發(fā)布 |
注:P----演示,S----流,C----用戶端,S----服務(wù)器端
3.工作流程
下面這個是根據(jù)本人抓包分畫出的工作流程,這是簡單的連接、播放、停止。不過其它的請求也類似,待用的時候查官方想?yún)f(xié)議查看即可。
- 6步驟會返回一個session id給客戶端進(jìn)程
- 9過程開始傳送音視頻數(shù)據(jù),協(xié)議可以運(yùn)行在UDP、RTP、TCP。在播放過程中可以隨時暫停。
注意:OPTIONS 請求用于返回服務(wù)端支持的 RTSP方法列表 。也可以定時發(fā)送這個請求來保活相關(guān)的 RTSP 會話。
4.實例分析
從網(wǎng)上找到一個可以使用rtsp協(xié)議播放的大熊兔視頻,鏈接為: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協(xié)議的,但是超時,使用TCP傳輸。
使用wireshark抓包后獲取如下日志,這里把日志分開來分析,并詳細(xì)分析關(guān)鍵字段的意思。
<1> OPTION
客戶可在任意時刻發(fā)出OPTIONS請求,OPTION發(fā)出后服務(wù)器會返回支持的方法
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 支持持續(xù)的播放服務(wù)。
<2> DESCRIBE
DESCRIBE方法根據(jù)URL來檢索服務(wù)器的描述信息,可以根據(jù)accept頭部來指定描述信息的格式(下面例子就是這樣),請求發(fā)出后服務(wù)器返回對應(yīng)的格式的描述信息,供客戶端使用。需要注意的是服務(wù)器返回的數(shù)據(jù)必須包含所有媒體資源的初始化信息。
1)SDP(Session Description Protocol)
由于這里返回的SDP的數(shù)據(jù)包,下面簡單介紹一下SDP常用字段意思。更詳細(xì)的可以看官方文檔 https://tools.ietf.org/html/rfc4566
2)結(jié)合上面SDP數(shù)據(jù)包格式分析下面實時抓包的數(shù)據(jù)。
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 //內(nèi)容長度有590個字節(jié) 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 //返回的數(shù)據(jù)類型sdp Session: 1372529946;timeout=60 //下面是協(xié)議的內(nèi)容 v=0 o=- 1372529946 1372529946 IN IP4 184.72.239.149 s=BigBuckBunny_175k.mov c=IN IP4 184.72.239.149 //連接信息,這里是服務(wù)器的ip t=0 0 a=sdplang:en a=range:npt=0- 596.458 //數(shù)據(jù)源的長度是596.458s a=control:* m=audio 0 RTP/AVP 96 //m的意思就是media stream ,這里是audio stream使用RTP傳輸,內(nèi)容類型是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傳輸,內(nèi)容類型是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下面就擴(kuò)展下面2項內(nèi)容,其它自行看文檔查閱吧。
- trackID:服務(wù)器會為每一路流分配一個id,這里上面可以看到聲音和視頻均分配一個trackID。
- Payload types:就是傳送數(shù)據(jù)的格式,數(shù)據(jù)在互聯(lián)網(wǎng)傳輸時需要先壓縮一下,傳送到目的主機(jī)后在進(jìn)行解碼。下面是官方描述的一些格式,更詳細(xì)的可以查看 https://tools.ietf.org/html/rfc1890
<3> SETUP
SETUP方法用于對請求指定流媒體的傳輸機(jī)制,包含端口,是否使用cache。
//音頻流的傳輸機(jī)制獲取 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 //服務(wù)器返回客戶端端口號已經(jīng)對應(yīng)的服務(wù)端口號。 Date: Sun, 17 Feb 2019 05:55:05 UTC Session: 1372529946;timeout=60//視頻流的傳輸機(jī)制獲取 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 //服務(wù)器返回客戶端端口號已經(jīng)對應(yīng)的服務(wù)端口號,注意和上面音頻流對比。 Date: Sun, 17 Feb 2019 05:55:06 UTC Session: 1372529946;timeout=60這兩根據(jù)DESCRIBE返回的信息可以了解到,有2個媒體流。而且服務(wù)器已經(jīng)給它們各分配了一個trackID,用于標(biāo)示這個資源。由音視頻請求中可以發(fā)現(xiàn),音視頻流請求對應(yīng)不同端口,而且服務(wù)端也是對應(yīng)不同端口,這里要特別注意。
<4> PLAY
上面該請求的數(shù)據(jù)已經(jīng)獲取了,發(fā)送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:在服務(wù)器響應(yīng)PLAY方法時,此字段用于設(shè)置RTP特定參數(shù)。這里簡單引用一下(詳細(xì)查看:https://tools.ietf.org/html/rfc2326#page-55)
<5> PAUSE
PAUSE方法用于通知服務(wù)器停止發(fā)送音視頻流。
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.總結(jié)
轉(zhuǎn)眼間天黑了,一下午一篇文檔,算是初步了解了RTSP協(xié)議的使用,但是還沒進(jìn)入真正的網(wǎng)絡(luò)編程實踐。接下來繼續(xù)學(xué)習(xí)RTP、RTCP,百度輸入文件編號即可找到文件。
| RTSP | 《RFC2326》 |
| RTP | 《RFC3550》《RFC 3605》 |
| RTCP | 《RFC3550》 |
| SDP | 《RFC 4566》 |
總結(jié)
以上是生活随笔為你收集整理的网络-RTSP简单理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【个人总结】win10 + ubuntu
- 下一篇: 无线蹭网卡