《SRS原理》上架了,深度剖析 SRS 源代码,访问地址:srs.xianwaizhiyin.net
《SRS4.0源码分析》专栏,会从 configure(配置),makefile(编译规则),main (入口函数), 带你一步一步了解 SRS 的主干代码逻辑。
这里分享一个本人阅读开源项目源码的技巧,大部分比较好的开源项目 模块划分都比较完善,初学者开始只需要了解主干逻辑,其他各个模块的细节用到的时候再仔细研究即可,不需要一开始就把全部的代码逻辑吃透,下面是 ffmpeg
项目的主干逻辑以及各个模块的分布。
开源项目动辄几十万行代码,如果没有好的模块划分,会很难维护,在早期就会死掉,所以一般活下来的都是模块划分比较完善的。
从上图可以看到, ffmpeg
用一个 API 层,把不同的编解码,容器,都集合在API的下面,只需要了解 API函数的用法,看看各个编解码提供什么样的参数选项,就可以使用这些编解码。如果想深入理解编解码的实现,就可以去看各个编解码模块的实现。
例如,如果你需要优化 H264 的解码算法,那你只需要去看 libavcodec\h264_xxx
的文件即可,其他的模块文件不用管
SRS 肯定也有跟 FFmpeg
类似的主干结构,初学者只需要了解主干逻辑,就能做一些简单的开发,一开始不需要具体去看各个传输协议的实现。
SRS 的主干结构如下:
待写。。。
下面讲一下流媒体服务器开发所需背景知识,我是做PHP出身的,以前我学习C/C++ 服务器开发的时候走过不少弯路。我是做了2年php web开发之后,就自己学 C 语言,看了一遍C语言语法,跟指针的使用,就去看一些开源的C语言写的服务器项目,那时候我发现自己根本看不懂。
网上别人 写得不错,比较高深的服务器开发文章,通常没有刻意提及 读者读懂 这些文章所需的背景知识。所以那时候我读不懂别人写的得文章,又不知道去看哪个书籍,比较迷茫。
下面我讲一下 流媒体服务器开发 所需的背景知识,基本本人的经验来讲的。
1,C/C++ 的基本语法,推荐看 《C语言程序设计现代方法》《C++ primer》
C++ 相关的书籍还有《C++程序设计语言》 跟 《More Effective C++》,这两本书我还没看过,不做评价。
2,编译以及链接的基本知识,我知道的有《Linker and loader》,《程序员的自我修养,链接加载与库》。
这两本书其实我也没看过,本人目前掌握的编译链接知识,是看各种网络文章学来的,我也不记得自己看过哪些文章。
这个是我的自己写的静态库动态库教程《msys2-gcc静态库使用》《msys2-gcc动态库使用》《Linux动态库使用》,在博客可以找到。
编译以及链接的基本知识 对于新人我也没什么好推荐的,反正就是你要懂一些怎么把 .c 文件编译成 .o 然后动态库,静态库怎么用,如果有嵌套的静态库,怎么处理,就是一个静态库套一个静态库,再套一个静态库如何编译。动态库同理。懂了这些基本的东西,你就能看懂开源项目的 configure 跟 makefile。
要看懂 configure 还需要一些 shell 的知识。
makefile 的语法推荐看 陈皓(左耳朵耗子)的《跟我一起写 makefile》
《Linker and loader》,《程序员的自我修养,链接加载与库》虽然我没看过,但是我估计里面是讲链接,编译的一些原理性的东西,新人一开始不看也可以开始去写代码,因为编程讲究的是实践,在实践的过程中再回去看一些理论原理性的东西,学习效率会更高。
3,如果上面的 C/C++ 语法,基本的编译链接 都学会,就可以开始看 《unix 环境高级编程》,这本书没看过,基本上没法做 linux 服务器开发。因为网上一些比较好的文章,都是默认你已经懂了 什么是 多线程,多线程操作某些资源为什么要加锁,什么是守护进程,什么是可重入函数,什么是不可重入函数,linux 的信号是怎么一回事。进程间通信,共享内存,线程间通信,条件变量,等等。性能优化的原理,为什么这么做能优化性能,在《unix环境高级编程》都有讲述。
网上一些大神写文章的时候默认你已经懂了这些。《unix 环境高级编程》这本书有1千多页,但即使是新人,我也推荐直接看这本书,不用花时间去写贪食蛇之类的小游戏,这本书里面本身就有很多C语言的demo代码,看这本书也能加深C语言的用法。
4,因为流媒体服务器的一个重中之中的重点是 传输协议,流媒体跟 web 开发不太一样,web 开发 客户端就一个web页面,服务器端一大堆相互关联的业务逻辑。但是在流媒体领域,客户端相对服务器复杂一些,客户端有各种编解码,特效渲染等等,流媒体服务器就只有一个重点,传输协议。
PS:其实在流媒体开发里面,没有严格规则,客户端做什么,服务器做什么,有时候服务器需要进行编解码。
《Unix 环境高级编程》里面有30页是讲网络IPC 的,但是比较简单。为了后面理解 传输协议的设计优化 打一些基础,推荐阅读《TCP/IP详解》,《TCP/IP详解》有3卷书,卷一是讲概念的,卷二是讲网络协议栈代码实现的,这两卷书,我都看过。
《TCP/IP详解》卷二 讲代码实现的时候,真的讲得非常好,mac 层, ip 层,tcp/udp 层,socket 层,都讲了代码逻辑原理,看卷二的时候推荐用 使用陈硕 的《User-mode 4.4BSD-Lite2 TCP/IP Stack》,这是一个可以在eclipse集成环境下断点调试 TCP 协议栈的代码,代码版本跟《TCP/IP详解》卷二 的版本一样。
其实我也不知道 推荐 《TCP/IP详解》卷二代码实现 给新人读是否合适,卷二有1000多页,但是 流媒体服务器 的重点又是 传输协议,《TCP/IP详解》卷二 是我了解到的对于 协议的设计,原理,以及实现,讲解得最完善的一本书。我是在工作5年后,2018年脱产学习3个多月才把 《TCP/IP详解》卷二代码实现 看完的。
网络编程,我了解到的比较好的书籍有以下这些,请根据个人情况阅读。
- 《TCP/IP详解 卷一》协议,这本书我是看过的,主要通过 wireshark 抓包给你分析 各个协议层的字段,设计原理之类的,这本书不教你如何调 linux socket api去写网络编程代码。说实话,卷一没有代码demo跑,纯文字讲解,看着容易晕,这本书最后的一小部分我自己也没看完。我个人感觉 卷一 更像一部详细的协议手册。
- 《unix网络编程卷一》这本书我只看过目录,这本书就是 教你如何调 linux socket api去写网络编程代码。
- 《TCP/IP详解 卷二》代码实现,这本我详细看过,这本书就是讲 mac 层, ip 层,tcp/udp 层,socket 层 的代码实现,如果你看完了《unix网络编程卷一》,再看这本书,就会了解到自己经常用的 socket api是如何实现的。
这3本书看完,就具备理解 一些流媒体协议的背景知识了,具备理解 RTMP,SRT,webrtc 等协议的基础。
5,汇编背景知识。流媒体项目,多多少少都会涉及到汇编的东西,FFmpeg 里面有汇编优化,SRS 用的 state thread 协程也有一些汇编代码。
所以了解一些汇编的基本使用是有必要的,本人了解到的汇编书籍有以下:
- 《Assembly Language For x86 processors》,中文版 《汇编语言:基于x86处理器》,书中示例代码下载,百度网盘,提取码;0pxo
- 《 Modern X86 Assembly Language Programming 》,中文版《现代x86汇编语言程序设计》
- 《Programming with 64-Bit ARM Assembly Language》,ARM 现在是最流行的移动端CPU架构。
学 C++ ,不学汇编跟编译系统,功力少一半,不过如果不用修改 st 协程,不碰 ffmpeg 汇编优化,不掌握汇编,也能做流媒体开发,也不需要一下子就把所有背景知识全部学全。
流媒体服务器开发背景知识讲解完毕,最后引用一下老猴的有一段话:
- 作者可能只能告诉你他懂的,却无法告诉你他不知道的。读者的要是没有这个意识,就会以为书中讲的就是学科的全部,而错过了到边界外围探索的机会,何况,很多人对于某个领域,只有看一本书的习惯。
- 即使是讲解相同技术的书籍,不同的作者对于相同的内容会有不同的阐述,看多了,或许就理解了,还理解不了的,可能就在自己认知的边界之外,需要格外的努力了。
©版权所属:知识星球:弦外之音,QQ:2338195090。
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。