live555源代碼學習(處理SETUP PLAY PAUSE TEARDOWN等過程)(服務端)

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/weixin_42718004/article/details/90446435
1、分別的含義
SETUP:告知服務器以TCP/UDP建立RTP、RTSP連接,並告知端口號
PLAY:告知服務器可以開始用RTP協議傳輸數據過來了
PAUSE:暫停
TEARDOWN:關閉連接

2、
在服務器程序端,有一個RTSPClientSession類(該類繼承在RESPServer下),用來維護和客戶端之間的對話。
在RTSPClientSession類中定義了很多handleCmd_xxxxx這樣的函數,就是專門用來處理對應的請求的
例如,當處理SETUP時,就會調用handleCmd_SETUP

void RTSPServer::RTSPClientSession
::handleCmd_SETUP(RTSPServer::RTSPClientConnection* ourClientConnection,
		  char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr)

RTP的建立過程無非是這樣:client告訴server自己的rtp/rtcp端口號,
server建立自己的rtp/rtcp socket,然後在收到PLAY請求時向客戶端發數據。

這點暫時不確定行不行:
當然在實際中,只要雙方已經約定好端口號,可以省去SETUP請求
可以看一下handleCmd_SETUP是怎麼做的

3、handleCmd_SETUP
1、服務器首先找到客戶端請求的ServerMediaSession,在進一步找到ServerMediaSubsession,
2、從客戶端的請求中獲取信息(也就是客戶端的RTP、RTCP端口)
3、最後調用OnDemandServerMediaSubsession::getStreamParameters創建RTP/RTCP連接

4、
至此,服務器和客戶端之間已經建立好連接了,就等客戶端PLAY信號,就可以開始傳RTP包了

5、handleCmd_PLAY
若是收到客戶端的PLAY信號,handleCmd_SETUP是怎麼做的呢
1、提取Scale字段(播放速度)
2、提取Rang字段(播放的起止範圍)
3、然後設置好傳輸的參數
Scale:setStreamScale
Rang:seekStream
4、設置好之後,調用startstream開始傳輸

void OnDemandServerMediaSubsession::startStream(unsigned clientSessionId,
						void* streamToken,
						TaskFunc* rtcpRRHandler,
						void* rtcpRRHandlerClientData,
						unsigned short& rtpSeqNum,
						unsigned& rtpTimestamp,
						ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler,
						void* serverRequestAlternativeByteHandlerClientData)

在函數startstream中繼續調用startPlaying

void StreamState
::startPlaying(Destinations* dests, unsigned clientSessionId,
	       TaskFunc* rtcpRRHandler, void* rtcpRRHandlerClientData,
	       ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler,
	       void* serverRequestAlternativeByteHandlerClientData)

在函數StreamState::startPlaying中將客戶端添加到目的客戶端地址中去,繼續調用 MediaSink::startPlaying

//這個函數,開始rtp包的發送

Boolean MediaSink::startPlaying(MediaSource& source,
				afterPlayingFunc* afterFunc,
				void* afterClientData)

6、網上高人的總結:
服務器通過RTPSink去讀數據,在RTPSink中又通過FramedSource讀數據(這裏應該是將媒體文件 流化)讀完數據後交給RTPSink處理,RTPSink處理完後又繼續通過FramedSource去讀數據,如此在RTPSink和FramedSource之間形成循環,這爲live555讀取數據的基本流程

7、PAUSE TEARDOWN
這兩個請求暫沒有去研究
————————————————
版權聲明:本文爲CSDN博主「阿大古 古古古」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42718004/article/details/90446435

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章