SRS中RTMP推流RTC播放的实现原理及函数执行流程

8 篇文章 2 订阅
6 篇文章 2 订阅

RTMP转RTC;或者RTC转RTMP,是通过Bridger实现的。

RTMP转RTC

class SrsRtcFromRtmpBridger : public ISrsLiveSourceBridger

RTMP推流

HTTP回调,类似RTMP module中onpublish回调
创建接收推流的Thread
publishing
http_hooks_on_publish
acquire_publish
do_publishing
创建RtcFromRtmpBridger

在acquire_publish函数中:

    if (rtc_server_enabled && rtc_enabled && !info->edge) {
        if ((err = _srs_rtc_sources->fetch_or_create(req, &rtc)) != srs_success) {
            return srs_error_wrap(err, "create source");
        }

        if (!rtc->can_publish()) {
            return srs_error_new(ERROR_RTC_SOURCE_BUSY, "rtc stream %s busy", req->get_stream_url().c_str());
        }
    }

判断配置文件中是否配置并开启了RTC服务,还需要当前服务不是Edge类型节点的服务。如果条件都满足,会根据RTMP推流的req信息(application和streamname)获取或创建SrsRtcSource对象rtc。

if (rtc) {
        SrsRtcFromRtmpBridger *bridger = new SrsRtcFromRtmpBridger(rtc);
        if ((err = bridger->initialize(req)) != srs_success) {
            srs_freep(bridger);
            return srs_error_wrap(err, "bridger init");
        }

        source->set_bridger(bridger);
    }

创建SrsRtcFromRtmpBridger的桥接对象bridger,使用RTMP推流的req信息初始化bridger,其中包括初始化音频转码,从AAC转Opus。最后将bridger设置进SrsLiveSource* source中,供后续接收到音视频数据时使用。

RTMP接收推流线程
        SrsPublishRecvThread rtrd(rtmp, req, srs_netfd_fileno(stfd), 0, this, source, _srs_context->get_id());
        err = do_publishing(source, &rtrd);

创建接收RTMP推流的线程并启动。
线程创建的过程:

graph TD
SrsPublishRecvThread--构造函数初始化trd-->B[SrsRecvThread trd]
B --创建SrsDummyCoroutine-->C[SrsDummyCoroutine trd]

线程启动

启动隔离接收线程
创建ST协程
实际是创建
_pfn_st_thread_create
开启循环执行SrsFastCoroutine::cycle
即执行传入的接收函数
pumper = SrsPublishRecvThread
存在bridger_
AAC to Opus
for循环 封装SrsRtpPacket
存在bridger_
封装SrsRtpPacket
RTC拉流方SrsRtcConsumer
添加进待发送的SrsRtpPacket队列
SrsRtcPlayStream::cycle
do_publishing
SrsPublishRecvThread rtrd->start
SrsRecvThread trd.start
trd = new SrsSTCoroutine
SrsFastCoroutine
SrsSTCoroutine trd->start
SrsFastCoroutine::start
st_thread_create
SrsFastCoroutine::cycle
SrsRecvThread::cycle
do_cycle
rtmp->recv_message
pumper->consume msg
SrsPublishRecvThread::consume
handle_publish_message
process_publish_message
source->on_audio, on_audio_imp
source->on_video, on_video_imp
bridger_->on_audio
transcode
SrsRtcSource source_->on_rtp
bridger_->on_video
SrsRtcFromRtmpBridger consume_packets
consumer->enqueue
queue.push_back pkt
consumerdump_packet获取队列数据后send_packet

RTC转RTMP

class SrsRtmpFromRtcBridger : public ISrsRtcSourceBridger

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值