crtmpserver 基本流程分析

首先我们先分析下基本流程。

1、初始化流程

InitNetworking---初始化网络
Initialize
Logger::Init()---初始化日志
lowerCase(extension) == "lua"---加载.lua后缀配置文件
LoadLuaFile
Normalize
NormalizeLogAppenders 初始化日志配置
NormalizeApplications 初始化监听配置

gRs.pConfigFile->ConfigLogAppenders()根据配置初始化
IOHandlerManager::Initialize() 初始化IO,读写队列清零
gRs.pConfigFile->ConfigModules() 加载动态库appselector.dll
ProtocolFactoryManager::RegisterProtocolFactory(gRs.pProtocolFactory) 加载默认支持的协议集合
gRs.pConfigFile->ConfigAcceptors() 根据IP和端口开启监听器
gRs.pConfigFile->ConfigInstances() 配置多实例,win下不支持
gRs.pConfigFile->ConfigApplications() 将监听器与实例绑定
installQuitSignal 设置程序退出机制

Run
IOHandlerManager::Pulse() 对socket资源进行轮询,查询是否有需要进行读写的socket操作

2、接收客户端的连接请求之connect
Pulse()
FD_ISSET(MAP_VAL(i)->GetInboundFd(), &_readFdsCopy)
MAP_VAL(i)->OnEvent(_currentEvent)
TCPAcceptor::Accept() 进入accept进行连接的创建
BaseProtocol *pProtocol = ProtocolFactoryManager::CreateProtocolChain 为连接创建对应配置的协议,比如tcp && rtmp,或者udp && rtcp==

TCPCarrier *pTCPCarrier = new TCPCarrier(fd) 为连接创建一个tcp交互对象,并将其和刚创建的协议对象绑定,创建时构造函数中就注册了读请求

FD_ISSET(MAP_VAL(i)->GetInboundFd(), &_readFdsCopy)
MAP_VAL(i)->OnEvent(_currentEvent)
TCPCarrier::OnEvent(select_event &event) 进入读分支读取数据,根据对应的协议分析读取的数据依据结果填充_outputBuffer发送缓冲区,并设置发送信号TCPCarrier::SignalOutputData()--->ENABLE_WRITE_DATA,通知Pulse轮询socket状态需要发送数据,然后再次进入TCPCarrier::OnEvent(select_event &event)写分支进行真正的数据发送操作

RTMP消息类型为:RM_INVOKE_FUNCTION_CONNECT

3、接收客户端的发布流之Publish
这一段属于rtmp协议交互的部分

