流媒體協(xié)議--1:RTSP

"本文轉(zhuǎn)載自:

1.概述

??RTSP(Real Time Streaming Protocol 實時流協(xié)議)建立并控制一個或幾個時間同步的連續(xù)流媒體,對媒體流提供了諸如開始授瘦、暫停蝴悉、快進馋吗、停止等控制坯癣。它是TCP/IP協(xié)議體系中的一個應用層協(xié)議摇肌,協(xié)議主要規(guī)定了一對多應用程序如何有效地通過IP網(wǎng)絡傳送多媒體數(shù)據(jù)。RTSP體系結(jié)位于RTP和RTCP之上(RTCP用于控制傳輸,RTP用于數(shù)據(jù)傳輸)疲牵,使用TCP或UDP完成數(shù)據(jù)傳輸。RTSP的作用相當于流媒體服務器的遠程控制榆鼠,而它本身并不傳輸數(shù)據(jù)纲爸。

image.png

??RTSP流媒體協(xié)議交互及碼流傳輸過程中所用的協(xié)議如下:

image.png

??官方指導文檔參考:RFC 2326 - Real Time Streaming Protocol (RTSP)

??RTSP的語法和運作跟HTTP 1.1類似,但并不特別強調(diào)時間同步妆够,所以比較能容忍網(wǎng)絡延遲识啦。它具有重新導向功能,可視實際負載情況來轉(zhuǎn)換提供服務的服務器神妹,以避免過大的負載集中于同一服務器而造成延遲颓哮。

(1)RTSP協(xié)議與HTTP協(xié)議的區(qū)別:

  • 狀態(tài):RTSP是有狀態(tài)的,它的命令總是按照順序來發(fā)送鸵荠,其中某個命令可能需要總在另外一個命令之前要發(fā)送冕茅。而http則是無狀態(tài),協(xié)議在發(fā)送一個命令以后,連接就會斷開姨伤,且命令之間是沒有依賴性的哨坪。

  • 端口:RTSP協(xié)議使用554端口,http使用80端口乍楚。

  • 請求:RTSP的請求服務器和客戶端都可以發(fā)送当编,而HTTP請求則只能由客戶端發(fā)送。

(2)RTSP的優(yōu)點:

  • 易擴展:RTSP中很容易加入新的方法及參數(shù)徒溪,只需要服務器和客戶端共同協(xié)商即可

  • 易解析:RTSP可以由標準HTTP或MIME解析器進行解析

  • 安全:RTSP使用網(wǎng)頁安全機制忿偷,所有HTTP授權機制如basic、digest都可以直接使用

  • 傳輸協(xié)議多選:RTSP可以使用TCP()或UDP作為其底層傳輸協(xié)議支持

  • 多服務器支持:請求的多股流可以放在不同的服務器上臊泌,客戶端自動與這幾個服務器建立連接鲤桥,在傳輸時完成媒體流同步

2.RTSP協(xié)議交互過程

??RTSP協(xié)議通常是基于TCP的方式進行協(xié)議交互,另外也可基于HTTP缺虐,其交互過程有所不同芜壁,協(xié)議交互主要實現(xiàn)流媒體信息描述/碼流通道建立/流媒體控制等功能,這里要區(qū)分RTSP協(xié)議交互與流媒體碼流傳輸高氮,RTSP協(xié)議交互,只做流媒體會話交互功能:

  • 通過describe來同步流媒體編碼顷牌、封裝剪芍、連接等信息;

  • 通過setup來建立流媒體傳輸通道窟蓝;

  • 通過play來開啟流媒體播放罪裹;

  • 通過teardown來結(jié)束播放。

??流媒體碼流的傳輸是通過RTSP交互建立的流媒體傳輸通道來傳輸碼流运挫,其傳輸協(xié)議一般為RTP/RTCP状共,其傳輸層可以為UDP或者TCP。

2.1 RTSP基于TCP交互過程

