天天看點

live555代碼解讀之二:DESCRIBE請求消息處理過程

ve555代碼解讀之二:DESCRIBE請求消息處理過程

RTSP伺服器收到用戶端的DESCRIBE請求後,根據請求URL(rtsp://192.168.1.109/1.mpg),找到對應的流媒體資源,傳回響應消息。live555中的ServerMediaSession類用來處理會話中描述,它包含多個(音頻或視訊)的子會話描述 (ServerMediaSubsession)。

上節我們談到RTSP伺服器收到用戶端的連接配接請求,建立了RTSPClientSession類,處理單獨的客戶會話。在建立 RTSPClientSession的過程中,将建立立的socket句柄(clientSocket)和RTSP請求處理函數句柄 RTSPClientSession::incomingRequestHandler傳給任務排程器,由任務排程器對兩者進行一對一關聯。當用戶端發出 RTSP請求後,伺服器主循環中的select調用傳回,根據socket句柄找到對應的incomingRequestHandler,開始消息處理。先進行消息的解析,如果發現請求是DESCRIBE則進入handleCmd_DESCRIBE函數。根據用戶端請求URL的字尾(例如是1.mpg), 調用成員函數DynamicRTSPServer::lookupServerMediaSession查找對應的流媒體資訊 ServerMediaSession。如果ServerMediaSession不存在,但是本地存在1.mpg檔案,則建立一個新的 ServerMediaSession。在建立ServerMediaSession過程中,根據檔案字尾.mpg,建立媒體MPEG-1or2的解複用器(MPEG1or2FileServerDemux)。再由MPEG1or2FileServerDemux建立一個子會話描述 MPEG1or2DemuxedServerMediaSubsession。最後由ServerMediaSession完成組裝響應消息中的SDP資訊(SDP組裝過程見下面的描述),然後将響應消息發給用戶端,完成一次消息互動。

SDP消息組裝過程:

ServerMediaSession負責産生會話公共描述資訊,子會話描述由 MPEG1or2DemuxedServerMediaSubsession産生。 MPEG1or2DemuxedServerMediaSubsession在其父類成員函數 OnDemandServerMediaSubsession::sdpLines()中生成會話描述資訊。在sdpLines()實作裡面,建立一個虛構(dummy)的FramedSource(具體實作類為MPEG1or2AudioStreamFramer和 MPEG1or2VideoStreamFramer)和RTPSink(具體實作類為MPEG1or2AudioRTPSink和 MPEG1or2VideoRTPSink),最後調用setSDPLinesFromRTPSink(...)成員函數生成子會話描述。

以上涉及到的類以及繼承關系:

Medium <- ServerMediaSession

Medium <- ServerMediaSubsession <- OnDemandServerMediaSubsession <- MPEG1or2DemuxedServerMediaSubsession

Medium <- MediaSource <- FramedSouse <- FramedFileSource <- ByteStreamFileSource

Medium <- MediaSource <- FramedSouse <- MPEG1or2DemuxedElementaryStream

Medium <- MPEG1or2FileServerDemux

Medium <- MPEG1or2Demux

Medium <- MediaSource <- FramedSouse <- MPEG1or2DemuxedElementaryStream

Medium <- MediaSource <- FramedSouse <- FramedFilter <- MPEGVideoStreamFramer <- MPEG1or2VideoStreamFramer

Medium <- MediaSink <- RTPSink <- MultiFramedRTPSink <- VideoRTPSink <- MPEG1or2VideoRTPSink

繼續閱讀