live555 --RTSP SET_UP PLAY 执行流程分析 .
2012-05-14 17:13
363 查看
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数据包
在客户端连接成功后,调用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 执行流程分析
- live555客户端程序openrtsp程序流程详细分析
- 流媒体Live555(五)——openRTSP流程分析
- live555 接收rtsp视频流流程分析
- live555库的rtsp服务器源码分析总结,流程详解RTSPServer
- live555 接收rtsp视频流流程分析
- 查看源码分析activity执行setContentView的流程
- 流媒体Live555(五)——openRTSP流程分析
- live555库的rtsp服务器源码分析总结,流程详解RTSPServer
- live555库的rtsp服务器源码分析总结,流程详解RTSPServer
- live555库的rtsp服务器源码分析总结,流程详解RTSPServer
- RTSP点播消息流程实例(客户端:VLC, RTSP服务器:LIVE555 Media Server)
- 细谈struts2(四)struts2中action执行流程和源码分析
- Android 4.2 SetContentView 流程分析(一)
- cocos2dx 执行流程分析
- struts2执行流程分析
- Nginx 源码分析-- 模块module 解析执行 nginx.conf 配置文件流程分析 二
- Android源码分析(一):android原生源码编译期间执行的流程
- Android启动流程分析(十) action的执行和service的启动
- 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)