??承載RTSP的協(xié)議為TCP谁帕,其主要交互過程如下圖所示:

image.png

??RTSP返回的狀態(tài)碼與HTTP類似峡继,各個方法的說明也很簡單也不做過多的說明。

(1)在開發(fā)中匈挖,RTSP客戶端可以直接發(fā)送describe碾牌,而無強制要求必須要發(fā)送option。

(2)describe之后儡循,根據(jù)其攜帶的SDP信息舶吗,判斷流媒體的編碼格式,封裝格式择膝,payloadtype誓琼,timescale,track標識等信息,客戶端保存此信息用于后續(xù)碼流的解復用和解碼腹侣。

(3)根據(jù)track標識去申請想要的類型的碼流呵扛;

(4)客戶端通過setup來建立碼流通道,如果有多路筐带,需要根據(jù)不同的track 調(diào)用setup方法多次今穿;

(5)一般setup建立通道可以是rtp/avp或者rtp/avp/tcp類型,這里標識以rtp傳輸音視頻伦籍;

(6)rtp/avp基于UDP傳輸蓝晒,rtp/avp/tcp基于TCP傳輸;

(7)如果基于UDP傳輸碼流時(rtp/avp類型)帖鸦,需要根據(jù)setup交互的信息芝薇,單獨建立RTP/RTCP兩路UDP通道;

(8)如果基于TCP傳輸碼流時(rtp/avp/tcp類型)作儿,則與RTSP共用一個TCP通道洛二,通過在RTP/RTCP頭加上$開頭的四個字節(jié)的tcpheader來區(qū)分是哪一路的RTP/RTCP,還是RTSP攻锰。

??RTP/AVP類型傳輸模式:單獨建立RTP和RTCP兩路UDP通道傳輸碼流數(shù)據(jù)晾嘶。

image.png

??RTP/AVP/TCP類型傳輸模式:與RTSP共用一個TCP通道。

image.png

2.2 RTSP基于HTTP的交互過程

??RTSP-over-HTTP tunneling娶吞,通過HTTP隧道來傳輸RTSP協(xié)議和媒體流垒迂,需要RTSP服務器支持此種方式,開啟HTTP隧道監(jiān)聽端口妒蛇。

??客戶端首先會建立一個鏈接通過HTTP-GET方法來獲取協(xié)議響應消息和媒體流机断,然后再建立一個鏈路,通過HTTP-POST方法來發(fā)送請求消息绣夺,兩個tcp鏈接都是長連接吏奸,POST 連接中發(fā)送RTSP請求消息,一般要進行BASE64編碼陶耍,來隱藏RTSP信息奋蔚。數(shù)據(jù)流的發(fā)送封裝方式與RTP/TCP一樣,通過GET鏈路發(fā)送給客戶端物臂,響應消息也是通過GET鏈路發(fā)送給客戶端旺拉,其流程如下:

image.png

3.RTSP方法

??RTSP常用的方法包括:OPTIONS、DESCRIBE棵磷、ANNOUNCE蛾狗、SETUP、TEARDOWN仪媒、PLAY沉桌、PAUSE谢鹊、GET_PARAMETER和SET_PARAMETER等。詳細使用介紹如下:


image.png

4.RTSP報文解析

??RTSP有兩類報文:請求報文(request)響應報文(ressponse)留凭。請求報文是指從客戶向服務器發(fā)送請求報文佃扼,響應報文是指從服務器到客戶的應答。RTSP報文由三部分組成蔼夜,即開始行兼耀、首部行和實體主體。如下使用wireshark抓取的數(shù)據(jù)包:

image.png

4.1 請求報文

??在請求報文中求冷,開始行就是請求行瘤运,RTSP請求報文的結(jié)構(gòu)如下圖所示:

image.png

??下面是OPTIONS請求消息的一個wireshark抓包,我們以此為例進行報文解析:

image.png

(1)RTSP的第一行(請求行)

Request: OPTIONS rtsp://127.0.0.1:554/desktop RTSP/1.0\r\n

