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心跳等等。