主要分析RTSPServer::RTSPClientSession针对客户端DECCRIBE信令处理。

一、回调函数incomingRequestHandler分析

回顾一下rtsp客户端session创建过程,

步骤1.0new RTSPClientSession--->incomingRequestHandler时序图如下:

1)步骤1.4incomingRequestHandler1,主要通过readSocket接收rtsp客户端socket信令消息,以及
接收数据后调用handleRequestBytes(bytesRead)解析rtsp客户端具体信令字段等,源码实现如下:

2)步骤1.8parseRTSPRequestString,如rtsp://xxx/NBA20230207B1_H,最后解析后

urlSuffix=NBA20230207B1_H

3)步骤1.9,通过步骤1.4解析来自RTSP客户端不同的信令,如:OPTIONS、DESCRIBE、SETUP、

PLAY、PAUSE、TEARDOWN等。

     ① 如果是OPTIONS信令,则调用handleCmd_OPTIONS来处理,OPTIONS信令比较简单,当RTSP
         客户端请求时,RTSP服务端将固定字符串(存于allowedCommandNames该字段中)发送给RTSP
         客户端。源码字符串如下:
         

     ② 如果是DESCRIBE信令,则调用handleCmd_DESCRIBE来处理,后续会详细分析。

     ③ 如果是SETUP信令,则调用handleCmd_SETUP来处理,后续会详细分析。    

     ④ 如果是PLAY、PAUSE、TEARDOWN、GET_PARAMETER、SET_PARAMETER信令,则调用
         handleCmd_withinSession来处理,后续会详细分析。

     ⑤ 如果是http://xxx/xxx这种,则调用parseHTTPRequestString来解析,http协议不做详细分析。

二、handleCmd_DESCRIBE 源码解析     

1)步骤2.17,分析如下:

 ① 如果是视频使能,即pStreamInfo[idx].videoCfg.enable = true,则调用

sms->addSubsession(ourVideoRealServerMediaSubsession::createNew(env, 
&pStreamInfo[idx].videoCfg, reuseSource, pEventCb, pVidSrcBuf[idx],OURVIDEOBUFFERSIZE)),
OURVIDEOBUFFERSIZE=3x1024x1024,其中ourVideoRealServerMediaSubsession::createNew(...)

是公司进行了二次开发扩展,源码如下:

       从上图可以看到,其中调用回调函数fpEventCb(fStreamId,
RTSPServerEvent_RuestOpenVideoSession, NULL);主要通知主控来打开视频编码器
如果是音频使能,即pStreamInfo[idx].audioCfg.enable = true,则调用
sms->addSubsession(ourAudioRealServerMediaSubsession::createNew(env, idx, 
&pStreamInfo[idx].audioCfg, reuseSource, pEventCb)),其中
ourAudioRealServerMediaSubsession::createNew(...)是公司进行了二次开发扩展,源码如下:

 针对上述①②做下详细分析,时序图如下:

2)步骤2.24,生成SDP媒体会话信息给RTSP客户端,session->generateSDPDescription()
SDP信息一般携带音视频协议、传输协议、payloadType、音视频传输通道track1、track2,传
输端口等。具体信息可查看SDP相关文档。