??內(nèi)容格式:

方法名稱(OPTIONS) + 空格 + URL地址 + 空格 + RTSP版本 + 回車符(CR)和換行符(LF)

??其中方法包括:OPIONS匠题、DESCRIBE拯坟、SETUP、PLAY韭山、TEARDOWN等郁季;URI是接受方的地址,例如:rtsp://127.0.0.1:554/desktop

??RTSP版本一般都是 RTSP/1.0钱磅。每行后面的CR LF表示回車換行梦裂,需要接受端有相應的解析。

(2) 第二续搀、第三塞琼、第四行表示的是該消息的各字段名稱及其對應的值:

CSeq:表示序列號,本次請求的序列號為1(服務器端回復此請求的數(shù)據(jù)包的序列號也是1)禁舷;
User-Agent:表示用戶代理,值為 “Lavf60.4.100”毅往;
最后一行:\r\n牵咙,表示本次請求報文結(jié)束。

??內(nèi)容格式:

字段名 + 空格 + 字段值 + 回車符(CR)和換行符(LF)

4.2 響應報文

??響應報文的開始行是狀態(tài)行攀唯,RTSP響應報文的結(jié)構(gòu)如下圖所示:

image.png

??下面是OPTIONS響應消息的一個wireshark抓包洁桌,我們以此為例進行報文解析:

image.png

(1)RTSP的第一行(狀態(tài)行)

Response: RTSP/1.0 200 OK\r\n

??內(nèi)容格式:

RTSP版本 + 空格 + 狀態(tài)碼 + 空格 + 狀態(tài)語  + 回車符(CR)和換行符(LF)

(2)第二、第三侯嘀、第四另凌、第五行表示的是該消息的各字段名稱及其對應的值:

Public:表示RTSP服務器支持的方法,值為“DESCRIBE戒幔,SETUP吠谢,TEARDOWN,PLAY诗茎,PAUSE工坊,OPTIONS,ANNOUNCE,RECORD”
CSeq:表示序列號王污,本次響應的序列號為1(對應恢復請求序列號1)罢吃;
Session:表示一個RTSP會話,值為 “ipAyvSBVR”昭齐;
最后一行:\r\n尿招,表示本次響應報文結(jié)束。

