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

来源:互联网 发布:linux hplib开发资料 编辑:程序博客网 时间:2024/06/05 02:33
  1. 1 handleCmd_SETUP()  
  2.   
  3. 在客户端连接成功后,调用RTSPServer::incomingConnectionHandler,在其中创建RTSPClientSession * _pClientSession 进而在其后调用RTSPClientSession  
  4.   
  5. ::handleCmd_SETUP()方法  
  6.   
  7. 在此方法中执行subsession->getStreamParameters()  
  8.   
  9. (注:在DynamicRTSPServer::lookupServerMediaSession会执行  
  10.   
  11. ServerMediaSession*createNewSMS函数从而创建session以及subsession  
  12.   
  13. 所以这里的subsession是  
  14.   
  15. H264VideoBufferServerMediaSubsession、ADTSAudioBufferServerMediaSubsession、MP3AudioFileServerMediaSubsession类型  
  16.   
  17. )  
  18.   
  19. 重点分析getStreamParameters函数:  
  20.   
  21. 以H264VideoBufferServerMediaSubsession为例  
  22.   
  23. 所以这里实际是H264VideoBufferServerMediaSubsession对象  
  24.   
  25. 指针调用getStreamParameters函数。  
  26.   
  27. Step1: 生成数据源对象指针  
  28.   
  29. FramedSource* mediaSource  
  30.   
  31.      = createNewStreamSource(clientSessionId, streamBitrate)  
  32.   
  33. 创建source 指针对象。  
  34.   
  35. 这里实际是执行H264VideoBufferServerMediaSubsession  
  36.   
  37. ::createNewStreamSource根据代码可知 这里函数返  
  38.   
  39. 回值实际是H264BufferStreamFramer *类型。  
  40.   
  41. Step2:生成sink指针  
  42.   
  43. rtpSink = createNewRTPSink(rtpGroupsock, rtpPayloadType,mediaSource);  
  44.   
  45. 这里实际执行  
  46.   
  47. H264VideoBufferServerMediaSubsession  
  48.   
  49. ::createNewRTPSink这里函数实际返回值是  
  50.   
  51. H264VideoRTPSink * 。  
  52.   
  53. Step3:  
  54.   
  55. streamToken = fLastStreamToken  
  56.   
  57.       = new StreamState(*this, serverRTPPort, serverRTCPPort,rtpSink, udpSink,streamBitrate, mediaSource,rtpGroupsock, rtcpGroupsock);  
  58.   
  59. 2  
  60.   
  61. handleCmd_PLAY  
  62.   
  63. 在函数中调用  
  64.   
  65. Step1:  
  66.   
  67. fStreamStates[i].subsession->startStream  
  68.   
  69. 即执行OnDemandServerMediaSubsession::startStream  
  70.   
  71. 在startStream中执行  
  72.   
  73. Step2:  
  74.   
  75.    
  76.   
  77. StreamState::startPlaying()  
  78.   
  79. 接着执行fRTPSink->startPlaying()(即MediaSink::startPlaying)  
  80.   
  81. Step3:  
  82.   
  83. H264VideoRTPSink::continuePlaying()函数  
  84.   
  85. 如果是首次执行还会生成H264FUAFragmenter* 指针对象,然后执行MultiFramedRTPSink::continuePlaying()  
  86.   
  87. Step4:  
  88.   
  89. MultiFramedRTPSink buildAndSendPacket(Boolean isFirstPacket)  
  90.   
  91. step5:  
  92.   
  93. MultiFramedRTPSink:: packFrame()  
  94.   
  95. Step6:  
  96.   
  97. fSource->getNextFrame  
  98.   
  99. 即MediaSource :: getNextFrame  
  100.   
  101. Step7:  
  102.   
  103. H264BufferStreamFramer::doGetNextFrame()  
  104. step8:  
  105.  MultiFramedRTPSink::sendPacketIfNecessary(), 这里才真正发送RTP数据包  
原创粉丝点击