1、SRS4.0源代码分析之总体介绍

前言

    SRS是一个简单高效的实时视频服务器,它的定位是运营级互联网直播服务器集群。它包括了音视频流媒体服务端的主流技术(RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181)、再配合完善的中英文档、活跃的社区、规范的代码架构以及广泛的产品级应用,不愧是中国人主导的最优秀的音视频流媒体开源项目。具体内容可参考以下链接:
https://github.com/ossrs/srs 此链接适合科学上网人士
https://gitee.com/winlinvip/srs.oschina 此链接适合懂法守法的好公民

    SRS相关的技术文档虽然丰富,但针对代码级别的分析文章还不多,这里分享自己在使用SRS开源项目做二次开发过程中,对项目代码的理解,希望抛砖引玉,和有兴趣的同学一起交流学习。

SRS4.0关键类与关键函数流程图


一、学习SRS软件代码的路径

对于还没接触过SRS开源项目或对音视频流媒体开发不熟悉的同学,不建议一上来就从软件代码入手,因为这样做,无异于盲人摸象,即浪费时间,也抓不住重点。比较好的学习路径应该是:

1、仔细阅读SRS的中文wiki文档

https://github.com/ossrs/srs/wiki/v4_CN_Home,参考此链接,严格按照下载并编译源代码、修改配置文件,将文档中Deployment Guides部分的所有功能都部署一遍,最后完成实际的推拉流测试。一套动作下来,大概1~2周的时间,对SRS服务就算入门了。

2、初步了解RTMP协议规范和State Thread的运行原理

所谓初步了解,就是说方便我们在实际阅读代码时,不会被具体的实现细节所迷惑。这部分内容,网上资料很多,个人比较推荐下面连个链接的内容
手撕Rtmp协议细节
SRS开源直播服务 - StateThreads微线程框架学习
RTMP专栏

3、结合SRS运行日志和GDB调试工具

了解函数调用关系以及软件代码的整体处理逻辑。具体可参考下面两个视频(视频中广告比较多,要善用倍速播放,但其中讲解的GDB调试方法很实用)
SRS流媒体服务器实战(上)
SRS流媒体服务器实战(下)

二、SRS总体代码架构

1.SRS代码架构的设计原则

    SRS的定位是音视频流媒体服务器,一般一路客户端的视频(H264)码率大概是1Mbit/s,音频(PCM 8K 16bit)码率大概是128Kbit/s,一台普通服务器的物理网卡最大支持GE(1000M)端口(现在最新的服务器也有支持10GE端口的,只是价格高,用的少)。所以,一台流媒体服务器最多支持1000路视频客户端同时推流,如果考虑到集群环境,每台服务器大概还需要预留50%的带宽用于其它节点失效情况下的冗余保护,所以,一台SRS流媒体服务器需要支持的客户端并发量远小于1000,相比需要支持千万级并发访问的Web服务,和百万设备同时在线的IoT服务,SRS对高并发的需求非常低

    同时,任何一种流媒体客户端(RTMP、WebRTC、HLS、HTTP-Flv)在推拉流过程中,都是一个漫长而复杂的协议握手过程,每个客户端连接都会因为协议设计或IO阻塞而处于不同的协议状态,如果将不同的客户端连接复用到服务端的同一个进程或线程中处理,无疑服务端针对每条连接的异步处理会非常复杂,再考虑各个客户端连接之间的资源互斥和同步,整个软件的复杂度就更高了。

    如果针对每个客户端连接,在服务端都占用一个单独的进程或线程(大概需要几百个这样的进程或线程),此时针对每条连接的协议处理逻辑就变简单了,但是几百个进程或线程之间的运行状态切换对于整个系统的性能损耗则非常大。

    所以,SRS的设计者为项目引入了State Thread(状态协程),简单的说,这就是一个用户级线程,每个客户端连接都单独占用一个用户级线程,这样软件在针对流媒体协议处理时,可以简化处理逻辑:每条连接根据接收到的客户端报文,处于不同的协议处理状态,没有新报文则用户线程阻塞在当前状态,并自动触发State Thread内部状态机调用其它可执行的用户线程,几百个用户级线程的切换,不会引入内核状态的切换,所以,执行效率高,对系统性能损耗小