4.3 常用字段含義

  • Accept:用于指定客戶端通知服務器自己可以接受的實體數(shù)據(jù)結(jié)構(gòu)類型阱驾。例如: Accept: application/sdp就谜,之后服務器通過Content-Type字段返回其實體數(shù)據(jù)結(jié)構(gòu)類型;

  • Accept-Encoding:用于客戶端通知服務器自己可以接受的數(shù)據(jù)壓縮格式啊易,例如:Accept-Encoding: gzip, compress, br吁伺,之后服務器將通過Content-Encoding字段通知客戶端它的選擇;

  • Accept-Language:用于客戶端通知服務器自己可以理解的語言及其接受度租谈,例如:Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 篮奄,之后服務器將通過Content-Language字段通知客戶端它的選擇;

  • Authorization:客戶端請求消息頭含有服務器用于驗證用戶代理身份的憑證割去;

  • Bandwidth:用于描述客戶端可用的帶寬值窟却。例如: Bandwidth: 4000;

  • Blocksize:此字段由客戶端發(fā)送到媒體服務器呻逆,要求服務器提供特定的媒體包大小夸赫,服務器可以自由使用小于請求的塊大小。 此數(shù)據(jù)包大小不包括 IP咖城、UDP 或 RTP 等低層標頭茬腿;

  • CSeq:指定了RTSP請求響應對的序列號,對每個包含一個給定序列號的請求消息宜雀,都會有一個相同序列號的回應消息切平,且每個請求或回應中都必須包括這個頭字段;辐董、

  • Cache-Control:通過指定指令來實現(xiàn)緩存機制悴品。緩存指令是單向的,這意味著在請求中設置的指令简烘,不一定被包含在響應中苔严;

  • Conference:通知服務器不得更改同一 RTSP 會話的會議 ID;

  • Connection:該字段決定當前的事務完成后孤澎,是否會關閉網(wǎng)絡連接届氢。如果該值是“keep-alive”,網(wǎng)絡連接就是持久的亥至,不會關閉悼沈,使得對同一個服務器的請求可以繼續(xù)在該連接上完成或者Connection: close贱迟;

  • Content-Length:該字段指明在RTSP協(xié)議最后一個標頭之后的雙 CRLF 之后的內(nèi)容長度。例如在服務器響應DESCRIBE中絮供,指明sdp信息長度衣吠;

  • Content-Type:告訴客戶端實際返回的內(nèi)容的內(nèi)容類型;

  • User-Agent:該字段用來讓網(wǎng)絡協(xié)議的對端來識別發(fā)起請求的用戶代理軟件的應用類型壤靶、操作系統(tǒng)缚俏、軟件開發(fā)商以及版本號;

  • Expires:指明過期的時間贮乳;

  • Rang: 用于指定一個時間范圍忧换,可以使用SMPTE、NTP或clock時間單元向拆;

  • Session:Session頭字段標識了一個RTSP會話亚茬。Session ID是由服務器在SETUP的回應中選擇的,客戶端一旦得到Session ID后浓恳,在以后的對Session 的操作請求消息中都要包含Session ID.例如:Session: 411B4161;timeout=65刹缝;

  • Transport:Transport頭字段包含客戶端可以接受的傳輸選項列表,包括傳輸協(xié)議颈将,地址端口梢夯,TTL等。服務器端也通過這個頭字段返回實際選擇的具體選項晴圾。如: Transport: RTP/AVP/TCP;unicast;destination=192.168.31.222;source=192.168.31.222;interleaved=0-1颂砸。

5.RTSP協(xié)議推拉流

5.1 RTSP協(xié)議拉流詳解

??RTSP協(xié)議交互無論是基于TCP,還是HTTP死姚,或者其他方式人乓,其協(xié)議交互流程都不變,以下按照客戶端拉流的協(xié)議交互順序都毒,對RTSP協(xié)議各個方法極其響應進行詳細說明撒蟀。

5.1.1 OPTION方法

??請求及響應實例如下:

OPTIONS rtsp://10.45.12.141:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 2
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
=======================
RTSP/1.0 200 OK
CSeq: 2
Public: OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER
Date:  Wed, Jul 27 2022 10:37:06 GMT

??此方法主要用來詢問流媒體服務器支持哪些RTSP方法,此例子說明服務器支持OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER温鸽,此方法不是交互必須的,客戶端可以跳過此方法直接發(fā)describe手负,服務器需要注意兼容涤垫。

響應報文遵循RTSP response消息的格式:

  • 第一行:RTSP的版本,狀態(tài)碼竟终,狀態(tài)描述蝠猬;

  • CSeq:與OPTION請求中的序列號相同;

  • Public:用于描述服務器當前提供了哪些方法统捶;

  • Date:表示日期榆芦。

5.1.2 DESCRIBE方法

??從服務器獲取媒體流相關的信息柄粹,可以包含多個媒體流類型極信息,通過SDP來描述和區(qū)分不同媒體類型的媒體源匆绣,客戶端根據(jù)服務器支持的媒體源通過setup建立媒體流通道驻右,其實例如下:

DESCRIBE rtsp://10.45.12.141:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp
=======================
RTSP/1.0 401 Unauthorized
CSeq: 3
WWW-Authenticate: Digest realm="IP Camera(C7627)", nonce="c4c4e29b1620211e44ec28b077e2eb52", stale="FALSE"
Date:  Wed, Jul 27 2022 10:37:06 GMT
---------------------------------------------------------------------------------------
DESCRIBE rtsp://10.45.12.141:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 4
Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="c4c4e29b1620211e44ec28b077e2eb52", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream", response="be7cde07af4a08db991dd58a89db7621"
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp
=======================
RTSP/1.0 200 OK
CSeq: 4
Content-Type: application/sdp
Content-Base: rtsp://10.45.12.141:554/h264/ch1/main/av_stream/
Content-Length: 574

