live555 --RTSP SET_UP PLAY 执行流程分析 .
来源:互联网 发布:linux hplib开发资料 编辑:程序博客网 时间:2024/06/05 02:33
- 1 handleCmd_SETUP()
-
- 在客户端连接成功后,调用RTSPServer::incomingConnectionHandler,在其中创建RTSPClientSession * _pClientSession 进而在其后调用RTSPClientSession
-
- ::handleCmd_SETUP()方法
-
- 在此方法中执行subsession->getStreamParameters()
-
- (注:在DynamicRTSPServer::lookupServerMediaSession会执行
-
- ServerMediaSession*createNewSMS函数从而创建session以及subsession
-
- 所以这里的subsession是
-
- H264VideoBufferServerMediaSubsession、ADTSAudioBufferServerMediaSubsession、MP3AudioFileServerMediaSubsession类型
-
- )
-
- 重点分析getStreamParameters函数:
-
- 以H264VideoBufferServerMediaSubsession为例
-
- 所以这里实际是H264VideoBufferServerMediaSubsession对象
-
- 指针调用getStreamParameters函数。
-
- Step1: 生成数据源对象指针
-
- FramedSource* mediaSource
-
- = createNewStreamSource(clientSessionId, streamBitrate)
-
- 创建source 指针对象。
-
- 这里实际是执行H264VideoBufferServerMediaSubsession
-
- ::createNewStreamSource根据代码可知 这里函数返
-
- 回值实际是H264BufferStreamFramer *类型。
-
- Step2:生成sink指针
-
- rtpSink = createNewRTPSink(rtpGroupsock, rtpPayloadType,mediaSource);
-
- 这里实际执行
-
- H264VideoBufferServerMediaSubsession
-
- ::createNewRTPSink这里函数实际返回值是
-
- H264VideoRTPSink * 。
-
- Step3:
-
- streamToken = fLastStreamToken
-
- = new StreamState(*this, serverRTPPort, serverRTCPPort,rtpSink, udpSink,streamBitrate, mediaSource,rtpGroupsock, rtcpGroupsock);
-
- 2
-
- handleCmd_PLAY
-
- 在函数中调用
-
- Step1:
-
- fStreamStates[i].subsession->startStream
-
- 即执行OnDemandServerMediaSubsession::startStream
-
- 在startStream中执行
-
- Step2:
-
-
-
- StreamState::startPlaying()
-
- 接着执行fRTPSink->startPlaying()(即MediaSink::startPlaying)
-
- Step3:
-
- H264VideoRTPSink::continuePlaying()函数
-
- 如果是首次执行还会生成H264FUAFragmenter* 指针对象,然后执行MultiFramedRTPSink::continuePlaying()
-
- Step4:
-
- MultiFramedRTPSink buildAndSendPacket(Boolean isFirstPacket)
-
- step5:
-
- MultiFramedRTPSink:: packFrame()
-
- Step6:
-
- fSource->getNextFrame
-
- 即MediaSource :: getNextFrame
-
- Step7:
-
- H264BufferStreamFramer::doGetNextFrame()
- step8:
- MultiFramedRTPSink::sendPacketIfNecessary(), 这里才真正发送RTP数据包