版權聲明:本文爲博主原創文章,遵循 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