v=0
o=- 1658918226996159 1658918226996159 IN IP4 10.45.12.141
s=Media Presentation
e=NONE
b=AS:5050
t=0 0
a=control:rtsp://10.45.12.141:554/h264/ch1/main/av_stream/
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:5000
a=recvonly
a=x-dimensions:1920,1080
a=control:rtsp://10.45.12.141:554/h264/ch1/main/av_stream/trackID=1
a=rtpmap:96 H265/90000
a=fmtp:96 sprop-sps=QgEBAWAAAAMAsAAAAwAAAwB7oAPAgBDlja5JMvTcBAQEAg==; sprop-pps=RAHA8vA8kAA=
a=Media_header:MEDIAINFO=494D4B48010300000400050000000000000000000000000000000000000000000000000000000000;
a=appversion:1.0

??這里客戶端發(fā)送describe時,一般服務器會進行用戶鑒權崎淳,如果未攜帶Authorization鑒權信息堪夭,或者認證失敗,服務器會返回錯誤號為401的響應拣凹,客戶端接收到401響應時森爽,需要根據(jù)已知的用戶鑒權信息,生成Authorization嚣镜,再次發(fā)送describe爬迟,如果認證成功,服務器返回攜帶有SDP的響應信息菊匿。

5.1.3 SETUP方法

此方法根據(jù)流媒體服務器返回的SDP描述信息付呕,進行流媒體傳輸通道的建立,如果sdp描述多個媒體源捧请,客戶端可根據(jù)需要建立媒體傳輸鏈路凡涩,play方法后,服務器根據(jù)setup建立的媒體流傳輸通道發(fā)送媒體流疹蛉,一般有RTP over udp和RTP over tcp兩張流的傳輸方式活箕,其setup有一定的區(qū)別。

(1)RTP OVER UDP抓包實例:

SETUP rtsp://10.45.12.141:554/h264/ch1/main/av_stream/trackID=1 RTSP/1.0
CSeq: 5
Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="c4c4e29b1620211e44ec28b077e2eb52", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream/", response="ac52cf287fe4aa6be5bb168bc9d01446"
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=63538-63539
=======================
RTSP/1.0 200 OK
CSeq: 5
Session:       1279114011;timeout=60
Transport: RTP/AVP;unicast;client_port=63538-63539;server_port=8312-8313;ssrc=3cc5faf7;mode="play"
Date:  Wed, Jul 27 2022 10:37:07 GMT

??首先客戶端側(cè)可款,SETUP的path路徑育韩,加上了trackID=1,表示建立的時trackID=1的媒體源的碼流傳輸通道闺鲸,通過上面SDP描述可知筋讨,此路時編碼類型為H265,payloadtype=96的視頻源摸恍,這里要注意悉罕,一個setup只能給一種媒體源建立流傳輸通道。如果服務器需要認證立镶,setup也需要帶上認證信息Authorization壁袄,Transport字段表示客戶端通過何種方式申請建立媒體流傳輸通道,這里RTP/AVP表示通過UDP方式媚媒;unicast表示單播方式(也支持組播嗜逻,比較少用,這里不做介紹)缭召,如果為UDP方式栈顷,則有client_port字段逆日,client_port=63538-63539表示客戶端測此路碼流的RTP端口為UDP63538,RTCP端口為UDP63539萄凤;這里注意建立RTP碼流傳輸通道時室抽,RTP和RTCP要成對出現(xiàn),一般碼流端口號為RTCP=RTP+1蛙卤。

