流媒体 C/C++ 学习路线 - 弦外之音

/ 0评 / 2

先推荐一些本人看过,正在看,或者准备看的书籍。

书名作者进度书评
C语言程序设计-现代方法K.N.King80%这本书写的很好,对C语言的语法重点进行了讲解,还讲了一些程序设计,高内聚低耦合的知识
Linkers and loadersLevine, John R准备看这本书补充了《C语言程序设计-现代方法》的不足,《C语言程序设计-现代方法》编译链接的知识只讲了3页,一笔带过。《Linkers and loaders》很好地补充了这方面的内容。
程序员的自我修养-链接,装载与库俞甲子,石凡,潘爱民准备看跟《Linkers and loaders》差不多,看书不要只看一本
C++ primerStanley B. Lippman90%主要讲解C++基本语法的。这本书写得很全面,如果你之前从未接触过C++,你可能看不懂书中的某些章节,例如 泛型与模板,运算符重载与lamba,右值引用。看不懂可以跳过,这些属于比较高级的语法,要结合一个实际的源码例子,例如ZLMediaKit的源码,他里面用了右值引用,才能更好地应用跟理解。
C++ 程序设计语言Bjarne Stroustrucp0%主要讲解C++基本语法的,看书不要只看一本
算法导论Cormen40%这本书讲算法原理的,只提供了伪代码,所以与编程语言无关。
面向算法设计的数据结构谢勰准备看提供了 C++代码,作者有微博,比较年轻,看不懂的地方可以问他,方便交流。推荐新人阅读。
数据结构与算法分析-C语言面熟Weiss准备看提供了部分 C 代码,推荐新人阅读。
算法:C语言实现Robert好像没有提供代码。
Effective C++Meyers准备看C++高级用法以及工程经验的总结
More Effective C++Meyers准备看C++高级用法以及工程经验的总结
深入探索C++对象模型Lippman准备看讲解C++的原理,内存布局之类的。
unix网络编程Stevens10%这套书有两本,第一本是套接字联网API,第二本是进程间通信
unix环境高级编程Stevens100%讲 linux 环境的 API 如何使用的
TCP/IP详解Stevens100%这套书有三本,卷一讲概念原理,卷二讲代码实现,卷三进程间通信。《TCP/IP详解》跟《unix网络编程》的区别在于,TCP/IP 卷二会对底层代码实现讲解得更彻底,《unix网络编程》更加注重上层API函数的调用。
计算机网络自顶向下方法kurose准备看对无线网络,VOIP,多媒体都有讲解,这些是《TCP/IP详解》没讲的
现代操作系统Andrew S. Tanenbaum准备看讲操作系统原理的
深入理解计算机系统Byrant准备看讲操作系统原理的
计算机体系结构-量化研究方法Hennessy准备看这本书不错,对指令级别并行,线程级别并行,数据级别并行做了通俗的讲解
奔跑吧linux内核张天飞准备看这本书是实战书,讲的是具体的内核代码,有教怎么搭建Eclipse+QEMU+GDB 单步调试环境
汇编语言基于X86处理器Irvine90%汇编入门书籍,提供了汇编代码,使用vs2015作为调试环境,推荐新人阅读
现代X86汇编语言设计Kusswurm准备看汇编高级用法书籍,这本书重点讲解 SIMD 指令技术,这是编解码算法经常用的优化方案
Intel白皮书英特尔® 64 位和 IA-32 架构开发人员手册,这些手册有好几卷,讲解 CPU 架构的指令用法,可以当手册查
Programming with 64-Bit ARM Assembly Language准备看讲ARM汇编的,移动设备经常用 ARM 架构的CPU
DPDK应用基础linux云服务器有C10K,C100k问题,但是电信设备没有这个瓶颈,因为电信设备用的不是linux内核,DPDK就是 linux 内核,IO限制的解决方案。
深入浅出DPDK
FFmpeg从入门到精通刘歧100%讲ffmpeg基础知识
Video Code DesignIain E. Richardson准备看视频编码原理的入门书,可以通读,读不懂的地方不要死钻,直接debug ffmpeg的代码实现来理解
The H.264 Advanced Video Compression StandardIain E. Richardson准备看讲解 H264 编码原理的,适合结合 ffmpeg 源码来阅读
H.264 and MPEG-4 Video Compression Video Coding for Next Generation MultimediaIain E. Richardson准备看讲 MPEG-4 跟 H264的
新一代视频压缩编码标准:H.264/AVC
H.265/HEVC:视频编码新标准及其扩展
视频编码全角度详解rao这本书适合通读,因为讲解了大部分编解码标准的概念,但是有意省略了实现细节,所以如果你想了解H264的具体实现,你最好找别的书来看。
数字视频编码技术原理高文这本书虽然没提供代码,但是对原理实现讲得还是比较详细,不过不推荐作为入门书籍阅读。
python计算机视觉Solem
学习 opencv 3haehler


