SRS源码阅读(一)

SRS源码阅读(一)

SRS作为国人开发的一款高性能流媒体服务器,SRS的定位是运营级的互联网直播服务集群。想必大部分人都使用过,但是很多人也仅仅是停留在会使用的层面,正如原作者所说的,SRS是可以进行二次开发的,那么关于服务器整体是如何运转的我觉得对于一个从事流媒体开发者而言事关重要,因此对于SRS源码的解读就势在必行。

截至2020.8,SRS已经发布到3.0版本,具体可以查看官网link.

https://github.com/ossrs/srs

SRS目前的代码量已经达到十几万行,在linux系统下面阅读代码必定不方便,为了方便代码的阅读,我们可以采用本地的IDE进行阅读,作者采用的是Visual Studio 2019来阅读代码,界面如下:

在这里插入图片描述
下面就开始我们的源码阅读——SRS服务器的启动流程

阅读源码一般是先掌握整体思路,然后再抠细节。SRS服务器是C++写的,因此首先想到的是去寻找main()函数,SRS服务器的主程序是在 srs_main_server 下,如下

在这里插入图片描述
本文并不会一行行代码的解读,而是以一个大局观来解读整个SRS服务器在启动阶段的是如何操作的。

SRS服务器在启动阶段主要涉及配置文件config,日志文件log,启动服务server这三方面。按照源码的顺序,可以分为一下步骤

1、检查解析启动命令参数

在这里插入图片描述
检查解析启动命令参数主要利用的是下面这三个函数

parse_options():参数分析,提供一些帮助命令例如 -h等等
get_work_dir():工作路径获取
initialize_cwd():初始化工作路径
2、初始日志接口

在这里插入图片描述

Initialize():配置解析,初始化日志文件
3、检查配置文件是否正确

在这里插入图片描述

check_config():检查配置文件是否正确
4、创建 SrsServer服务,初始化一些变量

在这里插入图片描述

5、通过守护进程daemon检查是否后台运行还是控制台运行

在这里插入图片描述

6、初始化st 协程库,信息号管理器

在这里插入图片描述在这里插入图片描述

初始化信号管理器信号管理器主要接收外部的一些系统信号;然后做相应的处理,如修改配置后,发送信号,修改重新加载配置标记,主线程根据该标记重新加截配置。

7、如果后台运行写进程pid到文件

在这里插入图片描述

8、监听连接:

Listen()函数里面包含了对各个部分的监听,主要包含如下部分:
在这里插入图片描述

8.1 listen_rtmp: rtmp推流或拉流连接

在这里插入图片描述

8.2 listen_http_api: api请求连接

在这里插入图片描述

8.3 listen_http_stream: http拉流连接,http-flv,http-ts,http-aac,http-mp3

在这里插入图片描述

8.4 listen_stream_caster: 接收MpegTSOverUdp流请求,rtsp推流请求,http-flv推流请求

在这里插入图片描述

9、初始化http_ api接口处理

在这里插入图片描述

10、启动ingest协程,使用ffmpeg,拉取文件或流转发到本服务

在这里插入图片描述

跳转至函数ingest(),里面会有一个start()函数,进入该函数里面的clear_engines()函数,里面就是一些关于FFmpeg的操作。

11、启动主线程

在这里插入图片描述

主要是重新加载配置,更新时 间缓冲,更新CPU,内存,网络,磁盘使用情况,更新RTMP服务器状态网络流量,发送http心跳等等。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!感谢您的提问。srsLTE 是一个开源的 LTE 物理层库,用于实现 LTE 用户终端 (UE) 功能。下面是对 UE_02 的源码分析: UE_02 是 srsLTE 中的一个用户终端模块,实现了 UE 的基本功能。在源码中,UE_02 主要包含以下几个模块: 1. main_ue.c:这是 UE_02 的主要入口文件,定义了 UE 的初始化流程以及主循环。在 main_ue.c 中,会创建一个 UE 对象,并调用相关函数进行初始化和配置。 2. ue.c:这个文件实现了 UE 对象的创建和初始化。在 ue.c 中,会创建一个 UE 对象,并分配内存空间。然后,会调用相关函数进行 UE 参数的初始化和配置。 3. ue_sync.c:这个文件实现了 UE 的同步功能。在 ue_sync.c 中,会定义一些同步相关的函数,例如搜索主同步信号 (PSS) 和辅同步信号 (SSS),以及获取物理小区 ID 等。 4. ue_phy.c:这个文件实现了 UE 的物理层功能。在 ue_phy.c 中,会定义一些物理层相关的函数,例如解调接收到的物理信号以及进行物理信道解码等。 5. ue_mac.c:这个文件实现了 UE 的 MAC 层功能。在 ue_mac.c 中,会定义一些 MAC 层相关的函数,例如处理 RRC 连接请求消息,以及发送和接收数据等。 通过对这些模块的分析,您可以更深入地了解 UE_02 的源码实现和功能。希望对您有所帮助!如需进一步了解,建议您阅读 srsLTE 的官方文档或浏览其源代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值