??服務器響應時狠半,如果支持客戶端的傳輸方式,則Transport字段中颤难,RTP/AVP;unicast神年;client_port=63538-63539;要與客戶端申請的消息保持一致,增加server_port字段行嗤,表示服務器發(fā)送RTP/RTCP的UDP端口已日,可選增加ssrc標識。這里要注意栅屏,服務端回復setup時飘千,將會生成一個session ID.后續(xù)消息必須帶有此Session字段。

(2)RTP OVER TCP抓包實例:

SETUP rtsp://10.45.12.141:554/h264/ch1/main/av_stream/trackID=1 RTSP/1.0
CSeq: 5
Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="59db6d7ba1acb14582356c8bb8e61ce8", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream/", response="129818708e48cd0326f8b6f1b19613a3"
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
=======================
RTSP/1.0 200 OK
CSeq: 5
Session:       2095163832;timeout=60
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=24e4e500;mode="play"
Date:  Fri, Aug 26 2022 14:35:46 GMT

??RTP通過TCP傳輸時栈雳,與UDP方式在SETUP方法上有一定的區(qū)別护奈,主要是Transport頭,RTP/AVP/TCP表示RTP流通過TCP傳輸哥纫,當此值出現(xiàn)時霉旗,其沒有client_port字段,出現(xiàn)interleaved字段蛀骇,interleaved=0-1厌秒,表示streamid;當碼流通過TCP傳輸時擅憔,與RTSP共用一個TCP鏈路鸵闪,所以其不需要建立新的連接,為了區(qū)分RTP暑诸、RTCP及RTSP協(xié)議蚌讼,需要增加包頭標識,這里采用TCPHEAD頭字段个榕,tcphead為四個字節(jié)啦逆,格式如下:

| magic number | channel number | embedded data length | data |
  • magic number: 1 byte value of hex 0x24($),標識傳輸?shù)氖菙?shù)據(jù)不是rtsp協(xié)議笛洛;

  • channel number: 1 byte value to denote the channel,信道ID乃坤,標識流的類型苛让;

  • embedded data length :2 bytes to denote the embedded data length沟蔑,流長度;

  • data:表示RTP/RTCP包數(shù)據(jù)狱杰。

??當TCP接收到的包開頭為24時瘦材,可以判定其為RTP或者RTCP,通過streamid來區(qū)分仿畸,setup方法中interleaved=0-1食棕,標識RTP的streamid=0;RTCP的streamid=1错沽。

(3)tcphead抓包實例如下:

image.png

??第一個24 00 00 14標識此包為RTP包長度為0x14簿晓,解析時只需要根據(jù)streamid及長度讀取完整的RTP幀,去掉四字節(jié)頭千埃,通過RTP方式解析即可憔儿。由于TCP是流式傳輸,需要連續(xù)根據(jù)24標識判斷放可。

5.1.4 PLAY方法

??PLAY消息是告訴服務器端可以使用在SETUP消息中所指定的傳輸機制開始傳送數(shù)據(jù)谒臼。需要指出的是,客戶端不應該發(fā)送任何PLAY請求直到所有的SETUP消息被成功解析耀里。PLAY消息會在range中指定媒體的播放時間蜈缤,服務器在接到PLAY消息后會由range中指定的開始點開始發(fā)送媒體數(shù)據(jù)直到range中指定的結(jié)束點,PlAY可帶有scale和speed字段用于點播速度控制冯挎。對于實時流range一般為Range: npt=0.000

PLAY rtsp://10.45.12.141:554/h264/ch1/main/av_stream/ RTSP/1.0
CSeq: 6
Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="59db6d7ba1acb14582356c8bb8e61ce8", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream/", response="0eef224891c12e902ca9185c70f969cc"
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
Session: 2095163832
Range: npt=0.000-
=======================
RTSP/1.0 200 OK
CSeq: 6
Session:       2095163832
RTP-Info: url=rtsp://10.45.12.141:554/h264/ch1/main/av_stream/trackID=1;seq=29458;rtptime=2518517708
Date:  Fri, Aug 26 2022 14:35:46 GMT