虽然我上面列举了很多书籍,但不是说你要看完这些书才能做服务器C/C++ 流媒体开发。上面每一本书,每天花4~8 小时看,至少也需要 1~3个月才能读完一本。

可以看到,有些书我自己也没看,但是我现在已经具备能看懂 FFmpeg 源码,SRS源码,ZLMediaKit 源码的能力。

本文主要是向初学者讲解一下我是如何获得这些能力的。

学 C/C++ 不要死钻语法,有些语法是需要你干了几年工程实践才能学会使用的。C++ 其实是没有什么平台性质的,所以windows开发你能用C++,linux开发你也能用C++,但是 windows 系统的 API 跟 Linux 一样吗?不一样,Linux 的 epoll ,Windows 有吗?没有,所以要看你自己想做哪个平台的开发。就需要去了解相应平台的知识,Linux 的可以看《Unix环境高级编程》《Unix环境网络编程》,因为不同平台的API跟原理不太一样。所以你要了解的是平台的API跟原理,C++语法还是次要的,你得了解平台的API才能写出一个东西来,才能拿到正反馈,才能继续学。

还有一个重点是 编译链接的知识,我早期学习一些工具(zabbix,cacti等)的使用,编译安装几乎是噩梦,因为我那时候看不懂 configure 跟 makefile,但是我是一个勤奋的人,编译报错,我去google搜索,研究 1~3天,基本也就能解决。但自从我能看懂 configure 跟 makefile 之后,编译问题,我1~2小时就能解决,找出原因,而不是网上搜教程按步奏操作却不知道所以然。我也见过蛮多人被编译问题困扰,整天在技术群里问,为什么报头文件找不到,为什么找不到动态库,为什么编译报错。

首先,如何才能看懂各种开源项目的 configure 跟 makefile ,或者CMake。

configure 其实就是一个 shell 文件,每个开源项目的 configure 都不一样,支持的选项也不一样,例如 FFmpeg 的 configure 是 --enable-sharead 开启动态库编译,但是换另一个开源项目,他一般就没 enable-sharead 这个选项,这个选项是用 shell 写出来的。

所以你需要找一些 Linux 环境 shell 编程的教程学习一下 才具备看懂 configure 的基础,推荐看《Shell脚本学习指南》。

掌握 shell 之后,还不够,因为 configure 里面做的最多的是编译检测,一般是调 gcc 编译一下。所以你得学会用 gcc 编译代码,在开始学 C/C++ 基础语法的时候,你可能已经用过 gcc 了,但是可能只是编译少量的文件,就一个 main.c 加一些链接库。这里你需要学习一下 gcc 的一些高级用法,例如 gcc 的 -l 会去哪些目录搜索哪些文件名,怎么打印这些目录。怎么打印 gcc 包含头文件的目录,gcc 找头文件会去哪些目录找,gcc 如何把代码编译成动态库或者静态库。还有 了解一下 pkg-config 的用法。

这些你掌握之后,你就能自己调试shell,例如把 动态库查找目录打印出来,就能知道为什么 gcc 提示找不到动态库。gcc 为什么找不到头文件。你就能debug 进去 configure shell 脚本,找出报错的地方。

makefile 可以看《跟我一起写makefile》,configure跟 makefile 是 Linux 平台的东西。

windows 平台的编译套件 是MSVC,编译器是那个 cl.exe 文件,链接器是 link.exe,你得学会用这两个可执行文件。这两个东西一般会集成在 vs2019 ,在一个集成环境开发,vs2019 的各种编译选项,编译流程,配置,我也不太熟悉,我比较熟悉 windows 的 qt 编译环境。

