SRS代码目录

news2025/4/21 7:52:07

代码目录:

src/目录下核心代码:
在这里插入图片描述

  • core:核心功能模块,包括日志、配置、错误处理等;
  • protocol:实现RTMP、HTTP-FLV、HLS等协议的模块;
  • app:应用层的实现,包括流的发布、播放、转码等功能;
  • kernel:底层实现,包括网络I/O、多线程处理等;
  • main:主层序入口

SRS启动:

main:

// src/main/srs_main_server.cpp
main()
{
	do_main();
}

do_main()
{
	// 初始化,new创建各种server和实例
	srs_global_initialize();
	// 启动线程池?
	SrsThreadPool::setup_thread_locals();
	// 加载conf配置
	_srs_config->parse_options(argc, argv);
	// 运行主程序
	run_directly_or_daemon();
}

srs_global_initialize: 初始化各种server

// src/app/srs_app_threads.cpp
srs_global_initialize()
{
	...
	// 全局变量 _srs_hybrid:
	// SrsHybridServer* _srs_hybrid = NULL;
	_srs_hybrid = new SrsHybridServer();
	...
}

run_directly_or_daemon: 开始运行

run_directly_or_daemon()
{
	// 我们没有配置为daemon
	...
	int pid = fork();
	if (pid > 0) {
		// 父进程直接退出
		exit(0);
	}
	// 继续第二次fork()
	pid = fork();
	if (pid > 0) {
		// 父进程退出
		exit(0);
	}

	// 在子进程中开启执行
	run_in_thread_pool();
}

run_in_thread_pool

run_in_thread_pool()
{
	// 初始化线程池
	_srs_thread_pool->initialize();
	// 创建run_hybrid_server 工作线程,用于RTMP、RTC server
	_srs_thread_pool->execute("hybrid", run_hybrid_server, (void*)NULL)
	// 循环执行线程池中的每个线程:
	_srs_thread_pool->run();
}

SRS中的线程:

SrsThreadPool 线程池类:

// src/app/srs_app_threads.hpp
class SrsThreadPool {
	//
	std::vector<SrsThreadEntry*> threads_;
	//
	std::vector<SrsThreadEntry*> hybrids_;
};

// 线程池构造函数中,先指定主线程(primordial thread)
// primordial thread并不是调用pthread_create()单独创建的,而是指向了当前调用线程
SrsThreadPool::SrsThreadPool() {
	entry_ = NULL;
    lock_ = new SrsThreadMutex();
    hybrid_ = NULL;

    // Add primordial thread, current thread itself.
    SrsThreadEntry* entry = new SrsThreadEntry();
    threads_.push_back(entry); // 插入到线程池中
    entry_ = entry;

    entry->pool = this;
    entry->label = "primordial";
    entry->start = NULL;
    entry->arg = NULL;
    entry->num = 1;
    entry->trd = pthread_self(); // 获取当前线程的tid
    entry->tid = gettid();

    char buf[256];
    snprintf(buf, sizeof(buf), "srs-master-%d", entry->num);
    entry->name = buf;

    pid_fd = -1;
}

SrsThreadEntry 线程类:

// src/app/srs_app_threads.hpp
class SrsThreadEntry {
	SrsThreadPool* pool; // 此线程所在的线程池
	pid_t 		tid;
	pthread_t 	trd;
	string		name;
	
	srs_error_t (*start)(void* arg); // 线程入口函数
	void* arg; // 线程入参
};

_srs_thread_pool是一个全局变量,启动时初始化:

SrsThreadPool* _srs_thread_pool = new SrsThreadPool();

SRS中的Server:

hybrid_server:

// 虚基类,为不同的server子类提供接口
// The hyrid server interfaces, we could register many servers.
class ISrsHybridServer {
public:
    ISrsHybridServer();
    virtual ~ISrsHybridServer();
public:
    virtual srs_error_t initialize() = 0;
    virtual srs_error_t run(SrsWaitGroup* wg) = 0;
    virtual void stop() = 0;
};

// 管理hybrid server的类
// The hybrid server manager.
class SrsHybridServer : public ISrsFastTimer {
private:
    std::vector<ISrsHybridServer*> servers; // 管理所有hybrid server
    SrsFastTimer* timer20ms_;
    ...

	virtual void register_server(ISrsHybridServer* svr);
};

SRS中hybrid server类型:

// The SRS server adapter, the master server.
class SrsServerAdapter : public ISrsHybridServer;
// The RTC server adapter.
class RtcServerAdapter : public ISrsHybridServer;
// The srt server adapter, the master server.
class SrsSrtServerAdapter : public ISrsHybridServer;

