自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(242)
  • 收藏
  • 关注

原创 SRS的第一本书出来了

如果你想了解 协程的实现原理,那你可以看这本书;如果你想学习 RTMP,WebRTC 流媒体,你也可以看这本书;如果你想二次开发 SRS,那你一定要看这本书。

2023-11-15 02:36:29 1137

原创 《FFmpeg原理》的创作之路

《FFmpeg原理》的创作之路—写作不是思考的记录,写作就是思考本身

2023-06-20 23:48:28 5267 9

原创 《FFmpeg原理》第一版完成了

本书《FFmpeg原理》主要讲解 FFmpeg 原理性的知识,前面几章主要讲解一些音视频开发的基础知识,例如原始数据 YUV 跟 RGB,封装格式 FLV 跟 MP4 ,压缩编码的基本概念,还有封装格式分析。前面几章是音视频开发,流媒体技术的基础,后面的章节主要讲解如何搭建 FFmpeg 各种调试环境,同时提供 FFmpeg API 函数的使用示例,最重要的是 分析 ffmpeg.c 跟 ffplay.c 的源码逻辑。.........

2022-06-13 02:13:41 2403 3

原创 SRS的混合服务SrsHybridServer—SRS源码分析

顾名思义,就是混合服务,目前他里面有 3 个 Server 服务,分别是。我也不知道这种设计模式叫什么名称,如果有读者知道,请告知我补充上去。下面简单介绍一下 3 个 Server 服务的功能。初始化方法的时候,就会同时遍历所有的。方法的时候,就会同时遍历所有的。实际上是一个管理器,

2023-12-26 08:25:37 645

原创 SRS的定时器模块SrsFastTimer—SRS源码分析

SRS 的定时器是,它跟类似,也是继承的,所以他也是一个Handler。也有一个trd_字段来代表 协程实例,不过他这里的命名我觉得有点不规范,在明明用的是trd,这里又是trd_,多了一个下划线后缀。上图的interval_是间隔的意思,就是定时器每隔多久运行一次。整个套路跟以前的模块都是比较类似的,因为定时器是共用的协程,多个功能同时用一个定时器协程的,所以他用subscribe订阅加到handlers这个vector里面执行各自功能模块的on_timer()定时器事件。

2023-12-26 08:25:05 234

原创 SRS的信号处理模块SrsSignalManager—SRS源码分析

就是 SRS 的信号处理模块,他的主要逻辑是把 信号事件 转换成 IO 事件,这样就能用协程来处理了。关于 信号 转 IO 可以阅读之前的文章《模块使用的是 SRS 封装 StateThreads 协程之后的 API,也就是《》介绍的方法。实际上是一个Handler,因为它继承的是。SRS 封装后的协程的用法是在构造函数里面把 Handler 注册进去然后协程内部会调创建一个协程,最终会运行Handler的cycle() 方法,如下:下面介绍一下类里面一些重点字段跟方法。

2023-12-26 08:24:31 276

原创 SRS的线程池介绍SrsThreadPool—SRS源码分析

SRS 里面跟线程池相关的数据结构是,他们的关系如下:刚开始看这个这个结构的时候,我以为 SRS 的线程池的设计是,预先创建一堆线程,然后把任务丢进去,根据任务的数量或者相关的情况去自动消耗线程,但后来我发现,SRS 的线程池设计并没有那么复杂,他很简单的。类就是单个线程的信息,它的start()函数就是执行的具体的任务。而类可以理解为线程的管理器,字段是一个vector数组,负责管理所有的线程。类的execute函数就负责创建一个 新的线程实例run()函数负责定时监控所有线程的状态。

2023-12-26 08:23:53 256

原创 SRS的协程ID-SrsContextId—SRS源码分析

SRS 给每个协程都赋予了一个 ID(),由于 SRS 每处理一个 RTMP 客户端连接,都使用一个协程,所以这个 ID 也可以理解为 连接ID,连接ID 就是的 ID,这样可以追踪到具体是哪个客户端出现的问题。协程ID在两个地方都有存储的。cid_