RM_INVOKE_FUNCTION_RELEASESTREAM 这里没有获得stream名称,发送名称请求
RM_INVOKE_FUNCTION_FCPUBLISH 这里获得stream名称
RM_INVOKE_FUNCTION_CREATESTREAM
ProcessInvokeCreateStream
pFrom->CreateNeutralStream(id) == NULL
RTMPStream *pStream = new RTMPStream 这里创建一个rtmpstream流控制对象  RTMPStream ---> BaseStream
RM_INVOKE_FUNCTION_PUBLISH
ProcessInvokePublish
GetApplication()->GetAllowDuplicateInboundNetworkStreams()这里判断是否存在同名情况
InNetRTMPStream *pInNetRTMPStream = pFrom->CreateINS(VH_CI(request) 创建network inbound stream
GetApplication()->GetStreamsManager()->GetWaitingSubscribers 查询是否有请求这路流的连接并绑定pBaseOutStream->Link(pInNetRTMPStream);
pInNetRTMPStream->SendOnStatusStreamPublished() 发送准备接收流请求
BaseOutFileStream *pOutFileStream = CreateOutFileStream(pFrom, meta, appending);另外,如果需要录像,这里创建文件流连接

4、接收客户端请求实时流
这一段属于rtmp协议交互的部分

RM_INVOKE_FUNCTION_PLAY
ProcessInvokePlay
pFrom->CloseStream(VH_SI(request), true) 关闭该连接之前请求的流
TryLinkToLiveStream(pFrom, VH_SI(request), streamName, linked) 将该连接绑定
FOR_MAP(inboundStreams, uint32_t, BaseStream *, i) 通过streamName查询找到流输入
BaseOutNetRTMPStream * pBaseOutNetRTMPStream = pFrom->CreateONS(streamId, 先创建流输出

pBaseInNetStream->Link(pBaseOutNetRTMPStream)然后将流输出绑定至流输入


上面我们做了流程的分析,这一篇我们对其中涉及到的类做一个梳理,两篇可以结合着一起看,对整个程序的运行是有帮助的。


BaseClientApplication APP基类,一切APP都基于这个类

StreamsManager _streamsManager; 可以对该APP所属的流链接进行管理
map<uint64_t, BaseAppProtocolHandler *> _protocolsHandlers; 这个APP所支持的协议

BaseProtocol 协议基类,一切协议都基于这个类,例如BaseHTTPProtocol和BaseRTMPProtocol

BaseClientApplication *_pApplication;该协议所属的APP
BaseProtocol *_pFarProtocol;远端协议
BaseProtocol *_pNearProtocol;//表示到服务器的远近[outside world --->ssl--->http--->rtmp--->server]
//离服务器最近的是rtmp协议,最远的为ssl
BaseRTMPProtocol   RTMP协议运算基类
IOBuffer _outputBuffer;协议的交互buffer
BaseRTMPAppProtocolHandler *_pProtocolHandler;所属的协议事务类
BaseStream *_streams[MAX_STREAMS_COUNT]; 这边是一个连接对象允许请求256次流?
LinkedListNode<BaseOutNetRTMPStream *> *_pSignaledRTMPOutNetStream;输出流集合
BaseAppProtocolHandler APP处理协议事务基类,--->BaseRTMPAppProtocolHandler--->RTMPAppProtocolHandler
BaseClientApplication *_pApplication;可以找到所属的APP
对于基本的协议交互,BaseRTMPAppProtocolHandler已经足够使用,继承于它的RTMPAppProtocolHandler只不过增加一些特定的扩展应用。同理,BaseRTSPAppProtocolHandler,对于比较简单的协议比如ssl和http,大部分功能都在BaseAppProtocolHandler,只需要重载实现部分接口就可以了。而对于调用者来说,构造一个RTMPAppProtocolHandler和HTTPAppProtocolHandler即可支持两种协议的事务处理

BaseRTMPAppProtocolHandler  继承于BaseAppProtocolHandler
map<uint32_t, BaseRTMPProtocol *> _connections;协议基础类的支持?
StreamsManager 流链接管理
BaseClientApplication *_pApplication;所属APP
BaseStream 流处理基类
BaseProtocol *_pProtocol;所属协议
StreamsManager *_pStreamsManager;反向查询流管理
BaseInStream --->BaseStream 流输入类
map<uint32_t, BaseOutStream *> _linkedStreams;对应的流输出集合
BaseOutStream --->BaseStream 流输出类
BaseInStream *_pInStream;流的输入对象
InNetRTMPStream --->BaseInNetStream --->BaseInStream RTMP 流发布时创建的,用于管理流输入,在这个类中做流分发处理
IOBuffer _videoCodecInit;对应的视频流缓冲
IOBuffer _audioCodecInit;对应的音频流缓冲
IOHandler 处理IO交互,网络相关,TCPAcceptor,TCPCarrier,TCPConnector...
BaseProtocol *_pProtocol;所属的交互协议,RTMP/HTTP/RTSP...
IOHandlerType _type;标识本IO的处理类型,参见IOHandlerType,ACCEPT/CONNECT/TCP/UDP

TCPAcceptor TCP监听器
BaseClientApplication *_pApplication;
IOHandlerManager IO交互管理,程序入口为这个类
static map<uint32_t, IOHandler *> _activeIOHandlers;有效IO
static map<uint32_t, IOHandler *> _deadIOHandlers;无效IO
ProtocolManager Protocol协议交互管理
ClientApplicationManager APP管理
ProtocolFactoryManager 协议工厂,包含本程序所支持的协议,貌似跟配置文件无关,有25种协议

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值