您的位置:首页 > 其它

live555 --RTSP SET_UP PLAY 执行流程分析

2011-07-26 15:17 141 查看
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数据包
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: