• SRS4.0 RTC模块增加Gop cache


    简介

    随着对直播延迟要求的不断提高,原来的RTMP直播已经不能满足要求,需要使用基于RTC的低延迟直播。SRS中提供了RTC推拉流的能力,并且提供了RTMP和RTC互相转换的能力。为什么需要在SRS的RTC模块中增加Gop缓存,目的是为了降低起播等待时长。

    对于超大规模的低延迟直播来说,不能每加入一个用户向服务器发送PLI/SLI/FIR请求,服务器就编码一个I帧或向推流端请求I帧。

    对于从RTMP转RTC,由于RTMP存在gop,没有gop cache时最长需要等待一个gop才能起播。

    我在原始的RTMP直播服务上,使用SRS做了一层RTC代理,实现和腾讯云LEB或阿里云RTS的功能,通过在SRS RTC模块中增加Gop Cache使其可以具备像RTMP直播一样的秒开能力。这样可以复用原有的直播转码、直播录制等服务。

     本文福利, C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击领取↓↓ 

    实现方式

    配置解析

    在SrsConfig类中增加对RTC Gop Cache相应对解析。对应对文件是trunk/src/app/srs_app_config.h/trunk/src/app/srs_app_config.cpp.增加两个参数:

    rtc_gop_cache:RTC gop的开关选项,默认是关闭。

    rtc_gop_cache_max_packet_number:RTC Gop最多缓存的packet数量,是为了避免推流端两个I帧间隔时间过长时,增加对服务器内存资源对消耗,默认是0个。

    1. bool SrsConfig::get_rtc_gop_cache_enabled(std::string vhost)
    2. {
    3. static bool DEFAULT = false;
    4. SrsConfDirective* conf = get_rtc(vhost);
    5. if (!conf) {
    6. return DEFAULT;
    7. }
    8. conf = conf->get("rtc_gop_cache");
    9. if (!conf || conf->arg0().empty()) {
    10. return DEFAULT;
    11. }
    12. return SRS_CONF_PERFER_FALSE(conf->arg0());
    13. }
    1. int SrsConfig::get_rtc_gop_cache_max_packets(std::string vhost)
    2. {
    3. static int DEFAULT = 0;
    4. SrsConfDirective* conf = get_rtc(vhost);
    5. if (!conf) {
    6. return DEFAULT;
    7. }
    8. conf = conf->get("rtc_gop_cache_max_packet_number");
    9. if (!conf || conf->arg0().empty()) {
    10. return DEFAULT;
    11. }
    12. return ::atoi(conf->arg0().c_str());
    13. }

    增加SrsRtcGopCache类 

    1. // RTC cache a gop of video/audio data,
    2. // delivery at the connect of rtc player,
    3. // To enable it to fast startup.
    4. class SrsRtcGopCache
    5. {
    6. private:
    7. // if disabled the gop cache,
    8. // The client will wait for the next keyframe for h264,
    9. // and will be black-screen.
    10. bool enable_rtc_gop_cache;
    11. //when meet keyframe, then start cache packet
    12. bool meet_keyframe;
    13. // The cached rtp packet count
    14. int cached_rtp_packet_count;
    15. // avoid cache too much packet when gop size too large.
    16. int max_cached_count;
    17. // cached gop.
    18. std::vector rtc_gop_cache_vec;
    19. public:
    20. SrsRtcGopCache();
    21. virtual ~SrsRtcGopCache();
    22. public:
    23. // cleanup when system quit.
    24. virtual void dispose();
    25. // To enable or disable the gop cache.
    26. virtual void set(bool v, int max_size);
    27. // only for h264 codec
    28. // 1. cache the gop when got h264 keyframe.
    29. // @param pkt, directly ptr, copy it if need to save it.
    30. virtual srs_error_t cache(SrsRtpPacket* pkt);
    31. // clear the rtc gop cache.
    32. virtual void clear();
    33. // dump the rtc cached gop to consumer.
    34. virtual srs_error_t dump(SrsRtcConsumer* consumer);
    35. };
    1. 函数set:设置gop cache开启或关闭。
    2. 函数cache:缓存需要packet数据。
    3. 函数dump:将缓存的rtp packet放入发送队列给播放端。
    4. 函数clear:清理缓存数据。
    5. 函数dispose:系统退出时调用。

    缓存数据

    rtc_gop_cache_->cache(pkt->copy());
    

    SrsRtcSource::on_rtp在接收到推流端发送的rtp数据时,加入到rtc_gop_cache中。

    总结

    通过在SRS的rtc.conf中进行以下配置,可以开启RTC Gop Cache功能。使用RTMP推流,并且使用RTC播放时可以实现视频秒开。

    1. rtc {
    2. enabled on;
    3. rtc_gop_cache on;
    4. rtc_gop_cache_max_packet_number 2048;
    5. }

     本文福利, C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击领取↓↓

  • 相关阅读:
    leetcode算法每天一题 020: 有效的括号(c++ stack<> queue<>的简单使用 )
    真实大数据简历模版(四)【大数据-2年经验】电影网数据分析
    SpringBoot中如何集成ThymeLeaf呢?
    python 娣卞害绁炵粡缃戠粶,python 缃戠粶鍒嗘瀽
    杨辉三角(Java实现)
    lotus windowPoSt 手动触发时空证明计算
    【题解】JZOJ3854 分组
    【日志系统】Loki日志监控 - 入门初体验
    ubuntu小技巧30--23.10桌面版安装钉钉启动报错undefined symbol: FT_Get_Color_Glyph_Layer
    springboot中@Async的使用
  • 原文地址:https://blog.csdn.net/m0_60259116/article/details/126126682