SRS流媒体框架分析(1)( 二 )


在trd->start():启动协程 , 如果协程要回调 , 可以通过this指针找到对象 。 启动协程后 , 就好会调用SrsSTCoroutine::cycle() , 然后调用handler->cycle() , 再调用SrsTcpListener::cycle() 。
SRS流媒体框架分析(1)文章插图
更加细致的流程如下:
SRS流媒体框架分析(1)文章插图
调用cycle的源码 , 如下所示:
SRS流媒体框架分析(1)文章插图
fd和connection的绑定 , SrsServer::fd2conn , 调用的是new SrsRtmpConn(this , stfd , ip) , 通过server服务(还可以管理其它事情)去管理所有连接 。 源码如下:
SRS流媒体框架分析(1)文章插图
SRS流媒体框架分析(1)文章插图
把所有的连接管理起来 。
SRS流媒体框架分析(1)文章插图
连接上之后 , 会启动协程 。 每个SrsRtmpConn都有1:1对应的协程 , 同时该连接 , 一定也对应一个cycle 。 只要某个类有start , 那基本上意味着绑定了一个协程的循坏 , 肯定是调用该类的cycle去实现了 。
SRS流媒体框架分析(1)文章插图
服务端 , 具体的循环操作 , 源码如下:
设置窗口大小 , 带宽等 。
SRS流媒体框架分析(1)文章插图
真正循环体的实现 。
SRS流媒体框架分析(1)文章插图
SrsRtmpConn::stream_service_cycle() , 一个直播对应一个source , 一个推流 , 对应0-n个拉流 。 source的消费者 , 每个拉流都会绑定一个SrsConsumer 。 具体工作 ,
SRS流媒体框架分析(1)文章插图
SrsSource对应客户端的consumers 。
SRS流媒体框架分析(1)文章插图
在这个循环里面 , 如果有播放或推流 , 它们对应的线程是不一样 。
do_playing(source , consumer ,--tt-darkmode-color: #999999;">后期关于项目的知识 , 会在微信公众号上更新 , 如果想要学习项目 , 可以关注微信公众号“记录世界 from antonio”