![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
SRS原理
文章平均质量分 68
Loken2020
音视频工程师,《FFmpeg原理》作者
展开
-
SRS的混合服务SrsHybridServer—SRS源码分析
顾名思义,就是混合服务,目前他里面有 3 个 Server 服务,分别是。我也不知道这种设计模式叫什么名称,如果有读者知道,请告知我补充上去。下面简单介绍一下 3 个 Server 服务的功能。初始化方法的时候,就会同时遍历所有的。方法的时候,就会同时遍历所有的。实际上是一个管理器,原创 2023-12-26 08:25:37 · 527 阅读 · 0 评论 -
SRS的定时器模块SrsFastTimer—SRS源码分析
SRS 的定时器是,它跟类似,也是继承的,所以他也是一个Handler。也有一个trd_字段来代表 协程实例,不过他这里的命名我觉得有点不规范,在明明用的是trd,这里又是trd_,多了一个下划线后缀。上图的interval_是间隔的意思,就是定时器每隔多久运行一次。整个套路跟以前的模块都是比较类似的,因为定时器是共用的协程,多个功能同时用一个定时器协程的,所以他用subscribe订阅加到handlers这个vector里面执行各自功能模块的on_timer()定时器事件。原创 2023-12-26 08:25:05 · 140 阅读 · 0 评论 -
SRS的信号处理模块SrsSignalManager—SRS源码分析
就是 SRS 的信号处理模块,他的主要逻辑是把 信号事件 转换成 IO 事件,这样就能用协程来处理了。关于 信号 转 IO 可以阅读之前的文章《模块使用的是 SRS 封装 StateThreads 协程之后的 API,也就是《》介绍的方法。实际上是一个Handler,因为它继承的是。SRS 封装后的协程的用法是在构造函数里面把 Handler 注册进去然后协程内部会调创建一个协程,最终会运行Handler的cycle() 方法,如下:下面介绍一下类里面一些重点字段跟方法。原创 2023-12-26 08:24:31 · 163 阅读 · 0 评论 -
SRS的线程池介绍SrsThreadPool—SRS源码分析
SRS 里面跟线程池相关的数据结构是,他们的关系如下:刚开始看这个这个结构的时候,我以为 SRS 的线程池的设计是,预先创建一堆线程,然后把任务丢进去,根据任务的数量或者相关的情况去自动消耗线程,但后来我发现,SRS 的线程池设计并没有那么复杂,他很简单的。类就是单个线程的信息,它的start()函数就是执行的具体的任务。而类可以理解为线程的管理器,字段是一个vector数组,负责管理所有的线程。类的execute函数就负责创建一个 新的线程实例run()函数负责定时监控所有线程的状态。原创 2023-12-26 08:23:53 · 132 阅读 · 0 评论 -
SRS的协程ID-SrsContextId—SRS源码分析
SRS 给每个协程都赋予了一个 ID(),由于 SRS 每处理一个 RTMP 客户端连接,都使用一个协程,所以这个 ID 也可以理解为 连接ID,连接ID 就是的 ID,这样可以追踪到具体是哪个客户端出现的问题。协程ID在两个地方都有存储的。cid_原创 2023-12-26 08:22:55 · 97 阅读 · 0 评论 -
SRS对StateThreads的封装—SRS源码分析
的设计有点不太好理解,其实他使用的是 empty object 设计模式,就是一个空的对象,里面的。是一个比较好的示例模块,代码比较短,如果你想创建一个新的模块,可以把。应该是在某些动态创建协程的场景有用,这部分内容后面再继续补充。如果你想创建一个协程服务,首先,你需要让你的类继承。方法,他内部最终会创建一个协程来运行你的。实例最后是会被释放的,然后重新用。里面了,最后会启动一个协程执行。可以说就是 SRS 封装。本文的第一张图片里面有一个。之后提供的外部接口类。其实跟之前的区别就是,原创 2023-12-25 21:00:57 · 69 阅读 · 0 评论 -
SRS的错误处理SrsCplxError—SRS源码分析
是 SRS 的错误处理类,可以发现,大部分函数,它的返回值都是是的别名。类的使用是比较简单的,下面介绍一下类里面的字段与方法。原创 2023-12-25 21:00:04 · 122 阅读 · 0 评论 -
SRS的日志文件模块SrsFileLog—SRS源码分析
经过多层函数调用之后,最后会遍历每一个 订阅者(subscriber)来执行各种 reload 方法。类里面的其他方法相对来说比较简单,读者执行阅读源码就行,他的注释也非常全。关于 SRS 日志的基本介绍以及 切割等功能,请阅读 SRS 官方文档《里面有一些日志文件存储路径,存储方式等配置,这些配置可以通过。,但是他并没有实现接口里的任何一个方法,我测试了一下修改。的整体逻辑是这样的,会有一个协程。接口比较简单,这里就不说了。我估计他的用法与逻辑是这样的,编译一下,会报以下错误。的修改并没有生效,还是。原创 2023-12-25 20:59:27 · 168 阅读 · 0 评论 -
SRS的配置文件模块SrsConfig—SRS源码分析
SRS 的信号处理也是一个比较有趣的设计,他会把信号事件 传递给 pipe 管道,因为 pipe 是 IO 操作,所以就可以用协程来处理了。配置文件的代码还是比较简单的,稍微比较复杂的是 配置文件的 reload 功能。你看一遍他的代码注释,然后自己断点调试一下,就知道是解析处理之后的结果是怎样的了。以外的配置选项进行热加载,但是我测试下来还是有一些配置是不支持热加载的,例如。命令行参数的解析逻辑比较简单,这里就不说了,跳过。开头的,这是 SRS 的命名习惯。开头的,而订阅者里面的方法是。原创 2023-12-25 20:58:54 · 321 阅读 · 0 评论 -
SRS的启动过程main—SRS源码分析
阅读开源项目的代码,有一些技巧与经验分享给大家。1,首先不要从头文件一个一个看,想一下子把所有变量的含义都搞明白。我以前也用这个方式,后来发现效率太低。变量的含义跟作用应该是要从代码逻辑里面一点点调试来想出来的。基本上,一些比较复杂的变量,你很难从头文件的注释就能立马看懂它的含义。2,直接找到 main 入口函数,然后直接往下读。用到哪个变量 函数,你再具体去看特定的变量跟函数。。但是大项目,肯定是有很多逻辑分支的,所以你需要控制好主线,先把项目的架构,模块整理出来,然后逐个击破。原创 2023-12-25 20:58:23 · 112 阅读 · 0 评论 -
SRS的编译过程分析configure—SRS源码分析
SRS 的configure只有 800 行,相对于 FFmpeg 的 8000 行configure,还是比较简单的,他的主要流程如下:本文主要提取一些重点来讲解一下。原创 2023-12-25 20:57:44 · 216 阅读 · 0 评论 -
SRS对StateThreads的多线程改造—SRS对StateThreads的改进与完善
关键字的实现跟链接器(ld)、动态链接器(ld.so)和系统库(libc.so 和 libpthread.so)有很大的关联,所以不是什么平台都能使用。(虚拟进程)变量的地址,会发现每个线程的虚拟进程变量的地址都是不一样的。》一文中,讲解了为什么 StateThreads 不支持多线程,要利用 CPU 多核,只能用。版本的 StateThreads,就能看到多线程的代码,其实改动并不大,全都在这个。修饰全局变量之后,就相当于每个 线程都有一个自己的全局变量,相互之间不影响,关于。解决了全局变量的问题。原创 2023-12-25 20:56:26 · 167 阅读 · 0 评论 -
使用Valgrind检查StateThreads内存泄漏—SRS对StateThreads的改进与完善
不过这个功能基本用不到了,SRS 现在内存泄漏使用的是 asan,不再用 Valgrind 了,推荐阅读《不过协程上下文切换的时候 Valgrind 报了一个 Warning,我们开启。往 Valgrind 注册一下堆栈,然后退出协程的时候用。复制完成之后,然后只需要在编译的时候加上一个宏。之后,这个 Warning 就会消失了。之后,Valgrind 的检测会更准确。贡献的,SRS 把他合并过来了,整个。其实很小,我们可以直接手动把它复制过。实际上就是在创建协程的时候用。这两个函数的用法推荐阅读《原创 2023-12-25 20:55:43 · 71 阅读 · 0 评论 -
srs.py调试脚本介绍—SRS对StateThreads的改进与完善
前面《》,已经介绍了如何查看协程数量,遍历协程,通过 EBP 寄存器去查看协程的函数调用层级。不过这样手敲命令,还是比较麻烦。有没一种更自动化一点的方法呢?答:有,就是脚本,这是一个 python 写的脚本,主要是调 GDB 的 API 完成一些功能,所以这个脚本只能在 GDB 窗口里运行,千万不要用 python 命令直接运行这个脚本,没用的。我们把脚本下载下来,然后放到st-1.9目录里,如下:然后我们就能在 clion 的 GDB 窗口用source命令导入这个srs.py当srs.py。原创 2023-12-25 20:55:04 · 52 阅读 · 0 评论 -
StateThreads对RISCV、龙芯等CPU架构的支持—SRS对StateThreads的改进与完善
这个地址的代码我感觉是杨成立从 SRS 里面把 StateThreads 扣出来弄成一个项目的。让 StateThreads 支持新的 CPU 架构,只需要实现下面 3 个函数就行了。StateThreads 官网最后一个版本是 1.9,而 SRS 改造后的版本是。这个地址的 StateThreads 代码是更新更丰富的,而。里面就有 RISCV、龙芯 架构的。有时候又调用的是 C 标准库的。全部都用汇编来实现,不同的平台。RISCV、龙芯 架构的实现是在。不像 1.9 版本,原创 2023-12-25 20:54:33 · 47 阅读 · 0 评论 -
自定义jmpbuf结构—SRS对StateThreads的改进与完善
所以 SRS 为了保证系统的 鲁棒性 跟 扩展性,自己定义了。的全称其实是 jump buffer,存储的是。也就是协程的上下文。在不同的平台内部实现不一样,而且如果。的内存布局,就不能用了。原来 1.9 版本的。字段的结构已经变了。原创 2023-12-25 20:53:58 · 82 阅读 · 0 评论 -
ST协程切换回调介绍—StateThreads协程源码分析
可以看到,一共进行了 6 次协程切换。不过 switch_out 的日志 比 switch_in 多了几条,不是应该一样的吗?StateThreads 提供了一个协程切换回调功能,当切走 协程的时候 会执行。协程切换回调 的原理是这样的,我们注册回调函数,只是设置两个变量。注册这两个回调函数,这样可以对协程切换进行 hook 操作。这个我觉得是这个回调的机制不太完成,具体的原因请阅读《,这两个变量是 函数指针 来的。的时候,就会调用这两次回调函数。函数,到恢复协程的时候 会执行。原创 2023-12-25 20:53:24 · 65 阅读 · 0 评论 -
st_thread_join协程间通信介绍—StateThreads基础函数介绍
函数来等待一个线程的结束。StateThread 也为我们提供了一个。在进行多线程编程的时候,我们通常会使用。参数设置为 1,这样这个协程才是可以。然后参考前面的文章修改一下。函数来等待某个协程的结束。创建协程的时候,必须把。的内部实现分析,请阅读《原创 2023-12-25 20:52:43 · 38 阅读 · 0 评论 -
st_thread_interrupt中断协程介绍—StateThreads协程源码分析
函数用于中断一个正在阻塞的协程,例如 协程A 阻塞在。函数来让这个 协程A 停止等待,立即返回,这就是中断。是无法正常退出的,是因为其他 2 个协程一直阻塞在。里面等待网络数据到来。如果你不想等了,就可以用。可以看到程序正常退出了。正常收到通知被唤醒的。来中断其他两个协程,让程序可以正常退出。里等待条件变量的通知,或者 阻塞在。返回的是 0 ,而被中断的唤醒的。函数可以只等待指定的时间就立即返回。的修改规则,请参考前面的文章。,所以导致整个线程无法退出。原创 2023-12-25 20:51:50 · 56 阅读 · 0 评论 -
st_cond_wait协程间通信介绍—StateThreads基础函数介绍
我们在进行多线程编程的时候,有时候我们需要设计一个 生产者线程 跟 消费者线程,然后他们之间通过 pthread_cond_signal() 跟 pthread_cond_wait() 进行通信。原创 2023-12-25 20:47:27 · 56 阅读 · 0 评论 -
st_mutex_lock协程锁介绍—StateThreads基础函数介绍
当使用多线程编程的时候,有时候为了保证 共享数据的一致性,会使用到线程锁 pthread_mutex_lock() 函数。StateThreads 也提供了一个类似的函数 st_mutex_lock() 协程锁。原创 2023-12-21 10:26:25 · 62 阅读 · 0 评论 -
HTTP服务器server程序-u参数分析—StateThreads示例程序介绍
本文主要介绍 HTTP服务器 server 程序的一些常用选项,以及它是如何实现的。原创 2023-12-21 10:24:36 · 48 阅读 · 0 评论 -
HTTP服务器server程序日志处理—StateThreads示例程序介绍
HTTP服务器server程序日志处理原创 2023-12-21 10:24:00 · 51 阅读 · 0 评论 -
HTTP服务器server程序信号处理—StateThreads示例程序介绍
server 程序默认会开多进程,这里面有一个父级进程 与 多个子进程。但是无论是 父进程 还是 子进程,他们都需要处理信号。原创 2023-12-21 10:23:26 · 46 阅读 · 0 评论 -
HTTP服务器server架构分析—StateThreads示例程序介绍
server 是官网提供的示例程序,演示了如何使用 StateThread 协程来实现一个 HTTP 服务器原创 2023-12-21 10:22:47 · 100 阅读 · 0 评论 -
HTTP服务器server程序调试—StateThreads示例程序介绍
server 是官网提供的示例程序,演示了如何使用 StateThread 协程来实现一个 HTTP 服务器原创 2023-12-21 10:21:11 · 157 阅读 · 0 评论 -
HTTP服务器server程序介绍—StateThreads示例程序介绍
server 是官网提供的示例程序,演示了如何使用 StateThread 协程来实现一个 HTTP 服务器,下面就来演示一下 server 程序的基本用法。原创 2023-12-21 10:20:31 · 88 阅读 · 0 评论 -
TCP代理服务器proxy程序分析
proxy 是官网提供的示例程序,演示了如何使用 StateThread 协程来实现一个 TCP 代理服务器,也就是一个 TCP 流量转发程序。原创 2023-12-21 10:19:58 · 387 阅读 · 0 评论 -
DNS查询lookupdns程序分析-下—StateThreads示例程序介绍
lookupdns 是 StateThreads 官网提供的一个示例程序,用协程来并发查询 多个域名 IP 信息原创 2023-12-21 10:19:25 · 87 阅读 · 0 评论 -
DNS查询lookupdns程序分析-上—StateThreads示例程序介绍
lookupdns 是 StateThreads 官网提供的一个示例程序,用协程来并发查询 多个域名 IP 信息原创 2023-12-21 10:18:24 · 38 阅读 · 0 评论 -
StateThreads示例程序介绍
StateThreads 是一个协程库,也可以说是一个协程框架。他提供了很多函数 API 给我们使用的,同时官方也有很丰富的。但是仅仅有文档还是不够的,编程这个领域最重要的是实战,所以官方又提供了以下 3 个示例程序给我们理解 API 函数的用法。上面的示例都是使用 StateThreads 协程来实现的,性能强悍。原创 2023-12-21 10:17:33 · 41 阅读 · 0 评论 -
clion高级调试功能介绍—StateThreads调试
clion高级调试功能介绍原创 2023-12-21 10:17:07 · 241 阅读 · 0 评论 -
StateThreads高级调试—StateThreads调试
在前面《StateThreads调试环境搭建》里,我们虽然可以断点调试 loopupdns 了,但是由于 clion 无法解析 StateThreads 的 Makefile 的代码原创 2023-12-21 10:14:05 · 39 阅读 · 0 评论 -
StateThreads调试环境搭建—StateThreads调试
StateThreads 的 clion 调试环境搭建原创 2023-12-21 10:12:01 · 481 阅读 · 0 评论 -
SRS的第一本书出来了
如果你想了解 协程的实现原理,那你可以看这本书;如果你想学习 RTMP,WebRTC 流媒体,你也可以看这本书;如果你想二次开发 SRS,那你一定要看这本书。原创 2023-11-15 02:36:29 · 819 阅读 · 0 评论