前言
本文主要讲解 FFmpeg 相关知识,以及在 Windows 下编译 FFmpeg 源码以及使用。
一、FFmpeg 简介
ffmpeg 是广泛使用的多媒体解决方案,既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。
其包括了目前领先的音/视频编码库 libavcodec。
ffmpeg 提供了多种媒体格式的封装和解封装,包括多种音视频编码,多种协议的流媒体,多种色彩格式转换,多种采样率转换,多种码率转换等。ffmpeg 发展至今,已经被许多开源项目使用。
二、基本组成
ffmpeg 框架的基本组成包含 AVFormat,AVCodec,AVFilter,AVDevice,AVUtil 等。
1、封装模块 - AVFormat
AVFormat:文件格式和协议库,该模块是最重要的模块之一,封装了 Protocol 层和 Demuxer、Muxer 层,使得协议和格式对于开发者来说是透明的。
AVFormat 中实现了目前多媒体领域中绝大多数媒体封装格式,包括封装和解封装,如 MP4,FLV 等文件封装格式,RTMP,HLS 等网络协议封装格式。ffmpeg 是否支持某种封装格式,取决于编译时是否包含了该格式的封装库。
应用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。
2、编解码模块 - AVCodec
编解码库,该模块也是最重要的模块之一,封装了 Codec 层。
AVCodec 中实现了目前多媒体领域绝大多数常用的编解码格式,既支持编码,也支持解码。AVCodec 除了支持自带的媒体解码格式之外,还支持第三方的编解码器,如 H.264 编码,需要使用 x264 编码器;MP3编码,需要使用libmp3lame 编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在 AVCodec 中增加相应的编解码模块。(有一些 Codec 是具备自己的 License 的,FFmpeg 是不会默认添加像 libx264、FDK-AAC、lame 等库的,但是 FFmpeg 就像一个平台 一样,可以将其他的第三方的 Codec 以插件的方式添加进来,然后为开发者提供统一的接口)
该库是音视频编解码的核心,avcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用。
3、滤镜模块 - AVFilter
AVFilter 提供了一个通用的音频,视频,字幕等滤镜处理框架。该模块提供了包括音频特效和视频特效的处理,在使用 FFmpeg 的 API 进行编解码的过程中,直接使用该模块为音视频数据做特效处理是非常方便同时也非常高效的一种方式。
4、视频图像转换计算模块 - swscale
swscale 模块提供了高级别的图像转换 API,例如它允许进行图像缩放和像素格式转换,视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 gb565、rgb888 与 yuv420 等之间转换。
5、音频转换计算模块 - swresample
swresample 模块提供了高级别的音频重采样API。可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转换。例如,它允许操作音频采样,音频通道布局转换与布局调整。
6、AVUtil - 核心工具库
该模块是最基础的模块之一,许多其他模块都会依赖该库做一些基本的音视频处理操作。
7、AVDevice - 硬件采集,加速,显示
硬件采集,加速,显示。输入输出设备库,比如,需要编译出播放声音或者视频的工具 ffplay,就需要确保该模块是打开的,同时也需要 libSDL 的预先编译,因为该设备模块播放声音与播放视频使用的都是 libSDL 库。
三、命令行工具
ffmpeg 已经编译好了3个常用的工具集 ffmpeg.exe、ffprobe.exe、ffplay.exe. 通过这 3 个工具就可以使用命令去操作一个多媒体文件。
ffmpeg.exe:ffmpeg 主要用于对音视频进行处理,比如说剪切、抽取视频、抽取音频、增加贴纸水印等等。Hyper fast Audio and Video encoder,音视频编解码工具(类似爱剪辑、格式工厂)。
ffplay.exe:ffplay主要用于播放视频,几乎支持所有的本地视频播放,还能支持流媒体等网络视频播放,甚至还能播放YUV视频,这点在开发过程中非常好用。Simple media player 简单媒体播放器。
ffprobe.exe:ffprobe主要用于查看音视频文件格式,比如说你要将一个音视频文件的所有信息以 JSON 格式输出,ffprobe 这个命令行就很便捷。Simple multimedia streams analyzer,简单多媒体流分析器。
四、FFmpeg 环境搭建及初体验
这里参考一下我前面写的博客:音视频开发常用工具
五、Windows 下编译 FFmpeg
1、准备编译环境
Windows11 64位
需要安装的软件和工具:
Visual Studio 2022(我本地已有)
MSYS2 + CMake
2、MSYS2
除了需要安装 VS 之外,还要安装 MSYS2,这是一款 Windows下模拟 Linux 的软件。FFmpeg 的编译就是在该软件中进行的,而编译时使用的编译器(cl.exe)和链接器(link.exe)则是由 Visual Studio 提供的。
MSYS2 可以到这里下载:
链接:https://pan.baidu.com/s/1fWcS_5Xlxv1Bja4354JnvA
提取码:worc
我这里将其安装到了 D:\msys64 目录下
3、ffmpeg 源码
编译环境准备好之后,接下来我们需要下载一份最新的 FFmpeg 源码,可以使用 Git 下载。先将Git命令安装好,然后执行下面的命令。
cd /d/Git-Space git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
代码就被下载到 D:\Git-Space 盘的 ffmpeg 目录下了
ffmpeg 源码也可以到这里下载:
链接:https://pan.baidu.com/s/1gjsDtEn_E4yCwnbT3TVUWQ
提取码:dlvx
4、修改 msys64
首先,进入 MSYS2 的安装目录,比如我这里将 MSYS2 安装到了 D:\msys64 目录下。在该目录下打开 msys2_shell.cmd 文件,将该文件第 17 行代码的注释打开,即去掉 rem 关键字,如下所示:
之所以要打开该注释,是为了让 MSYS2 可以继承 Windows 控制台的环境变量。
5、安装其他编译工具
之后,找到 x64 Native Tools Command Prompt for VS 2022 命令窗口:
在该命令窗口中输入下面的命令启动 MSYS2 软件
# 进入到 MSYS2 目录下 cd D:\msys64 # 启动 MSYS2 msys2_shell.cmd
此时,会弹出 MSYS2 的命令窗口。接下来,在该窗口中输入下面命令,安装必要的编译工具:
pacman -S diffutils make pkg-config yasm
其中 pacman 是 MSYS2的 包安装工具;而 diffutils、make…都是编译 FFmpeg 时需要用的编译工具。
6、编译 FFmepg
当编译工具安装好后,在 MSYS2 命令窗中执行下面命令,进入到 FFmpeg 源码目录下:
cd /d/Git-Space/ffmpeg
紧接着,运行 FFmpeg 源码目录中的 configure 脚本生成 Makefile 文件,命令如下:
./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-nonfree --enable-shared --disable-ffprobe --toolchain=msvc
上述命令的含义是使用 mscv 作为 FFmpeg 的编译工具链;编译出的 FFmpeg 库被放到 /usr/local/ffmpeg 目录下;编译的库是动态库,在 Windows 下就是 DLL 库;编译时不生成 ffprobe 程序。
上述脚本执行完成后,你可以在 FFmpeg 源码目录下发现多了一个 Makefile 文件。有了这个文件我们就可以编译FFmpeg了,编译命令如下:
make -j4 && make install
出现了很多报错:
fftools/opt_common.c(206): error C2065: “slib”: 未声明的标识符
fftools/opt_common.c(206): error C2296: “%”: 无效,因为左操作数的类型为“char [138]”
解决办法:
该问题是因为在 Windows下无法识别 CC_IDENT 导致的,只需将包括 CC_IDENT 关键字的那行代码注释掉即可。
继续编译
make -j4 && make install
此时编译通过了
当执行完这条命令后,在 D:\MSYS64\usr\local\ffmpeg 目录下就可以找到编译好的 FFmpeg 库和 FFmpeg 命令了。