
在accept一个链接后,创建对应的SrsRtmpConn。
SrsRtmpConn自身是一个协程的子类,运行后进行rtmp协议中的handshake、connect、create stream。并且判断是publish之后,创建SrsRecvThread来接受推流。
但是有一点比较奇怪的写法就是,在handshake之后,connect之前就根据发的包内容来判断是一个publish还是play。这点和我认知的rtmp协议不同,在我的认知里面,rtmp协议在create stream会发play或者push的message表示自己是一个什么样的角色,一般都是通过这个方法来判断的。
SrsRecvThread是一个协程,运行后会开始接受message数据。根据对应message执行不同的函数,并且把message放入到SrsConsumer队列中,
在放入SrsConsumer的队列中后会通过条件srs_cond_signal(mw_wait),通知等待的协程可以开始消费message了
这个是接受tcp链接的代码,rtmp的tcp监听也是在这边的。accept一个fd后,调用on_tcp_client处理这个链接。
这边有一点需要注意的是,srs的io操作大部分是state thread库函数做的。调用accept的socket是一个非阻塞式的,但是st_accept用起来像阻塞式的,实际上是一个非阻塞式的。
C++音视频开发学习地址:免費】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,大厂面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs),免費分享,如有需要的可以加君羊领取哦!~学习交流君羊994289133点击加入领取资料包
on_tcp_client最后调用会调用fd2con,将fd生成对应的SrsRtmpConn对像。
并且SrsRtmpConn是一个st可以执行的协程类,最后会调用do_cycle进行handshake、connect、create stream。
在service_cycle中就是调用stream_service_cycle
这个函数做的东西比较多,一开始回去确认身份。然后根据不同的推流端进行一些特例化的操作,大致就是connect,createstream,然后开始推流。
创建一个协程开使推流,调用do_publishing中启动协程开始推流,并做了一些链接的错误处理。
在do_publishing中调用SrsPublishRecvThread的start,最后会开启协程。
start最后会调用SrsRecvThread协程,中间就省略很多无用的代码。
最后会放入到source的consumer中
最后会通知所有的消费者,有message写入,可以开始消费
原文链接:srs流媒体服务器推流的流程 - 资料 - 我爱音视频网 - 构建全国最权威的音视频技术交流分享论坛
