SRS4.0源代码分析之总体介绍(2)

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

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

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

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

2、初步了解RTMP协议规范和State Thread的运行原理
所谓初步了解,就是说方便我们在实际阅读代码时,不会被具体的实现细节所迷惑。这部分内容,网上资料很多,个人比较推荐下面连个链接的内容
手撕Rtmp协议细节 https://cloud.tencent.com/developer/inventory/1220
SRS开源直播服务 - StateThreads微线程框架学习 https://cloud.tencent.com/developer/article/1197338
RTMP专栏 https://blog.csdn.net/jacob_job/category_7480169.html

3、结合SRS运行日志和GDB调试工具
了解函数调用关系以及软件代码的整体处理逻辑。具体可参考下面两个视频(视频中广告比较多,要善用倍速播放,但其中讲解的GDB调试方法很实用)
SRS流媒体服务器实战(上) https://www.bilibili.com/video/BV1XZ4y1P7um/?spm_id_from=333.788.videocard.7
SRS流媒体服务器实战(下) https://www.bilibili.com/video/BV1Xa4y177W1/?spm_id_from=333.788.videocard.0

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

下一章2、SRS4.0源代码分析之启动流程 https://blog.csdn.net/adkada1/article/details/120587589
————————————————
版权声明:本文为CSDN博主「黑板报」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/adkada1/article/details/120583331