srs中rtmp接收连接,publish推流源代码解析

srs2.0的rtmp推流处理主要包含在srs_app_conn.cpp,srs_app_source.cpp,srs_app_recv_thread.cpp源文件中。

SrsServer::listen_rtmp()监听client的推流和拉流rtmp请求,接收到推流请求后在SrsServer::accept_client函数中为请求创建一个单独线程的SrsRtmpConn连接,如下图所示。然后在SrsRtmpConn::do_cycle()中处理连接,包括握手以及接收音视频数据等。

经过在SrsRtmpConn::service_cycle()中的rtmp消息交互后,进入SrsRtmpConn::stream_service_cycle()函数,在该函数中通过解析客户端client的type区分是推流还是拉流连接,针对不同的编码器推流分别在rtmp->start_fmle_publish,rtmp->start_haivision_publish,rtmp->start_flash_publish函数中对rtmp的消息交互进行不同处理,并且在SrsSource::fetch_or_create函数中取得直播源,推流创建新的然后返回,拉流直接取存在的源。

在rtmp连接消息交互处理完成后,进入 publishing(source)函数接收实际音视频数据然后处理,在refer->check进行refer鉴权和http_hooks_on_publish函数on_publish请求后,在SrsRtmpConn::acquire_publish函数中对流是否存在以及该节点是否支持推流进行校验,校验通过后如下图单独起一个接收音视频数据的线程,单独的接收线程可以提高服务器性能,do_publishing函数中开始启动线程。


进入到srs_app_recv_thread.cpp文件中,在SrsRecvThread::cycle()函数中接收数据处理,该函数针对推流连接接收实际的音视频数据,针对拉流连接接收客户端client的控制消息。rtmp->recv_message(&msg)接收数据,然后进入handler->handle(msg)处理消息。

在SrsPublishRecvThread::handle(SrsCommonMessage* msg)函数中,下图_conn->handle_publish_message(_source, msg, _is_fmle, _is_edge)函数中处理接收的音视频数据。


在接收线程SrsPublishRecvThread接收数据的同时,SrsRtmpConn::do_publishing()函数中对线程的状态进行检测。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值