最后提及一下 CMake 编译套件,CMake 是跨平台的,比较先进,但是不要跳过 makefile 直接学 CMake。因为 在 linux 平台,CMake 是会生成 makefile的,CMake的语法比较多而且有点复杂,有时候你写错了,你可以利用 生成的 makefile 倒推回去弄懂 CMake 的语法错误,知道CMake哪里写错了。

CMake 还是比较先进,大部分的项目还是 configure + makefile的,例如 nginx,redis 。

学习 C/C++ 的比较好的方法,是直接参与一个开源项目,例如 FFmpeg,可以帮他们修bug,FFmpeg 是开放性的,任何人都能review代码。《如何成为ffmpeg开发者》

参与开源项目,就跟你去企业实习一样,实战,开源项目你看不懂的地方,你自然会想办法去把不懂的东西看懂。



接下来讲一下算法跟数据结构,如果你是做其他语言开发的,例如PHP,Python,JS,又或者java。这些语言做业务层开发,CURD开发,业务逻辑,会比较少用到算法与数据结构。

算法本身就是与编程语言无关的东西,在C/C++等语言没出来之前,算法早已存在很多年了,但是学习 算法与数据结构,我个人还是 推荐看 C/C++ 版本的实现,我为什么不推荐看 js 或者 php 的算法版本实现,有些书是基于 js 或者 php 来讲解算法,看那些书好像是不需要学习C/C++。但是,算法跟数据结构本身是用来提高性能,有些算法还需要用到多线程,php 没有多线程。你看 C语言版本的算法跟数据结构实现,才能比较好地理解性能提升的原因,如果用比较上层的语言,上层语言的实现本身自己就套了很多算法。如果可以,算法与数据结构,你最好看 C语言版本的实现,C++的可以后面看。

上面的《算法导论》我并不推荐新人阅读,特别是你学完C/C++ 语法跟编译链接知识之后,想看下算法知识,这种情况,我特别不建议你看《算法导论》,因为这是一本学者写的书,学者写书有个特点,最后都要将原理归到数学上去,将工程问题转换成数学问题。这样的好处是通过数学抽象,将一个特殊问题泛化成一个一般的问题,有利于进一步扩展,但这也让一些数学不太好的工程师望而却步,提升了理解的门槛。

所以《算法导论》里面你看不到任何实际的编程语言代码,你甚至没法debug,没法看单步看运行过程中的数据结构的变化,书里只有一些静态图片。我当初看这本书的B树算法的时候,只能在脑子里脑补代码运行,数据结构变化。这个过程非常痛苦,而且对于新人来说,效率低下。

什么是一本适合新人看的算法书,首先他应该提供可运行编译的代码,最好还可以教新人怎么搭建调试环境,Clionvs2019,最不济也要教新人怎么用 gdb 来调试,虽然GDB不太直观。当你搭建好调试环境,看到整个树结构的变化,你就会发现算法原来很简单。最后如果情况允许,最好提供一个算法的实际应用的小例子,例如用B树怎么做个简单的查询系统,怎么存储到硬盘。


流媒体相关的书籍推荐请看《流媒体书籍推荐》


即使是相同的技术领域,看书永远不要只看一本书,这是我早几年学习过程中的一个思维误区。早几年,我看《TCP/IP》3卷书的时候,我就已经知道 《计算机网络-自顶向下研究方法》。但是那时候我觉得都是讲网络的书,《TCP/IP》3卷书加起来3千多页,从卷一的概念到卷二的代码实现,我都看过了,还有必要买《计算机网络-自顶向下研究方法》吗?《TCP/IP》3卷书难道不能把整个网络知识讲解透彻?

上面这个问题,如果你写过比较多的文章,或者自己出版过一本技术书籍,你就会明白,作者只能告诉你他懂的,却无法告诉你他不知道的。

读者要是没有这个意识,就会以为书中讲的就是学科的全部,而错过了到边界外围探索的机会,何况,很多人对于某个领域,只有看一本书的习惯。

这里推荐一个读书的技巧,可以把众多书籍中相关的部分提取出来,一章一章读,一段一段读,因为即使是相同的技术,不同的作者也会有不同的阐述,看多了,或许就理解了。

我个人现在的读书技巧就是抽取某个章节来读,因为我在互联网做了9年左右的开发,已经有一定的技术跟知识积累,所以看书一般是看目录,找到自己需要的章节再慢慢读,因为大部分书籍,不同章节之间并不是强关联的,如果某些章节,你已经比较了解,可以直接跳过。



由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。QQ:2338195090。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注