1.SRS(simple-rtmp-server)流媒体服务器源码分析--RTMP消息play
SRS(simple-rtmp-server)流媒体服务器源码分析--RTMP消息play
本章内容梳理了SRS在接收到RTMP信息后如何进行转发的源码过程。在此过程中,分析首先进行代码梳理,源码作者也在源码熟悉阶段,分析可能尚未完全梳理完接受到RTMP后信息如何处理、源码易语言入库源码缓存以及转发给直播用户等内容。分析感知源码
SRS源码中的源码Play流程如下:
1. 进入play流程:本章内容直接从SrsRtmpConn::stream_service_cycle()方法开始梳理。
2. 在接受流程中,分析客户类型为SrsRtmpConnFMLEPublish “fmle publish”,源码而在转发流程中,分析客户类型为SrsRtmpConnPlay。源码
3. 在http_hooks_on_play()方法中,分析回调on_play()方法通知vhost,源码injection源码xxx用户已经开始play。分析
4. 在http_hooks_on_stop()方法中,源码回调on_stop()方法通知vhost,xxx用户已经停止play。eh源码
5. 最重要的是进入该函数。
在函数中:
1.1 根据客户端创建消费者对象:create_consumer(this, consumer)
1.2 为该消费者开启一个独立协程:trd.start() //此处一直不太明白,在play流程中创建一个协程用来做什么?
1.3 进入play主流程:do_playing(source, consumer, &trd);
2. 进入主play循环:do_playing()函数内容众多且非常重要,因此将函数内容全部列出。源码电玩
2.1 通知消费者准备play
2.2 从消费者列表中取出Rtmp信息(SrsMessageQueue)
2.3 进入play入口
3. 进入SRS发送接口(play):在int SrsProtocol::send_and_free_messages(SrsSharedPtrMessage** msgs, int nb_msgs, int stream_id)函数中,进入int SrsProtocol::do_send_messages(SrsSharedPtrMessage** msgs, int nb_msgs),该函数有一个#ifdef SRS_PERF_COMPLEX_SEND宏定义,一般rtmp协议都是要混合音视频数据,在做转发。在往后面看,
最后进入
在该函数中,最重要的一点是send message总出口writen()函数。它负责将转发给直播用户的流转发出去。
4. 最后:play总结
(1)通知client开始play
(2)从消费者列表中取出Rtmp数据
(3)从总出口writev()函数中转发出去