先总体介绍一下FFmpeg,后面有时间了,再分类介绍一些工具,如转码、滤镜、视频截断与合并等功能。本文分如下几个章节来介绍。

1.FFmpeg是什么?

  它的官网为:https://ffmpeg.org/,由Fabrice Bellard(法国著名程序员Born in 1972)于2000年发起创建的开源项目。该人是个牛人,在很多领域都有很大的贡献。

  FFmpeg是多媒体领域的万能工具。只要涉及音视频领域的处理,基本上没有它做不了的事情!通俗点讲,从视频录制、视频编辑再到播放,它都能做!

  最近比较火的抖音,还有国内的一些视频点播厂商,像爱奇艺、腾讯视频、优酷视频,还有播放器,像QQ影音、暴风影音等,都离不开它!否则非常痛苦!为什么呢?

  因为又要招一大帮人来把多媒体领域内的基础工具(音视频编解码器、文件格式和协议库、滤镜库等等)实现掉。

2.FFmpeg的版权问题如何?

  它是一个开源、免费、跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证。而LGPL或GPL许可证又要求,基于该许可证进行开发的代码,也有义务和责任GPL你的代码,无论是你直接使用它的代码,还是不修改代码而链接它的库。

  很多厂商,尤其国内的,都不太care版权问题,以致于上了耻辱柱。一些播放器,像KMPlayer(韩国的)、Potplayer、暴风影音、QQ影音等,使用了ffmpeg但没开源,还有一些视频直播短视频类的,像tiktok客户端,也使用了ffmpeg的库。

  FFmpeg有耻辱柱公示栏,但目前已下线。从历史记录里,我们依然可以看到这些名单,但这个名单到2014年就停止更新了,不知道出于何种原因。

3.FFmpeg工具包括什么?

  FFmpeg包含的工具众多。通俗来说,例如录制,从采集到编码再到封装,它都能干!例如视频播放,从解封装到解码再到输出,它也能干。例如给视频加各种滤镜(水印,字幕等等),对它来说也都是小菜一碟。再比如视频编解码格式的转码,还有文件格式的转换,对它来说,都不在话下。

  从专业角度上,以功能分类,它包含了如下几个库(ffmpeg -h命令可以查看):

libavutil —— 基础工具库,用于辅助多媒体编程。例如,数学函数、字符串操作、内存管理相关、数据结构相关、错误码及错误处理、日志输出,以及其他辅助信息(比如密钥、哈希值、宏、库版本、常量等)。

libavcodec ——音频、视频的编码和解码库,这是它的强项,很多codec都是从头开发,包含很多类型的编解码器!

libavformat ——文件格式和协议库,例如很多视频文件名都是以.mp4、.mkv、.avi后缀名结尾,该库包含众多用于文件封装(录制时)和解封装(播放时)的库。

libavdevice ——输入和输出的设备库,例如mic采集pcm数据,或pcm数据输出到声卡,视频帧输出渲染相关(又需要依赖SDL库,只有检测到SDL库才能编译相关的代码,例如ffplay编译出就需要依赖更底层的SDL库)。

libavfilter ——音视频滤镜库,例如音频里的变声不变调、变调不变声,视频领域内的添加水印、去水印、添加logo等,功能由该库完成。

libswscale ——图像格式转换库,例如视频帧的缩放、色彩空间转换等。

libswresample ——音频重采样库。

libpostproc ——视频后处理库。

4.下载时几个版本介绍(只针对win平台)

  去官网下载,可以下载三种类型(目前好像已不按照这种方式提供了)的压缩包:Dev版本、Static版本、Shared版本。

  “Dev版本”,提供:dll库+头文件。这个是已经编译出来的动态库(window下是dll,对应于linux下的so,上面列出来的按功能各有一个动态库),供第三方做二次开发,开发者的代码中引用提供的头文件,编译时链接这些dll库,即可让自己的exe跑起来。

  “static版本”,只包含编译出来的exe文件(其实就三个——ffmpeg/ffplay/ffprobe),不包含各种动态库(因为各种库已经打包进了exe文件中,这导致了这些exe文件的size非常大)。这个版本是为懒人准备的,直接拿来就可以跑,不用去解决各种编译及依赖问题。注意,里面不仅仅集成了由FFmpeg源码编译出来的东西,还集成了之外的内容(各种第三方库)。例如常用的x264编码器,本不属于FFmpeg所维护的范围,但其可以将其集成到ffmpeg.exe中。还有显示的SDL2,也被集成到ffplay.exe中。参考链接

  “shared版本”,提供:dll库+exe可执行文件。其中dll库和exe文件的size都很小。注意测试exe文件时,dll库路径要加载进系统环境变量中,否则执行时会导致链接库找不到而停止。