2023-12-26 08:22:55 207

原创 SRS对StateThreads的封装—SRS源码分析

的设计有点不太好理解,其实他使用的是 empty object 设计模式,就是一个空的对象,里面的。是一个比较好的示例模块,代码比较短,如果你想创建一个新的模块,可以把。应该是在某些动态创建协程的场景有用,这部分内容后面再继续补充。如果你想创建一个协程服务,首先,你需要让你的类继承。方法,他内部最终会创建一个协程来运行你的。实例最后是会被释放的,然后重新用。里面了,最后会启动一个协程执行。可以说就是 SRS 封装。本文的第一张图片里面有一个。之后提供的外部接口类。其实跟之前的区别就是,

2023-12-25 21:00:57 131

原创 SRS的错误处理SrsCplxError—SRS源码分析

是 SRS 的错误处理类,可以发现,大部分函数,它的返回值都是是的别名。类的使用是比较简单的,下面介绍一下类里面的字段与方法。

2023-12-25 21:00:04 291

原创 SRS的日志文件模块SrsFileLog—SRS源码分析

经过多层函数调用之后,最后会遍历每一个 订阅者(subscriber)来执行各种 reload 方法。类里面的其他方法相对来说比较简单,读者执行阅读源码就行,他的注释也非常全。关于 SRS 日志的基本介绍以及 切割等功能,请阅读 SRS 官方文档《里面有一些日志文件存储路径,存储方式等配置,这些配置可以通过。,但是他并没有实现接口里的任何一个方法,我测试了一下修改。的整体逻辑是这样的,会有一个协程。接口比较简单,这里就不说了。我估计他的用法与逻辑是这样的,编译一下,会报以下错误。的修改并没有生效,还是。

2023-12-25 20:59:27 276

原创 SRS的配置文件模块SrsConfig—SRS源码分析

SRS 的信号处理也是一个比较有趣的设计,他会把信号事件 传递给 pipe 管道,因为 pipe 是 IO 操作,所以就可以用协程来处理了。配置文件的代码还是比较简单的,稍微比较复杂的是 配置文件的 reload 功能。你看一遍他的代码注释,然后自己断点调试一下,就知道是解析处理之后的结果是怎样的了。以外的配置选项进行热加载,但是我测试下来还是有一些配置是不支持热加载的,例如。命令行参数的解析逻辑比较简单,这里就不说了,跳过。开头的,这是 SRS 的命名习惯。开头的,而订阅者里面的方法是。

2023-12-25 20:58:54 763

原创 SRS的启动过程main—SRS源码分析

阅读开源项目的代码,有一些技巧与经验分享给大家。1,首先不要从头文件一个一个看,想一下子把所有变量的含义都搞明白。我以前也用这个方式,后来发现效率太低。变量的含义跟作用应该是要从代码逻辑里面一点点调试来想出来的。基本上,一些比较复杂的变量,你很难从头文件的注释就能立马看懂它的含义。2,直接找到 main 入口函数,然后直接往下读。用到哪个变量 函数,你再具体去看特定的变量跟函数。。但是大项目,肯定是有很多逻辑分支的,所以你需要控制好主线,先把项目的架构,模块整理出来,然后逐个击破。

2023-12-25 20:58:23 222

原创 SRS的编译过程分析configure—SRS源码分析

SRS 的configure只有 800 行,相对于 FFmpeg 的 8000 行configure,还是比较简单的,他的主要流程如下:本文主要提取一些重点来讲解一下。

2023-12-25 20:57:44 353

原创 SRS对StateThreads的多线程改造—SRS对StateThreads的改进与完善

