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

作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音

SRS 对 StateThreads 的封装都在 srs_app_st.hppsrs_app_st.cpp 里面,这个文件里面的 class 类结构之间的关系如下:

1-1

SrsSTCoroutine 可以说就是 SRS 封装 StateThreads 之后提供的外部接口类。

如果你想创建一个协程服务,首先,你需要让你的类继承 ISrsCoroutineHandler,然后实现自己的 cycle() 方法,他内部最终会创建一个协程来运行你的 cycle() 方法。

SrsSignalManager 信号处理模块为例,他的类定义如下:

class SrsSignalManager : public ISrsCoroutineHandler

SrsSignalManagercycle 函数如下:

1-2

不过需要注意的是 SrsSignalManager 并没有继承 SrsSTCoroutineSrsSTCoroutine 是作为 trd 变量在 SrsSignalManager 里面存在的,如下:

1-3

1-4

//创建协程
trd = new SrsSTCoroutine("signal", this, _srs_context->get_id());
//启动协程
trd->start();

上面的 this 就是 SrsSignalManager 本身,这样就把 SrsSignalManager 作为一个 handler 绑定到 SrsFastCoroutine 里面了,最后会启动一个协程执行 this 里面的 cycle() 函数,流程图如下:

1-4-2

1-4-3

1-5

SrsSignalManager 是一个比较好的示例模块,代码比较短,如果你想创建一个新的模块,可以把 SrsSignalManager 复制一份来修改。


本文的第一张图片里面有一个 SrsDummyCoroutine 类,SrsDummyCoroutine 的设计有点不太好理解,其实他使用的是 empty object 设计模式,就是一个空的对象,里面的 start()stop() 等函数都是空的。

以 HTTP API 模块为例,他的用法如下:

1-6

其实跟之前的区别就是, new SrsDummyCoroutine 变成了 new SrsSTCoroutine。但是这个 SrsDummyCoroutine 实例最后是会被释放的,然后重新用 SrsSTCoroutine 实例来替代的,如下:

1-7

SrsDummyCoroutine 应该是在某些动态创建协程的场景有用,这部分内容后面再继续补充。


版权所属 xianwanzhiyin.net 罗上文 2023 all right reserved,powered by Gitbook该文件修订时间: 2024-01-08 01:12:46

results matching ""

    No results matching ""