??play方法需要帶上Session字段表示同一會話底哥,此Session由setup時服務端返回,客戶端發(fā)送play方法后织堂,即可準備接收碼流叠艳,服務器接收到play后,即可打開碼流發(fā)送通道易阳,發(fā)送碼流附较;這里要注意服務器在給出play響應時,最好帶有RTP-Info字段描述將要發(fā)送碼流的RTP信息潦俺,比如第一包RTP的seq和rtptime拒课,客戶端可以根據(jù)此字段進行解復用。

5.1.5 TEARDOWN方法

??客戶端發(fā)起表示停止媒體占用事示,并釋放相關資源早像,其實例如下:

TEARDOWN rtsp://10.45.12.141:554/h264/ch1/main/av_stream/ RTSP/1.0
CSeq: 7
Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="e3dfa4549e00a1d53c0e9f28c3348e2c", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream/", response="0c530cba910c33ea3ef7a554dda8d0b2"
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
Session: 391346974

??這里teardown一般會停止RTSP會話及視頻傳輸通道,服務器接收到此方法時肖爵,釋放相關資源卢鹦。

5.1.6 其他方法

(1)PAUSE:錄像回放時會用到,用以暫停流媒體傳輸劝堪;

(2)SET_PARAMETER/GET_PARAMETER:基本沒啥用冀自,一般用來作為心跳使用揉稚,也是用option來維持心跳。

5.2 RTSP協(xié)議推流詳解

??RTSP推流流程如下:

image.png

抓包實例如下:

OPTIONS rtsp://10.45.12.141:554/live/0001 RTSP/1.0
CSeq: 1
User-Agent: znv
=======================
RTSP/1.0 200 OK
Server: EasyDarwin/7.3 
Cseq: 1
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD
=======================
ANNOUNCE rtsp://10.45.12.141:554/live/0001 RTSP/1.0
Content-Type: application/sdp
CSeq: 2
User-Agent: znv
Content-Length: 325

v=0
o=- 0 0 IN IP4 127.0.0.1
s=Media Server
c=IN IP4 192.168.1.108
t=0 0
a=tool:libavformat 57.71.100
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAHqw0ygsBJ/wFuCgoKgAAB9AAAYah0MALFAALE9d5caGAFigAFieu8uFA,aO48MA==; profile-level-id=64001E
a=control:streamid=0
=======================
RTSP/1.0 200 OK
Server: EasyDarwin/7.3 (Build/17.0325; Platform/Win32; Release/EasyDarwin; State/Development; )
Cseq: 2
=======================
SETUP rtsp://10.45.12.141:554/live/0001/trackid=0 RTSP/1.0
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;mode=record
CSeq: 3
User-Agent: znv
=======================
RTSP/1.0 200 OK
Server: EasyDarwin/7.3 
Cseq: 3
Cache-Control: no-cache
Session: 132169028622239
Date: Tue, 13 Nov 2018 02:49:48 GMT
Expires: Tue, 13 Nov 2018 02:49:48 GMT
Transport: RTP/AVP/TCP;unicast;mode=record;interleaved=0-1
=======================
RECORD rtsp://10.45.12.141:554/live/0001 RTSP/1.0
Range: npt=0.000-
CSeq: 4
User-Agent:znv
Session: 132169028622239
=======================
RTSP/1.0 200 OK
Server: EasyDarwin/7.3 
Cseq: 4
Session: 132169028622239
RTP-Info: url=rtsp://192.168.1.108:554/live.sdp/live.sdp

??RTSP推流熬粗,一般作為流媒體代理搀玖,應用CDN等場景,推流由客戶端發(fā)起驻呐,視頻由客戶端推送給服務器端灌诅,因此流媒體描述需要由客戶端通知到服務器,通過ANNOUNCE方法完成含末,其SDP描述與DESCRIBE一致猜拾,傳輸開始時,由客戶端發(fā)送RECORD方法答渔,然后由客戶端推送rtp流到服務器关带。

