crtmpserver 基本流程分析

一. 顶层(crtmpserver/) 下的文件夹结构
3rdparty/             : 对lua, xml进行解析的源代码文件夹
sources/              : 项目的核心实现源代码文件夹

builders/              : 各种环境(VS2010, android, linux)下的项目生成
configs/               : 一些预定义的配置文件和示例启动脚本
docs/                  : 项目相关的文档
man/                   : crtmpserver的man文档
appscaffold/       : 创建自定义APP的方法
constants/          : 项目的常量配置文件
media/                : 用于播放的媒体素材文件夹


cleanup.sh    : 清除所有生成的项目
README        : 指导如何编译、安装和使用crtmpserver
LICENSE       : 版权声明

2. crtmpserver/3rdparty/
lua-dev/      : 解析lua型的配置文件
tinyxml/      : 解析xm工l型的配置文件


3. crtmpserver/docs/
ApplicationProtocols.doc : crtmpserver支持的协议详细
keepalive.txt            : TCP的keep live 功能说明
startup_script_rtmpd     : 一个启动,停止rtmpserver的shell脚本
architecture.txt         : 协议链的介绍
RTMPEHandshake.pdf       : crtmpserver在握手时的详细数据定义
stream_from_vlc.txt      : 和VLC相关的一个配置
config.doxy              : 配置项目的说明
server.xlsx              : crtmpserver在握手时的详细数据定义
diagrams.cdd
simpleLive/              : 播放器的页面示例


4. /crtmpserver/sources/
androidapplestreaming/   : 和andriod, apple的移动设备流生成相关
common/                  
thelib/
vm/
applications/
crtmpserver/
tests/
trafficdissector/  
vmtests/


二、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) 然后将流输出绑定至流输入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值