天天看點

live555代碼解讀之三:SETUP和PLAY請求消息處理過程

SETUP請求消息處理過程

前面已經提到RTSPClientSession類,用于處理單獨的客戶會話。其類成員函數handleCmd_SETUP()處理用戶端的SETUP請求。調用parseTransportHeader()對SETUP請求的傳輸頭解析,調用子會話(這裡具體實作類為 OnDemandServerMediaSubsession)的getStreamParameters()函數擷取流媒體發送傳輸參數。将這些參數組裝成響應消息,傳回給用戶端。

擷取發送傳輸參數的過程:調用子會話(具體實作類MPEG1or2DemuxedServerMediaSubsession)的 createNewStreamSource(...)建立MPEG1or2VideoStreamFramer,選擇發送傳輸參數,并調用子會話的 createNewRTPSink(...)建立MPEG1or2VideoRTPSink。同時将這些資訊儲存在StreamState類對象中,用于記錄流的狀态。

用戶端發送兩個SETUP請求,分别用于建立音頻和視訊的RTP接收。

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.

涉及到一些類有:

MPEGVideoStreamFramer: A filter that breaks up an MPEG video elementary stream into headers and frames

MPEG1or2VideoStreamFramer: A filter that breaks up an MPEG 1 or 2 video elementary stream into frames for: Video_Sequence_Header, GOP_Header, Picture_Header

MPEG1or2DemuxedElementaryStream: A MPEG 1 or 2 Elementary Stream, demultiplexed from a Program Stream

MPEG1or2Demux: Demultiplexer for a MPEG 1 or 2 Program Stream

ByteStreamFileSource: A file source that is a plain byte stream (rather than frames)

MPEGProgramStreamParser: Class for parsing MPEG program stream

StreamParser: Abstract class for parsing a byte stream

StreamState:A class that represents the state of an ongoing stream