2.SRS代码架构图

系统架构图:

+------------------------------------------------------+
|             SRS(Simple RTMP Server)                  |
+---------------+---------------+-----------+----------+
|   API/hook    |   Transcoder  |    HLS    |   RTMP   |
|  http-parser  |  FFMPEG/x264  |  NGINX/ts | protocol |
+---------------+---------------+-----------+----------+
|              Network(state-threads)                  |
+------------------------------------------------------+
|      All Linux(RHEL,CentOS,Ubuntu,Fedora...)         |
+------------------------------------------------------+

数据流图:

        +---------+                                 +----------+
        + Publish +                                 +  Deliver |
        +---|-----+                                 +----|-----+
+----------------------+-------------------------+----------------+
|     Input            | SRS(Simple RTMP Server) |     Output     |
+----------------------+-------------------------+----------------+
|    Encoder(1)        |   +-> RTMP protocol ----+-> Flash Player |
|  (FMLE,FFMPEG, -rtmp-+->-+-> HLS/NGINX --------+-> m3u8 player  |
|  Flash,XSPLIT,       |   +-> Fowarder ---------+-> RTMP Server  |
|  ......)             |   +-> Transcoder -------+-> RTMP Server  |
|                      |   +-> DVR --------------+-> FILE         |
|                      |   +-> BandwidthTest ----+-> Flash/StLoad |
+----------------------+                         |                |
|  MediaSource(2)      |                         |                |
|  (RTSP,FILE,         |                         |                |
|   HTTP,HLS,    ------+->-- Ingester ----(rtmp)-+-> SRS          |
|   Device,            |                         |                |
|   ......)            |                         |                |
+----------------------+-------------------------+----------------+

功能模块图:

在这里插入图片描述

数据流与关键类关系图:

在这里插入图片描述


总结

    SRS包括了音视频流媒体服务端的很多主流技术(RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181),这里的每种协议都涉及到很多技术细节。例如,RTMP推拉流握手协议,RTMP报文解包封包,边缘与源的集群处理,HLS的ts切片文件与m3u8描述文件,Flv封装格式与HTTP-Flv传输方式,WebRTC的SDP交换、ICE连接建立、音视频报文RTP封装与Qos处理。初学者学习代码时,不建议从具体的技术细节入手,首先应该参考上面的数据流与关键类关系图,对协议的端到端处理流程有完整的理解后,再根据需要,对某一个关键技术找到对应的关键类,进一步深入学习。

下一章2、SRS4.0源代码分析之启动流程

  • 14
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
华为SRS(软件需求规格说明书)是华为公司开发软件项目的重要文档,它详细描述了软件产品的所有需求,包括功能需求、性能需求、质量需求、安全需求等。本次需求分析主要围绕华为SRS的重要性和编写流程展开。 首先,华为SRS对软件项目的开发和管理具有非常重要的作用。通过明确规定软件产品的需求,可以提高开发效率,减少项目风险和开发成本,为产品的成功交付奠定坚实的基础。 其次,华为SRS的编写流程一般包括需求收集、需求分析、需求说明等步骤。其中,需求收集阶段主要通过与客户沟通、访谈、问卷调查等方式收集用户需求,确保产品功能和业务需求的一致性和风险识别性;需求分析阶段重点是对所收集到的需求进行分析,确认需求的正确性和完整性,同时解决可能出现的矛盾需求;需求说明阶段则是将确认后的需求清晰地描述在文档中,包括需求ID、需求名称、需求描述、需求来源、需求优先级等。 最后,华为SRS是一个不断更新的文档,需求分析是一个持续迭代的过程。在项目的不同阶段,需要根据实际情况调整和更新SRS,保证其与软件开发的进展相一致。 综上所述,华为SRS是软件开发过程中至关重要的一环。良好的需求分析流程,能够保证产品的质量和用户体验,同时提高项目交付的成功率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值