近期在研究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 基本流程分析的更多相关文章

  1. 8、Struts2 运行流程分析

    1.流程分析: 请求发送给 StrutsPrepareAndExecuteFilter StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 ...

  2. freeswitch呼叫流程分析

    今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅. 整体结构图 FreeswitchCore 模块加载过程 freeswitch主程序初始化时会从mo ...

  3. u-boot 流程分析

    u-boot 介绍: 对于计算机来说 , 从一开始上机通电是无法直接启动操作系统的 , 这中间需要一个引导过程 , 嵌入式Linux系统同样离不开引导程序 ,  这个启动程序就叫启动加载程序(Boot ...

  4. thttpd和cgilua安装与运行流程分析

    安装 参考如下博文安装thttpd软件 http://blog.csdn.net/21aspnet/article/details/7045845 http://blog.csdn.net/drago ...

  5. 【转】Hostapd工作流程分析

    [转]Hostapd工作流程分析 转自:http://blog.chinaunix.net/uid-30081165-id-5290531.html Hostapd是一个运行在用户态的守护进程,可以通 ...

  6. u-boot中nandflash初始化流程分析(转)

    u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...

  7. Android7.0 Phone应用源码分析(二) phone来电流程分析

    接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...

  8. runc start container流程分析

    1.runc/start.go Action: func(context *cli.Context) error 该函数首先调用container, err := getContainer(conte ...

  9. 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)

      退出Activity注册Android遍历   目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方 ...

随机推荐

  1. (转)Android Touch事件传递机制

    -----来源:http://www.trinea.cn/android/touch-event-delivery-mechanism/ 介绍Android Touch事件的传递机制. 不少朋友私信问 ...

  2. FFMPEG 截取RTMP直播流图片命令

    CentOS 6.5  yum安装FFMPEG步骤 1. 手动添加yum源配置 vi /etc/yum.repos.d/dag.repo   [dag] name=Dag RPM Repository ...

  3. UVA 10131 - Is Bigger Smarter? (动态规划)

    Is Bigger Smarter? The Problem Some people think that the bigger an elephant is, the smarter it is. ...

  4. Linux 4.1内核编译报告

    编译环境 Arch Linux on VirtualBox 下载内核 https://www.kernel.org/ 下载的内核压缩包,此时的最新内核版本为4.1: 解压包 # tar -xvJf l ...

  5. Cookie、LocalStorge、SesstionStorge 的区别和用法

    前言 总括:详细讲述Cookie.LocalStorge.SesstionStorge的区别和用法. 1. 各种存储方案的简单对比 Cookies:浏览器均支持,容量为4KB UserData:仅IE ...

  6. 解决VS2010使用comboBox死机问题

    今天,在10下使用combobox总是不响应,原来是和翻译软件冲突,关掉有道立即解决.

  7. Codeforces 138D World of Darkraft

    有一个n*m 的棋盘,每个点上标记了L,R,X 中的一个每次能选择一个没有被攻击过的点(i,j),从这个点开始发射线,射线形状为:1. 若字符是 L,向左下角和右上角发,遇到被攻击过的点就停下来2. ...

  8. PHP 5.6正式发布:新特性、及功能改进介绍

    经过了长时间的开发测试,新版本PHP程序(PHP5.6正式版)终于发布了.新版本中加入了一些实用的新特性,也摒弃了一些冗余的功能.同时,也对部分原有功能进行了改进.下面就一起看看PHP 5.6正式版到 ...

  9. 『Python』 多线程 端口扫描器

    0x 00 Before Coding 当端口打开时,向端口发送 TCP SYN 请求,会返回一个 ACK 响应: 当端口关闭,返回的是 RST 响应: 0x 01 Coding  可以用 socke ...

  10. c# 接口代码实例

    类和接口的实现 接口定义:为一组方法签名指定一个名称的方式. 类实现接口,就一定要提供接口所有方法的实现. 即使抽象类,也要全部实现,但是,它可以把接口方法声明为abstract的,从而把这个接口方法 ...