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 工具类
RTSPServer fRTSPServer(554);
成员CbankSocket用来接收命令。
2创建MediaSession
ServerMediaSession* sms
= new ServerMediaSession(streamName, streamName,descriptionString);
sms->addSubsession(WAVAudioFileServerMediaSubsession::createNew(inputFileName, reuseFirstSource, "audio",convertToULaw));
对应每个音视频。
fRTSPServer.addServerMediaSession(sms);
每个RTSPClientSession对应多个ServerMediaSubsession。
试用select模型进行SOCKET处理。
handleCmd_DESCRIBE
创建数据源
ServerMediaSession::generateSDPDescription->ServerMediaSubsession::sdpLines->sdpLines
{
createNewStreamSource
{
WAVAudioFileSource*wavSource=WAVAudioFileSource::createNew(fFileName);
}
}
发送"OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE";
创建发送工具
subsession->getStreamParameters
{
RTPSink* rtpSink = createNewRTPSink,
{
New Sink; //RTPSink用RTPInterface来操作WAVAudioFileSource。
}
}
new StreamState(rtpSink…);
Sink下有RTPInterface(用来发数据),
RTPSink是ServerMediaSubsession的成员。
开始发送
ServerMediaSubsession::startStream->StreamState::startPlaying->RTPSink::startPlaying->RTPSink::continuePlaying
->RTPSink::buildAndSendPacket->RTPSink::packFrame->afterGettingFrame->afterGettingFrame1->RTPSink::sendPacketIfNecessary->RTPSink::buildAndSendPacket...,已经形成循环。
停止发送
fSessionIsActive =False;
紧接着会执行 if (!fSessionIsActive){ delete this; }