正如其类名中的“Adapter”所示,这些类是适配类,核心类型是其中真正的server,如SrsServerAdapter中的SrsServer成员、RtcServerAdapter中的SrsRtcServer成员。

SrsServer:

class SrsServerAdapter : public ISrsHybridServer {
private:
	SrsServer* srs;
public:
    SrsServerAdapter();	// new创建SrsServer
    virtual ~SrsServerAdapter();
public:
    virtual srs_error_t initialize();
    // 调用SrsServer中的initialize等函数完成初始化,并调用SrsServer->start()
    virtual srs_error_t run(SrsWaitGroup* wg); 
    virtual void stop();
public:
    virtual SrsServer* instance();
}; 

SrsServerAdapter::SrsServerAdapter()
{
    srs = new SrsServer();
}

SrsServer:

class SrsServer : public ISrsReloadHandler, public ISrsLiveSourceHandler, public ISrsTcpHandler
    , public ISrsResourceManager, public ISrsCoroutineHandler, public ISrsHourGlass
{
private:
	SrsHttpServer* http_server; // SrsServer中包含一个HttpServer
	SrsTcpListener* api_listener_;
	SrsTcpListener* http_listener_;
	SrsTcpListener* webrtc_listener_;
	...
};

SrsRtcServer:

class RtcServerAdapter : public ISrsHybridServer {
private:
	SrsRtcServer* rtc;
};

gdb:

使用 GDB 调试程序并传递命令行参数:

gdb --args ./objs/srs -c conf/srs.conf

禁用 LeakSanitizer(设置环境变量):

export LSAN_OPTIONS=detect_leaks=0

gdb与fork:

当程序中调用for()创建子进程时,gdb默认只会继续调试父进程,而会“分离”或忽略子进程。
这是因为gdb通常只调试一个进程。
如果需要控制gdb调试指定父进程或子进程,需要通过特定的调试设置来改变这一行为:

(gdb) set follow-fork-mode child  # 调试子进程
(gdb) set follow-fork-mode parent  # 调试父进程

查看当前follow-fork-mode的值:

(gdb) show follow-fork-mode

常用gdb命令:

c:continue,跳到下一个断点
n:next,调到下一个函数(不进入函数内部)
s:step,进入函数内部
finish:完成函数

r:从头开始

info threads: 查看当前有多少个线程
info inferiors: 查看当前有多少个进程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2291881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习--1.KNN机器学习入门

1、机器学习概述 1.1、什么是机器学习 机器学习&#xff08;Machine Learning&#xff09;是人工智能&#xff08;Artificial Intelligence&#xff09;领域的一个子集&#xff0c;它主要关注如何让计算机系统通过经验学习&#xff08;数据&#xff09;并自动改进性能。机器学…

Adaptive LLM Transformer²

看到了一个不错的论文https://arxiv.org/pdf/2501.06252 TRANSFORMER-SQUARED: SELF-ADAPTIVE LLMS 挺有意思的&#xff0c;是一家日本AI公司SakanaAI的论文&#xff08;我以前写过他们的不训练提升模型的能力的文章&#xff0c;感兴趣可以去翻&#xff09;它家有Lion Jones坐镇…

基于LabVIEW的Modbus-RTU设备通信失败问题分析与解决

在使用 LabVIEW 通过 Modbus-RTU 协议与工业设备进行通信时&#xff0c;可能遇到无法正常发送或接收指令的问题。常见原因包括协议参数配置错误、硬件连接问题、数据帧格式不正确等。本文以某 RGBW 控制器调光失败为例&#xff0c;提出了一种通用的排查思路&#xff0c;帮助开发…

直方图:摄影中的视觉数据指南

目录 一、直方图基础&#xff1a;揭开它的神秘面纱 二、解读直方图类型&#xff1a;亮度与色彩的密码 &#xff08;一&#xff09;亮度直方图 &#xff08;二&#xff09;RGB 直方图 三、拍摄中巧用直方图&#xff1a;优化曝光与效果 &#xff08;一&#xff09;精准判断曝…

IM 即时通讯系统-51-MPush开源实时消息推送系统

IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术&#xff0c;提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…

【Linux】从硬件到软件了解进程

个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程&#xff08;1&#xff09;简述&#xff08;2&#xff09;系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…

2024-我的学习成长之路

因为热爱&#xff0c;无畏山海

Kamailio 不通过 dmq 实现注册复制功能

