您的位置:首页 > 其它

crtmpserver 基本流程分析

2014-07-17 16:17 369 查看
首先我们先分析下基本流程。

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种协议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: