主要分析RTSPServer::RTSPClientSession针对客户端DECCRIBE信令处理。
一、回调函数incomingRequestHandler分析
回顾一下rtsp客户端session创建过程,
步骤1.0,new RTSPClientSession--->incomingRequestHandler时序图如下:
1)步骤1.4,incomingRequestHandler1,主要通过readSocket接收rtsp客户端socket信令消息,以及
接收数据后调用handleRequestBytes(bytesRead)解析rtsp客户端具体信令字段等,源码实现如下:
2)步骤1.8,parseRTSPRequestString,如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相关文档。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章