春节期间找到一篇文章&#xff0c;需要 fg 才能看到&#xff1a; https://medium.com/tumalevich/kamailio-registration-replication-without-dmq-65e225f9a8a7 kamailio1 192.168.56.115 kamailio2 192.168.56.116 kamailio3 192.168.56.117 route[HANDLE_REPLICATION] {i…

大模型系列21-AI聊天机器人

聊天机器人 背景机器学习基础监督学习&#xff08;Supervised Learning&#xff09;概念应用场景主要问题 无监督学习&#xff08;Unsupervised Learning&#xff09;概念常见方法应用场景 强化学习&#xff08;Reinforcement Learning&#xff09;概念关键要素应用场景 模型优…

25.2.3 【洛谷】作为栈的复习不错(学习记录)

今天学习的东西不算多&#xff0c;放了一个星期假&#xff0c;感觉不少东西都没那么清楚&#xff0c;得复习一下才行。今天搞个栈题写&#xff0c;把栈复习一下&#xff0c;明天进入正轨&#xff0c;边复习边学习新东西&#xff0c;应该会有二叉树的学习等等... 【洛谷】P1449 …

Android开发工作经历整理

一.无人机应用软件开发 集成大疆官网的DJIMobileSDK到AS中编写软件&#xff0c;操控无人机执行多个航点任务。集成OpenCV库进行图像识别&#xff0c;通过获取参数&#xff0c;根据算法执行sdk&#xff0c;使无人机降落到机库&#xff0c;并执行后续的换电操作。待无人机就绪后…

C++中常用的十大排序方法之4——希尔排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之4——希尔排序的相…

自动驾驶---两轮自行车的自主导航

1 背景 无人驾驶汽车最早出现在DARPA的比赛中&#xff0c;从那个时刻开始&#xff0c;逐渐引起全球学者的注意&#xff0c;于是从上个世纪开始各大高校院所开始了无人汽车的研发。直到这两年&#xff0c;无人驾驶汽车才开始走进寻常百姓家&#xff0c;虽然目前市面上的乘用车还…

四、GPIO中断实现按键功能

4.1 GPIO简介 输入输出&#xff08;I/O&#xff09;是一个非常重要的概念。I/O泛指所有类型的输入输出端口&#xff0c;包括单向的端口如逻辑门电路的输入输出管脚和双向的GPIO端口。而GPIO&#xff08;General-Purpose Input/Output&#xff09;则是一个常见的术语&#xff0c…

PostgreSQL 数据备份与恢复:掌握 pg_dump 和 pg_restore 的最佳实践

title: PostgreSQL 数据备份与恢复:掌握 pg_dump 和 pg_restore 的最佳实践 date: 2025/1/28 updated: 2025/1/28 author: cmdragon excerpt: 在数据库管理中,备份与恢复是确保数据安全和业务连续性的关键措施。PostgreSQL 提供了一系列工具,以便于数据库管理员对数据进行…

自主Shell命令行解释器

什么是命令行 我们一直使用的"ls","cd","pwd","mkdir"等命令&#xff0c;都是在命令行上输入的&#xff0c;我们之前对于命令行的理解&#xff1a; 命令行是干啥的&#xff1f;是为我们做命令行解释的。 命令行这个东西实际上是我们…

XCCL、NCCL、HCCL通信库

XCCL提供的基本能力 XCCL提供的基本能力 不同的XCCL 针对不同的网络拓扑&#xff0c;实现的是不同的优化算法的&#xff08;不同CCL库最大的区别就是这&#xff09; 不同CCL库还会根据自己的硬件、系统&#xff0c;在底层上面对一些相对应的改动&#xff1b; 但是对上的API接口…

【Redis】安装配置Redis超详细教程 / Linux版

Linux安装配置Redis超详细教程 安装redis依赖安装redis启动redis停止redisredis.conf常见配置设置redis为后台启动修改redis监听地址设置工作目录修改密码监听的端口号数据库数量设置redis最大内存设置日志文件设置redis开机自动启动 学习视频&#xff1a;黑马程序员Redis入门到…

【大数据技术】教程05:本机DataGrip远程连接虚拟机MySQL/Hive

本机DataGrip远程连接虚拟机MySQL/Hive datagrip-2024.3.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本机的DataGrip连接虚拟机的MySQL数据库和Hive数据库,提高编程效率。 安装DataGrip 请按照以下步骤安装DataGrip软…

springboot 启动原理

目标&#xff1a; SpringBootApplication注解认识了解SpringBoot的启动流程 了解SpringFactoriesLoader对META-INF/spring.factories的反射加载认识AutoConfigurationImportSelector这个ImportSelector starter的认识和使用 目录 SpringBoot 启动原理SpringBootApplication 注…