RTSP協議詳解

參考資料地址html

http://blog.sina.com.cn/s/blog_450e44880100mfiu.html數組

http://www.mikewootc.com/wiki/net/protocol/rtsp.html服務器

 

RTSP,實時流傳輸協議,是TCP/UDP協議體系中的一個應用層協議,由哥倫比亞大學, 網景和RealNetworks公司提交的IETF RFC標準.該協議定義了一對多應用程序如何有效地經過IP網絡傳輸多媒體數據。RTSP在體系結構上位於RTP和RTCP之上,它使用TCP或者RTP完成數據傳輸。網絡

流媒體服務協議棧session

RTSP提供了一個可擴展框架,使實時數據,如音頻與視頻的受控點播成爲可能,數據源包括現場數據與存儲在剪輯中數據。該協議目的在於控制多個數據發送連接,Wie選擇發送通道。如UDP 組播UDP與TCP,提供途徑,併爲選擇基於RTP上發送機制提供方法。框架

它的語法和運做跟HTTP 1.1相似, 但並不特別強調時間同步, 因此比較能容忍網絡延遲.ide

HTTP與RTSP相比, * HTTP傳送HTML. HTTP請求由客戶機發出, 服務器做出響應 * RTSP傳送的是多媒體數據. 使用RTSP時, 客戶機和服務器均可以發出請求, 即RTSP能夠是雙向的.函數

RTSP是用來控制聲音或影像的多媒體串流協議,並容許同時多個串流需求控制,傳輸時所用的網絡通訊協議並不在其定義的範圍內,服務器段能夠自動選擇使用TCP或UDP來傳送串流內容。ui

而前面提到的容許同時多個串流需求控制,除了能夠減低服務器端的網絡用量,更能支持多方視訊會議,由於與HTTP 1.1的運做方式類似,因此代理服務器的快選功能,一樣適用於RTSP,並因RTSP具備從新導向功能,可視實際負載狀況來轉換提供服務的服務器,以免過大的負載集中在同一服務器而形成延遲。編碼

該協議用於CS模型,是一個基於文本的協議,用於在客戶端和服務器段創建和協商實時流會話。

實時流協議創建並控制一個或幾個時間同步的連續流媒體,儘管連續媒體流與控制流交換是可可能的。一般它本省並不發送連續流,換言之,RTSP充當多媒體服務器的網絡遠程控制,RTSP連接沒有綁定到傳輸層連接,如TCP,在RTSP鏈接期間,RTSP用戶能夠打開或關閉多個服務器的可傳輸鏈接已發出RTSP請求。此外,可使用無鏈接傳輸協議,如UDP,RTSP流控制的流可能用到RTP,但RTSP操做並不依賴用於攜帶連續媒體的傳輸機制.

下面給出具體實現過程

(1)客戶端發起RTSP OPTION請求,目的是獲得服務器提供什麼方法。RTSP提供的方法通常包括OPTIONS、DESCRIBE、SETUP、TEARDOWN、PLAY、PAUSE、SCALE、GET_PARAMETER。

(2)服務器對RTSP OPTION迴應,服務器實現什麼方法就回應哪些方法。在此係統中,咱們只對DESCRIBE、SETUP、TEARDOWN、PLAY、PAUSE方法作了實現。

(3)客戶端發起RTSP DESCRIBE請求,服務器收到的信息主要有媒體的名字,解碼類型,視頻分辨率等描述,目的是爲了從服務器那裏獲得會話描述信息(SDP)。

(4)服務器對RTSP DESCRIBE響應,發送必要的媒體參數,在傳輸H.264文件時,主要包括SPS/PPS、媒體名、傳輸協議等信息。

(5)客戶端發起RTSP SETUP請求,目的是請求會話創建並準備傳輸。請求信息主要包括傳輸協議和客戶端端口號。

(6)服務器對RTSP SETUP響應,發出相應服務器端的端口號和會話標識符。

(7)客戶端發出了RTSP PLAY的請求,目的是請求播放視頻流。

(8)服務器對RTSP PLAY響應,響應的消息包括會話標識符,RTP包的序列號,時間戳。此時服務器對H264視頻流封裝打包進行傳輸。

(9)客戶端發出RTSP TEARDOWN請求,目的是關閉鏈接,終止傳輸。

(10)服務器關閉鏈接,中止傳輸。

3. SETUP請求消息處理過程

        RTSPClientSession類用於處理單獨的客戶會話。其類成員函數handleCmd_SETUP()處理客戶端的SETUP請求。調用parseTransportHeader()對SETUP請求的傳輸頭解析,調用子會話(這裏具體實現類爲OnDemandServerMediaSubsession)的getStreamParameters()函數獲取流媒體發送傳輸參數。將這些參數組裝成響應消息,返回給客戶端。

        獲取發送傳輸參數的過程:調用子會話(具體實現類MPEG1or2DemuxedServerMediaSubsession)的createNewStreamSource(...)建立MPEG1or2VideoStreamFramer,選擇發送傳輸參數,並調用子會話的createNewRTPSink(...)建立MPEG1or2VideoRTPSink。同時將這些信息保存在StreamState類對象中,用於記錄流的狀態。

        客戶端發送兩個SETUP請求,分別用於創建音頻和視頻的RTP接收。

 

 

 

 

4. PLAY請求消息處理過程

      RTSPClientSession類成員函數handleCmd_PLAY()處理客戶端的播放請求。首先調用子會話的startStream(),內部調用MediaSink::startPlaying(...),而後是MultiFramedRTPSink::continuePlaying(),接着調用MultiFramedRTPSink::buildAndSendPacket(...)。buildAndSendPacke內部先設置RTP包頭,內部再調用MultiFramedRTPSink::packFrame()填充編碼幀數據。

      packFrame內部經過FramedSource::getNextFrame(), 接着MPEGVideoStreamFramer::doGetNextFrame(),再接着通過MPEGVideoStreamFramer::continueReadProcessing(), FramedSource::afterGetting(...), MultiFramedRTPSink::afterGettingFrame(...), MultiFramedRTPSink::afterGettingFrame1(...)等一系列繁瑣調用,最後到了MultiFramedRTPSink::sendPacketIfNecessary(), 這裏才真正發送RTP數據包。而後是計算下一個數據包發送時間,把MultiFramedRTPSink::sendNext(...)函數句柄傳給任務調度器,做爲一個延時事件調度。在主循環中,當MultiFramedRTPSink::sendNext()被調度時,又開始調用MultiFramedRTPSink::buildAndSendPacket(...)開始新的發送數據過程,這樣客戶端能夠源源不斷的收到服務器傳來的RTP包了。

發送RTP數據包的間隔計算方法:

        Update the time at which the next packet should be sent, based on the duration of the frame that we just packed into it.

相關文章
相關標籤/搜索