锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / 流媒体开源技术 / live555的RTSP子过程Play
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883

live555的RTSP子过程Play

void RTSPServer::RTSPClientSession::handleCmd_PLAY(
   ServerMediaSubsession* subsession,
   char const* cseq,
   char const* fullRequestStr)
   {
//分析"Scale:"头部  ----------------------------------------------------------该函数主要做了以下动作
      //Scale头,指示了播放的速率,scale = 1为正常播放,大于1快进,小于0则表示快退  

//分析"Range:"头部  
//"Range:"头部,表示要播放的时间范围。如Range: npt=0.000-,从0时刻开始播放看到结束   
//不含Range 首部域的PLAY 请求也是合法的。它从媒体流开头开始播放,直到媒体流被暂停  
 //根据要求,在每个subsession上进行seeking/scaling操作  
//计算流的播放时间streamDuration 
  // Now, start streaming:                         
  for (i = 0; i < fNumStreamStates; ++i) {  
     if (subsession == NULL /* means: aggregated operation */  
|| subsession == fStreamStates[i].subsession) { 

      unsigned short rtpSeqNum = 0;  
      unsigned rtpTimestamp = 0;  
      //开始各个subsession上的数据传输, 即开始播放了(见2.3)  
      fStreamStates[i].subsession->startStream(fOurSessionId,  -----------------------开始真正的传输

void OnDemandServerMediaSubsession::startStream(unsigned clientSessionId,  ------------------------------------------------startStream关键分析
void* serverRequestAlternativeByteHandlerClientData) {  
  StreamState* streamState = (StreamState*)streamToken;  
  Destinations* destinations  
    = (Destinations*)(fDestinationsHashTable->Lookup((char const*)clientSessionId));  --------------------------------------------------之前已经加到hash表
  if (streamState != NULL) {  
    streamState->startPlaying(destinations,  
    }  
  }  
}  

void StreamState::startPlaying(Destinations* dests,  ----------------------------------------------------------------------------------------startPlaying关键分析
      TaskFunc* rtcpRRHandler, void* rtcpRRHandlerClientData,  
      ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler,  
      void* serverRequestAlternativeByteHandlerClientData) {  
  if (dests == NULL) return;  
  
  //创建RTCPInstance实例  -------------------------------------------------------------------------------------------------------------------RTCP监控调试作用
  
  if (dests->isTCP) {  
    //使用TCP传输RTP 和 RTCP    
    // Change RTP and RTCP to use the TCP socket instead of UDP:  
    if (fRTPSink != NULL) {  
      fRTPSink->addStreamSocket(dests->tcpSocketNum, dests->rtpChannelId);  
      fRTPSink->setServerRequestAlternativeByteHandler(dests->tcpSocketNum, serverRequestAlternativeByteHandler, serverRequestAlternativeByteHandlerClientData);  
    }  

  } else {  
    //使用UDP传输RTP、RTCP  

    }  
  }    
  //下面调用sink上的sdtartPlaying函数开始传输数据  
  if (!fAreCurrentlyPlaying && fMediaSource != NULL) {  
    if (fRTPSink != NULL) {     //通过RTP协议传输  
      fRTPSink->startPlaying(*fMediaSource, afterPlayingStreamState, this);  
      fAreCurrentlyPlaying = True;  
    } else if (fUDPSink != NULL) {  //裸的UDP数据包,不使用RTP协议   

    }  
  }  

}  

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内