写作不是思考的记录,写作就是思考本身。—理查德·费曼
本文开头借用了 理查德 的名言来表达 写作的重要性。写作不仅仅是 记录你的学习过程,更是一种总结,扩展思维的方法。有很多东西,会在你写作的过程中不断被深入。甚至有些知识点你自己没意识到的,直到写出来了才明白。
《FFmpeg原理》的创作之路其实就是 我自己学习音视频技术的过程,我在2年前不是做音视频开发的。之前更多的是做PHP后端开发。所以对 C/C++ 并不是特别熟悉。
当我决定学习音视频的时候,我立即买了好几本高大上的书来看,例如《信息论》《数字视频编码技术原理》等等。这些书其实我在2年前是看不懂的,我硬着头皮去看了一个月,也看不懂。
后来发现,是我的学习路线错了。音视频开发,基本上使用的都是 C/C++,所以首先需要学习的是 编译 链接,调试的基础知识,做到大多数 C/C++ 项目都能顺利 build 起来,然后单步调试。
你得先是一位 C/C++ 工程师,然后才能成为一位 音视频 工程师。
所以在阅读了 俞甲子的《程序员的自我修养》跟 张银奎老师的《软件调试》之后,我精炼出了一章《编译链接基础知识》的内容,如下:
在掌握了 C/C++ 基本的 编译链接,调试的知识之后,我们就可以去学习 FFmpeg 的 API 函数的用法了。有可能会有同学问,那 C/C++ 的语法用不用学,这个我觉得学个 50% 就行了,剩下的语法知识,你直接在实战中,在调试别人的代码中学习会更加快。
如果你一直不去实战,不去调试,不去看别人成熟的代码设计。会很容易陷入 C/C++ 的语法迷宫。
音视频开发,我个人觉得起步还是需要踏实一点,一开始你不用去看那些 编解码算法,只需要知道 编码系统 可以压缩数据就行了。
刚开始,你只需要去学习怎么调库就完事了,音视频领域有很多库,有非常多的框架,如下:
Android 多媒体框架,包括 MediaPlayer,MediaCodec 等等。还有 OpenMax
IOS,macOS 的多媒体框架 AVFoundation
Windows 的多媒体框架,Media Foundation,DXVA
FFmpeg,GStreamer,webrtc
在《FFmpeg原理》里面,主要就介绍 FFmpeg 这个库的基本使用,如下:
但其实,掌握了 FFmpeg 库的基本使用之后,还是不够,因为对于 FFmpeg 这个开源项目来说,除了 libavformat.so
,libavcodec.so
等等 8 个动态库之外,还有一个 ffmpeg.c
,ffmpeg.c
是什么?
ffmpeg.c
是 ffmpeg.exe
命令行的核心代码,ffmpeg.c
也是调了 8 个动态库的 API 函数来实现自身功能的。但是 ffmpeg.c
本身有 5千多行代码,这 5000 多行代码是处理各种场景的鲁棒性,pts 时间戳,各种参数设置的。
ffmpeg 开发最难搞的就是各种参数的设置,如果你自己调 API 实现功能,肯定会遇到某些参数设置错了,某些参数漏了没设置等等,问题。
而 ffmpeg.c
把这些细节问题通通帮你解决了。
所以在学习了 FFmpeg API 函数的基本使用,了解了基本的 解复用 ➔ 解码 ➔ 编码 ➔ Muxer 的过程之后。就需要去学习 ffmpeg.c
的代码,不用了解 ffmpeg.c
里面所有的细节,做到 能根据需求 二次开发 ffmpeg.c
即可,这也就是《FFmpeg原理》一书的内容,如下:
当你掌握了 FFmpeg API 的基本用法,也可以二次开发 ffmpeg.c
之后,大部分的需求你基本都能解决了。但是还有一部分需求需要更深入知识。
例如自定义一个 Demuxer/Muxer 来实现加密播放器的功能。自定义一个 AVFilter
来实现特定的视频效果。等等,这个就是《FFmpeg原理》下册的内容,如下:
最后再分享一下我创作这本书的一些经验。
因为写作是需要灵感,灵感不会因为你设置了 Deadline 就会蹦出来。相反 Deadline 会阻碍灵感的产生。
当 Deadline 到期的时候,匆匆忙忙把一些章节内容完成,很容易避重就轻。
我觉得一部好的作品,它是没有完成的那一天的,因为我平时就是有灵感,想到了更好的表达这个算法的描述,我就去修改文章,或者增添内容,等等。
同时,写作可以不断训练你的文字表达能力,当你写得越多的时候,很多复杂的东西,你都能用简单的语言来讲述给别人听。
而且写作通常是需要大量阅读参考书籍的,这也会使你的阅读速度大幅度提高。
最后,推荐一下我的《FFmpeg原理》VIP版,售价 79.9 元,VIP版 一共提供 以下 4 种服务。
VIP专属章节
作者一对一答疑,答疑范围仅限于本书内容
音视频俱乐部 社群
PDF,EPUB 离线电子书(1700页)
详情请点击 FFmpeg原理VIP版购买 查看