流媒体Live555(五)——openRTSP流程分析

时间:2022-05-24 03:59:46

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信息创建MediaSessionMediasubSession

|---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()

|---fRTPSocketfRTCPSocket

|---createSourceObjects创建fReadSourcefRTPSource

|---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连接到serverconnect方法,根据连接结果会分两种情况:

1、正常,返回1,之后会在socketHandler中添加一个读任务,用于接收server返回的数据,这个任务将在之后循环接收数据

2、延迟,返回0,在socketHandler中添加一个写任务,并且不会在之后添加读任务,读任务会在回调函数中添加

sendRequest

|--openConnection返回连接结果,如果为0,说明读操作延迟,connectionIsPending = true,下面就调用延迟处理,如果为1,则说明正常,构造命令后send发送