关键字的实现跟链接器(ld)、动态链接器(ld.so)和系统库(libc.so 和 libpthread.so)有很大的关联,所以不是什么平台都能使用。(虚拟进程)变量的地址,会发现每个线程的虚拟进程变量的地址都是不一样的。》一文中,讲解了为什么 StateThreads 不支持多线程,要利用 CPU 多核,只能用。版本的 StateThreads,就能看到多线程的代码,其实改动并不大,全都在这个。修饰全局变量之后,就相当于每个 线程都有一个自己的全局变量,相互之间不影响,关于。解决了全局变量的问题。

2023-12-25 20:56:26 283

原创 使用Valgrind检查StateThreads内存泄漏—SRS对StateThreads的改进与完善

不过这个功能基本用不到了,SRS 现在内存泄漏使用的是 asan,不再用 Valgrind 了,推荐阅读《不过协程上下文切换的时候 Valgrind 报了一个 Warning,我们开启。往 Valgrind 注册一下堆栈,然后退出协程的时候用。复制完成之后,然后只需要在编译的时候加上一个宏。之后,这个 Warning 就会消失了。之后,Valgrind 的检测会更准确。贡献的,SRS 把他合并过来了,整个。其实很小,我们可以直接手动把它复制过。实际上就是在创建协程的时候用。这两个函数的用法推荐阅读《

2023-12-25 20:55:43 151

原创 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 123

原创 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 98

原创 自定义jmpbuf结构—SRS对StateThreads的改进与完善

所以 SRS 为了保证系统的 鲁棒性 跟 扩展性,自己定义了。的全称其实是 jump buffer,存储的是。也就是协程的上下文。在不同的平台内部实现不一样,而且如果。的内存布局,就不能用了。原来 1.9 版本的。字段的结构已经变了。

2023-12-25 20:53:58 150

原创 ST协程切换回调介绍—StateThreads协程源码分析

可以看到,一共进行了 6 次协程切换。不过 switch_out 的日志 比 switch_in 多了几条,不是应该一样的吗?StateThreads 提供了一个协程切换回调功能,当切走 协程的时候 会执行。协程切换回调 的原理是这样的,我们注册回调函数,只是设置两个变量。注册这两个回调函数,这样可以对协程切换进行 hook 操作。这个我觉得是这个回调的机制不太完成,具体的原因请阅读《,这两个变量是 函数指针 来的。的时候,就会调用这两次回调函数。函数,到恢复协程的时候 会执行。

2023-12-25 20:53:24 118

原创 st_thread_join协程间通信介绍—StateThreads基础函数介绍

函数来等待一个线程的结束。StateThread 也为我们提供了一个。在进行多线程编程的时候,我们通常会使用。参数设置为 1,这样这个协程才是可以。然后参考前面的文章修改一下。函数来等待某个协程的结束。创建协程的时候,必须把。的内部实现分析,请阅读《

2023-12-25 20:52:43 92

原创 st_thread_interrupt中断协程介绍—StateThreads协程源码分析

函数用于中断一个正在阻塞的协程,例如 协程A 阻塞在。函数来让这个 协程A 停止等待,立即返回,这就是中断。是无法正常退出的,是因为其他 2 个协程一直阻塞在。里面等待网络数据到来。如果你不想等了,就可以用。可以看到程序正常退出了。正常收到通知被唤醒的。来中断其他两个协程,让程序可以正常退出。里等待条件变量的通知,或者 阻塞在。返回的是 0 ,而被中断的唤醒的。函数可以只等待指定的时间就立即返回。的修改规则,请参考前面的文章。,所以导致整个线程无法退出。

2023-12-25 20:51:50 93

原创 st_cond_wait协程间通信介绍—StateThreads基础函数介绍

我们在进行多线程编程的时候,有时候我们需要设计一个 生产者线程 跟 消费者线程,然后他们之间通过 pthread_cond_signal() 跟 pthread_cond_wait() 进行通信。

2023-12-25 20:47:27 121

原创 st_mutex_lock协程锁介绍—StateThreads基础函数介绍

当使用多线程编程的时候,有时候为了保证 共享数据的一致性,会使用到线程锁 pthread_mutex_lock() 函数。StateThreads 也提供了一个类似的函数 st_mutex_lock() 协程锁。

