openRTSP是对RTSPClient的实现,与服务器对应的客户端功能
1、初始化
BasicTaskschedular::createNew()
BasicUsageEnvironment::createNew()
解析输入streamURL
ourClient= createClient(streamURL)
\_ourRTSPClient = RTSPClient::createNew()
\_new RTSPClient()
\_setBaseURL(rtspURL)
2、发送请求与接收
RTSPClient的请求是连续发送的,在发出一个请求后,回调函数处理返回信息,处理结束后会发出另一个请求。
发送请求都是通过sendRequest方法,将请求封装为RequestRecord,传入回调函数。
2.1 continueAfterDESCRIBE()
continueAfterDESCRIBE(sdpString)
|---session =MediaSession::createNew(sdp)根据sdp信息创建MediaSession、MediasubSession
|---foreachsubSession->initiate(simpleRTPoffsetArg)这里会创建具体的数据接收方式,如文件等
|---setupStream(),发送setup请求
MediaSession::createNew(sdp)
|---new MediaSession()
|---session->initializeWithSDP(sdp)
|---循环parseSDPLine,直到sdp描述中的“m=……”行
|---解析sdpLine,创建MediaSubsession
|---MediaSubsession* subsession =createNewMediaSubsession()其中会对MediaSubsession中各个变量初始化
|---加入fSubsessionTail这个链表
|---subsession->parseSDPLine解析subSession具体的信息
MediaSubsession::initiate()
|---fRTPSocket、fRTCPSocket
|---createSourceObjects创建fReadSource、fRTPSource
|---fReadSource = fRTPSource = H264VideoRTPSource::createNew
|---fRTCPInstance = RTCPInstance::createNew(fRTPSource)
2.2setupStream
setupStream()
|---foreach subsession, setupSubsession()
|---foreach subsession, fileSink = H264VideoFileSink::createNew
|---subsession->sink->startPlaying(readSource,subsessionAfterPlaying, subsession)
|---startPlayingsession(continueAfterPLAY)发送Play请求
RTSPClient
通过sendRequest发送请求命令,第一次请求时会发现还没有socket,因此会调openConnection进行连接,之后根据命令类型构造请求命令字串,send发送请求。
openConnection()
|---parseRTSPURL解析输入的fBaseURL,得到server地址和端口
|---setupStreamSocket建立socket赋值给fInputSocket,fOutputSocket
|---connectToServer连接到server用connect方法,根据连接结果会分两种情况:
1、正常,返回1,之后会在socketHandler中添加一个读任务,用于接收server返回的数据,这个任务将在之后循环接收数据
2、延迟,返回0,在socketHandler中添加一个写任务,并且不会在之后添加读任务,读任务会在回调函数中添加
sendRequest
|--openConnection返回连接结果,如果为0,说明读操作延迟,connectionIsPending = true,下面就调用延迟处理,如果为1,则说明正常,构造命令后send发送