crtmpserver 基本流程分析
近期在研究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和port开启监听器
gRs.pConfigFile->ConfigInstances()
配置多实例,win下不支持
gRs.pConfigFile->ConfigApplications()
将监听器与实例绑定
installQuitSignal
设置程序退出机制
Run
IOHandlerManager::Pulse()
对socket资源进行轮询,查询是否有须要进行读写的socket操作
2、接收client的连接请求之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、接收client的公布流之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、接收client请求实时流
这一段属于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)
然后将流输出绑定至流输入
crtmpserver 基本流程分析的更多相关文章
- 8、Struts2 运行流程分析
1.流程分析: 请求发送给 StrutsPrepareAndExecuteFilter StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 ...
- freeswitch呼叫流程分析
今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅. 整体结构图 FreeswitchCore 模块加载过程 freeswitch主程序初始化时会从mo ...
- u-boot 流程分析
u-boot 介绍: 对于计算机来说 , 从一开始上机通电是无法直接启动操作系统的 , 这中间需要一个引导过程 , 嵌入式Linux系统同样离不开引导程序 , 这个启动程序就叫启动加载程序(Boot ...
- thttpd和cgilua安装与运行流程分析
安装 参考如下博文安装thttpd软件 http://blog.csdn.net/21aspnet/article/details/7045845 http://blog.csdn.net/drago ...
- 【转】Hostapd工作流程分析
[转]Hostapd工作流程分析 转自:http://blog.chinaunix.net/uid-30081165-id-5290531.html Hostapd是一个运行在用户态的守护进程,可以通 ...
- u-boot中nandflash初始化流程分析(转)
u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...
- Android7.0 Phone应用源码分析(二) phone来电流程分析
接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...
- runc start container流程分析
1.runc/start.go Action: func(context *cli.Context) error 该函数首先调用container, err := getContainer(conte ...
- 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
退出Activity注册Android遍历 目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方 ...
随机推荐
- JetBrains公司的IDE使用技巧
1.自定义Live Templates: 点击+添加自己的.最后记住要点击,change或default来设置在哪些文件上使用代码片段.
- SqlServer CTE 递归查询 Oracle递归查询
在做数据库设计这块,很多时候表的数据模型就是典型的二叉树结构. 于是在查询数据的时候,就涉及到了数据的递归查询. 递归查询分为两种:1.从根节点查询自身以及所有的子节点:2.从子节点查询自身以及所有的 ...
- Hibernate 主键生成策略
表示符生成器 描述 Increment 由hibernate自动以递增的方式生成表识符,每次增量为1 Identity 由底层数据库生成表识符.条件是数据库支持自动增长数据类型. Sequence H ...
- Cloud Foundry中 JasperReports service集成
Cloud Foundry作为业界第一个开源的PaaS解决方案,正越来越多的被业界接受和认可.随着PaaS的发展,Cloud Foundry顺应潮流,充分发挥开源项目的特点,到目前为止,已经支持了大批 ...
- 『重构--改善既有代码的设计』读书笔记----Replace Method with Method Object
有时候,当你遇到一个大型函数,里面的临时变量和参数多的让你觉得根本无法进行Extract Method.重构中也大力的推荐短小函数的好处,它所带来的解释性,复用性让你收益无穷.但如果你遇到上种情况,你 ...
- webAPP前端必备知识
了解各浏览器内核 Firefox:-moz-box-shadow Safari:-webkit-box-shadow Opera:-o-box-shadow IE:-ms-box-shadow Web ...
- [转]JS继承的5种实现方式
参考链接: http://yahaitt.iteye.com/blog/250338 虽说书上都讲过继承的方式方法,但这些东西每看一遍都多少有点新收获,所以单独拿出来放着. 1. 对象冒充 funct ...
- WordPress网站更换老鹰主机详细操作
眼看着之前买的虚拟主机就要到期了,本着节约至上的美德,就和同事一起买了老鹰主机.因为第一次网站的配置是一个朋友帮忙的,所以现在想完全自己动手操作,毕竟之后的博客维护还是得靠自己.下面就来和我一起学习怎 ...
- 【转】Java中本地时间的获取方法--不错
原文网址:http://highforest.blog.51cto.com/125539/842496/ 熟悉Oracle数据库的人,应该知道:select to_char(sysdate,'yyyy ...
- (转载)php之call_user_func_array的简易用法
(转载)http://www.cnitblog.com/neatstudio/archive/2006/07/21/13990.html php之call_user_func_array的简易用法 今 ...