2023-12-21 10:26:25 116

原创 st_usleep函数介绍—StateThreads基础函数介绍

StateThreads 库提供了 st_usleep() 函数,使用这个函数,就可以让某个协程休眠一段时间,但是又不会阻塞其他的协程函数的执行。

2023-12-21 10:25:33 81

原创 HTTP服务器server程序-u参数分析—StateThreads示例程序介绍

本文主要介绍 HTTP服务器 server 程序的一些常用选项,以及它是如何实现的。

2023-12-21 10:24:36 97

原创 HTTP服务器server程序日志处理—StateThreads示例程序介绍

HTTP服务器server程序日志处理

2023-12-21 10:24:00 91

原创 HTTP服务器server程序信号处理—StateThreads示例程序介绍

server 程序默认会开多进程,这里面有一个父级进程 与 多个子进程。但是无论是 父进程 还是 子进程,他们都需要处理信号。

2023-12-21 10:23:26 83

原创 HTTP服务器server架构分析—StateThreads示例程序介绍

server 是官网提供的示例程序,演示了如何使用 StateThread 协程来实现一个 HTTP 服务器

2023-12-21 10:22:47 185

原创 HTTP服务器server程序调试—StateThreads示例程序介绍

server 是官网提供的示例程序,演示了如何使用 StateThread 协程来实现一个 HTTP 服务器

2023-12-21 10:21:11 259

原创 HTTP服务器server程序介绍—StateThreads示例程序介绍

server 是官网提供的示例程序,演示了如何使用 StateThread 协程来实现一个 HTTP 服务器,下面就来演示一下 server 程序的基本用法。

2023-12-21 10:20:31 216

原创 TCP代理服务器proxy程序分析

proxy 是官网提供的示例程序,演示了如何使用 StateThread 协程来实现一个 TCP 代理服务器,也就是一个 TCP 流量转发程序。

2023-12-21 10:19:58 852

原创 DNS查询lookupdns程序分析-下—StateThreads示例程序介绍

lookupdns 是 StateThreads 官网提供的一个示例程序,用协程来并发查询 多个域名 IP 信息

2023-12-21 10:19:25 166

原创 DNS查询lookupdns程序分析-上—StateThreads示例程序介绍

lookupdns 是 StateThreads 官网提供的一个示例程序,用协程来并发查询 多个域名 IP 信息

2023-12-21 10:18:24 119

原创 StateThreads示例程序介绍

StateThreads 是一个协程库,也可以说是一个协程框架。他提供了很多函数 API 给我们使用的,同时官方也有很丰富的。但是仅仅有文档还是不够的,编程这个领域最重要的是实战,所以官方又提供了以下 3 个示例程序给我们理解 API 函数的用法。上面的示例都是使用 StateThreads 协程来实现的,性能强悍。

2023-12-21 10:17:33 89

原创 clion高级调试功能介绍—StateThreads调试

clion高级调试功能介绍

2023-12-21 10:17:07 350

原创 StateThreads高级调试—StateThreads调试

在前面《StateThreads调试环境搭建》里,我们虽然可以断点调试 loopupdns 了,但是由于 clion 无法解析 StateThreads 的 Makefile 的代码

2023-12-21 10:14:05 80

原创 StateThreads调试环境搭建—StateThreads调试

StateThreads 的 clion 调试环境搭建

2023-12-21 10:12:01 526

原创 do_audio_out音频编码封装

do_audio_out() 函数后面的流程就非常简单了,就是调 avcodec_send_frame() 往编码器发数据,用 avcodec_receive_packet() 从编码器读数据,最后转换 AVPacket 的时间基,从编码器的时间基转成 `muxer` 的时间基。最后调 output_packet() 写入文件就可以了

2023-08-06 00:58:36 198

原创 init_output_stream初始化输出流

init_output_stream初始化输出流

2023-08-05 11:52:46 470

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除