注:如下展示结构非单纯调用顺序,只是方便看代码
1.zlmediaserver
main
|
|->loadIniConfig //加载配置文件,如果配置文件不存在就创建一个
|
|->initEventListener
|
|->addListener Broadcast::kBroadcastOnGetRtspRealm //监听kBroadcastOnGetRtspRealm事件决定rtsp链接是否需要鉴权(传统的rtsp鉴权方案)才能访问
|
|->addListener Broadcast::kBroadcastOnRtspAuth //监听kBroadcastOnRtspAuth事件返回正确的rtsp鉴权用户密码
|
|->addListener Broadcast::kBroadcastMediaPublish //监听rtsp/rtmp推流事件,返回结果告知是否有推流权限
|
|->addListener Broadcast::kBroadcastMediaPlayed //监听rtsp/rtsps/rtmp/http-flv播放事件,返回结果告知是否有播放权限(rtsp通过kBroadcastOnRtspAuth或此事件都可以实现鉴权)
|
|->addListener Broadcast::kBroadcastShellLogin //shell登录事件,通过shell可以登录进服务器执行一些命令
|
|->addListener Broadcast::kBroadcastMediaChanged //监听rtsp、rtmp源注册或注销事件;此处用于测试rtmp保存为flv录像,保存在http根目录下
|
|->addListener Broadcast::kBroadcastNotFoundStream //监听播放失败(未找到特定的流)事件
|
|->addListener Broadcast::kBroadcastFlowReport //监听播放或推流结束时消耗流量事件
|
|->TcpServer::Ptr rtspSrv(new TcpServer()) //new rtspserver
|
|->bind TcpServer::onAcceptConnection_l //构造函数中bind 此函数然后保存到类型为function的成员变量_acceptCB中,回调接口
|
|->bind TcpServer::onBeforeAcceptConnection_l //构造函数中bind 此函数然后保存到类型为function的成员变量_beforeAcceptCB中,回调接口
|
|->TcpServer::Ptr rtmpSrv(new TcpServer()) //new rtmpserver
|
|->bind TcpServer::onAcceptConnection_l //构造函数中bind 此函数然后保存到类型为function的成员变量_acceptCB中,回调接口
|
|->bind TcpServer::onBeforeAcceptConnection_l //构造函数中bind 此函数然后保存到类型为function的成员变量_beforeAcceptCB中,回调接口
|
|->TcpServer::start //分别对rtspserver rtmpserver做start
|
|->start_l //模板,TcpSession创建器,通过它创建不同类型的服务器
|
|->_sessionMaker //<tcpserver,对应的rtsp/rtmpsession>
|
|->Socket::listen
|
|->std::make_shared<Timer> //新建定时器管理这些tcp会话
|
|->Timer::Timer //timer的构造
|
|->onManager //执行各个子类的onManager
|
|->RtspSession::onManager //异常监控处理
|
|->RtmpSession::onManager //同上
Socket::onAccept
|
|->_beforeAcceptCB
|
|->_acceptCB
|
|->onAcceptConnection_l
|
|->onAcceptConnection
|
|->Socket::setOnRead //将recv lambda 存到_readCB中
Socket::onRead
|
|->_readCB
|
|->onRecv
|
|->RtspSession::onRecv
|
|->HttpRequestSplitter::input
|
|->RtspSession::onRtpPacket //过滤到rtp包
|
|->handleOneRtp
|
|->sortRtp
|
|->RtspSession::onRtpSorted
|
|->RtspMediaSource::onWrite
|
|->
|
|->RtspSplitter::onRecvContent //如果过滤到rtsp包
|
|->RtspSession::onWholeRtspPacket //这里对client发的rtsp请求做处理
|
|->RtspSession::handleReq_Options
| //OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, ANNOUNCE, RECORD, SET_PARAMETER, GET_PARAMETER
|->200 OK //直接回复200ok,带能力
|
|->RtspSession::handleReq_Describe
|
|->RtspSession::handleReq_ANNOUNCE
|
|->RtspSession::handleReq_RECORD
|
|->RtspSession::handleReq_Setup
|
|->RtspSession::handleReq_Play
|
|->RtspSession::handleReq_Pause
|
|->RtspSession::handleReq_Teardown
|
|->RtspSession::handleReq_Get
|
|->RtspSession::handleReq_Post
|
|->RtspSession::handleReq_SET_PARAMETER
|
|->RtspSession::handleReq_SET_PARAMETER
|
|->RtmpSession::onRecv