SRS-GB28181 RTMP推拉退转发原理

一.端口监听

修改srs.conf配置文件

listen              1935;
max_connections     1000;
srs_log_tank        console;
#srs_log_file        ./objs/srs.log;
daemon              off;

在srs_app_listener.cpp文件中,

而例如http_api中,

  

进入gdb调试

gdb ./objs/srs
b main
set args -c ./conf/srs.conf /* 设置参数 */
r

进入main函数

 

b srs_app_config.cpp:3093
c
bt
c
bt
c
bt

调用栈 分析源码,

在 srs_app_server.cpp文件中进一步阅读SrsServer::listen_rtmp()函数

 

 

 

 

 listen协程负责accept,在SrsTcpListener::circle进行accept

b SrsTcpListener::cycle()
c
bt

在srs_app_listener.cpp:271打上断点,当有RTMP客户端请求连接时触发该断点,然后进入handler->on_tcp_client

b srs_app_listener.cpp:271
c
c
c
s

s
bt

从以下堆栈中得出对于RTMP业务,有SrsTcpListener::cycle -> SrsBufferListener::on_tcp_client ->SrsServer::accept_client

 

不管RTMP是推流还是拉流,每个连接在服务器都对应⼀个SrsRtmpConn对象。SrsRtmpConn持有连接对应的fd。在SrsRtmpConn::SrsRtmpConn(SrsServer* svr, srs_netfd_t c, string cip, int cport)构造函数断点。

 

创建RTMP连接对象

在srs_app_rtmp_conn.cpp文件中,

得出SrsServer::accept_client-> SrsServer::fd_to_resource->SrsRtmpConn::SrsRtmpConn

RTMP推流和拉流创建连接对象的⽅式是⼀致的,都是创建了SrsRtmpConn。每个SrsRtmpConn都绑定⼀个SrsCoroutine,具体的业务处理在SrsCoroutine的循环进行,对于RTMP而言最终的循环为SrsRtmpConn::cycle。

对于推流和拉流都是在SrsRtmpConn::cycle,只是最终:

推流SrsRtmpConn::do_publishing

拉流SrsRtmpConn::do_playing

具体是在SrsRtmpConn::stream_service_cycle根据RTMP交换协议决定的流程走向。

要启动协程,需要调用:SrsRtmpConn::start()

二.创建连接

判断是不是推流SrsRtmpServer::identify_client

在SrsRtmpConn::stream_service_cycle调⽤SrsRtmpServer::identify_client判断是不是推流。

调用SrsProtocol::decode_message(SrsCommonMessage* msg, SrsPacket** ppacket) 去判断对应数据是属于哪⼀种类型消息。 

b SrsCreateStreamPacket::SrsCreateStreamPacket()
b SrsFMLEStartPacket::SrsFMLEStartPacket()
b SrsPlayPacket::SrsPlayPacket()
c

进入推流循环SrsRtmpConn::do_publishing

b srs_app_rtmp_conn.cpp:856
c
bt

 进入拉流循环SrsRtmpConn::do_playing

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值