6.RTSP錯誤碼

??RTSP的響應內(nèi)容通常包含3位整數(shù)響應碼以及一個原因短語,短語的目的是給出狀態(tài)代碼的簡短文本描述沼撕, 客戶端不需要檢查或顯示原因短語宋雏。 按照響應碼的首位數(shù)字區(qū)別,可以分為以下五個類別:

  • 1xx: 提示- 請求已經(jīng)收到务豺,正在處理中

  • 2xx: 成功- 請求已經(jīng)被成功處理

  • 3xx: 重定向- 必須采取進一步行動才能完成請求

  • 4xx: 客戶端錯誤 - 請求中包含錯誤的參數(shù)或語法導致請求無法被滿足

  • 5xx: 服務器錯誤 - 服務器無法滿足客戶端正確的請求

??當然磨总,RTSP的錯誤碼和RTSP方法是強相關的,某些錯誤可能只會在特定方法中才會觸發(fā)笼沥,詳細錯誤碼信息如下:

錯誤碼 原因短語 方法
100 Continue All
200 Success All
201 Created RECORD
300 Multiple Choices All
301 Moved Permanently All
302 Moved Temporarily All
303 See Other All
305 Use Proxy All
400 Bad Request All
401 Unauthorized All
402 Payment Required All
403 Forbidden All
404 Not Found All
405 Method Not Allowed All
406 Not Acceptable All
407 Proxy Authentication Required All
408 Request Timeout All
410 Gone All
411 Length Required All
412 Precondition Failed DESCRIBE, SETUP
413 Request Entity Too Larg All
414 Request-URI Too Long All
415 Unsupported Media Type All
451 Invalid parameter SETUP
452 Illegal Conference Identifier SETUP
453 Not Enough Bandwidth SETUP
454 Session Not Found All
455 Method Not Valid In This State All
456 Header Field Not Valid All
457 Invalid Range PLAY
458 Parameter Is Read-Only SET_PARAMETER
459 Aggregate Operation Not Allowed All
460 Only Aggregate Operation Allowed All
461 Unsupported Transport All
462 Destination Unreachable All
500 Internal Server Error All
501 Not Implemented All
502 Bad Gateway All
503 Service Unavailable All
504 Gateway Timeout All
505 RTSP Version Not Supported All
551 Option not support All
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚪燕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奔浅,更是在濱河造成了極大的恐慌馆纳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汹桦,死亡現(xiàn)場離奇詭異鲁驶,居然都是意外死亡,警方通過查閱死者的電腦和手機舞骆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門钥弯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人督禽,你說我怎么就攤上這事脆霎。” “怎么了狈惫?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵睛蛛,是天一觀的道長。 經(jīng)常有香客問我,道長玖院,這世上最難降的妖魔是什么菠红? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮难菌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔑滓。我一直安慰自己郊酒,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布键袱。 她就那樣靜靜地躺著燎窘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹄咖。 梳的紋絲不亂的頭發(fā)上褐健,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天街夭,我揣著相機與錄音棚品,去河邊找鬼。 笑死诬乞,一個胖子當著我的面吹牛俊抵,可吹牛的內(nèi)容都是我干的谁不。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼徽诲,長吁一口氣:“原來是場噩夢啊……” “哼刹帕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谎替,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤偷溺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钱贯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挫掏,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年喷舀,在試婚紗的時候發(fā)現(xiàn)自己被綠了砍濒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡硫麻,死狀恐怖爸邢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拿愧,我是刑警寧澤杠河,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響券敌,放射性物質(zhì)發(fā)生泄漏唾戚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一待诅、第九天 我趴在偏房一處隱蔽的房頂上張望叹坦。 院中可真熱鬧,春花似錦卑雁、人聲如沸募书。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莹捡。三九已至,卻和暖如春扣甲,著一層夾襖步出監(jiān)牢的瞬間篮赢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工琉挖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留启泣,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓粹排,卻偏偏與公主長得像种远,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子顽耳,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容