使用 FFmpeg 的编程接口、看 FFmpeg 源代码,有一个很重要的线索:FFmpeg 是用C语言开发的、以面向对象思想为指导的、插件化的音视频处理框架。

虽然满眼看到的都是C语言,但按照面向对象思想去理解,就更容易理清思路,具体的就不展开了,大家可以边看代码边体会。插件化很明显,各种编解码器、Filter在编译时可以配置。

有一些重要的概念贯彻框架始终:protocol、byteIO、stream、packet等等。FFmpeg 以抽象的角度看待音视频流、不会拘泥于某一种具体的音视频格式,甚至把音视频采集设备和视频文件抽象为同类的东西。这些设计思想值得我们学习借鉴。

需要注意的是,FFmpeg 最初的功能(或者说需求)是针对服务器环境设计的,在安卓或 iOS 等移动客户端上使用,会遇到一些问题,主要涉及视频处理的效率。因为移动客户端的CPU处理能力比较弱,计算密集的操作要靠系统硬件加速(比如 GPU 通过 OpenGL 提供的加速功能)才能达到较好的效果。而 FFmpeg 典型情况下运行在服务器上,一切运算都是CPU搞定。这是需求变化导致的问题,并不是 FFmpeg 不行。但这也说明 FFmpeg 不是万能的,遇到 FFmpeg 不擅长的功能,需要开发者有一定的音视频开发能力才能解决。因此,使用 FFmpeg 进行编程并不太适合小白选手 —— FFmpeg 已有功能的排列组合,使用命令行就能搞定,使用编程接口不开发出点新东西是说不过去的。