live555--WRtspSvr例子

类结构如下:

RTSPServer    Server类

RTSPClientSession  客户会话类

BasicTaskScheduler 用于select模型的SOCKET集的轮循

ServerMediaSession 媒体会话集类

ServerMediaSubsession 媒体会话类

class WAVAudioFileServerMediaSubsession : public ServerMediaSubsession  音频文件会话类

class WAVAudioFileSource  : public FramedSource    source类

StreamState ??

RTPSink 打包类

CBankSocket   SOCKET类,用于select模型的监听端

RTPInterface   SOCKET发送类

CUtility 工具类

 

1 创建RTSPServer    

RTSPServer fRTSPServer(554);

成员CbankSocket用来接收命令。

 2创建MediaSession 

ServerMediaSession* sms

= new ServerMediaSession(streamName,  streamName,descriptionString);

3 添加SubSession

sms->addSubsession(WAVAudioFileServerMediaSubsession::createNew(inputFileName,   reuseFirstSource, "audio",convertToULaw));

对应每个音视频。

4 addServerMediaSession

fRTSPServer.addServerMediaSession(sms);

每个RTSPClientSession对应多个ServerMediaSubsession。

5 开始运行

试用select模型进行SOCKET处理。

handleCmd_DESCRIBE

创建数据源

ServerMediaSession::generateSDPDescription->ServerMediaSubsession::sdpLines->sdpLines

{

   createNewStreamSource

{

WAVAudioFileSource*wavSource=WAVAudioFileSource::createNew(fFileName);

}

}

handleCmd_OPTIONS

发送"OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE";                                                      

handleCmd_SETUP

创建发送工具

subsession->getStreamParameters

{

RTPSink* rtpSink = createNewRTPSink

   New Sink;  //RTPSink用RTPInterface来操作WAVAudioFileSource。

}

}

      new StreamState(rtpSink); 

Sink下有RTPInterface(用来发数据),

RTPSink是ServerMediaSubsession的成员。

handleCmd_PLAY 

开始发送

ServerMediaSubsession::startStream->StreamState::startPlaying->RTPSink::startPlaying->RTPSink::continuePlaying

->RTPSink::buildAndSendPacket->RTPSink::packFrame->afterGettingFrame->afterGettingFrame1->RTPSink::sendPacketIfNecessary->RTPSink::buildAndSendPacket...,已经形成循环。

handleCmd_TEARDOWN

停止发送

fSessionIsActive =False;

紧接着会执行      if (!fSessionIsActive){ delete this; }

你可能感兴趣的:(thread,delete,工具,sms,audio)