- 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数据包
live555 --RTSP SET_UP PLAY 执行流程分析 .
最新推荐文章于 2024-04-01 16:08:09 发布