前言

最近 Bili23 Downloader 项目需要精简程序体积大小,而原先使用的 FFmpeg 大小高达 80 MB,添加了很多无用的功能,因此现在需要重新编译一个 FFmpeg,根据实际需要进行精简。

准备工作

前往官网下载安装 MSYS2,不过多赘述。

配置 MSYS2 环境

安装 MSYS2 后,进入安装目录,运行 ucrt64.exe,进入 Shell。

接下来安装 ucrt64 工具链。

pacman -S mingw-w64-ucrt_x86_64-gcc

继续安装 make、pkg-config、nasm 和 diffutils 包。

pacman -S make pkg-config mingw-w64-ucrt_x86_64-nasm mingw-w64-ucrt_x86_64-diffutils

下载 FFmpeg 源码

前往官网下载 FFmpeg 源码。
将下载的 ffmpeg-8.0.tar.xz 移动到一个新的位置,例如 D:\FFmpeg\,那么 MSYS2 对应的路径就是 /d/FFmpeg/
进入目录,解压源码。

cd /d/FFmpeg
bsdtar -xf ffmpeg-8.0.tar.xz

编译 libmp3lame(可选)

如果需要处理 mp3 格式,还需要编译 libmp3lame,并配置编译参数。

下载 libmp3lame 源码,进入目录。
我这里放在 D:\FFmpeg 目录下,命名为 lame-3.100。

cd \d\FFmpeg\lame-3.100

配置编译参数。

./configure \
--prefix=/d/FFmpeg/lame-3.100/build \
--disable-shared \
--disable-frontend \
--enable-static \

然后开始编译 libmp3lame。(-j8 代表开启8个线程,加快编译速度,根据设备实际配置填写)

make -j8
make install

编译完成后,接下来开始配置 FFmpeg。

配置 FFmpeg 编译参数

进入 FFmpeg 源码目录,新建一个 gccconf 文件,文件内容如下:

./configure \
--prefix=./ffmpeg-build \
--disable-doc \
--disable-shared \
--disable-everything \
--disable-programs \
--disable-swscale \
--disable-filters \
--disable-swresample \
--disable-avx512 \
--disable-network \
--disable-avdevice \
--disable-autodetect \
--enable-demuxer='concat,ffmetadata,mov,mp4,flv,m4a,mp3,m4a' \
--enable-muxer='mp4,flv,mp3,m4a,flac' \
--enable-decoder='h264,hevc,av1,aac,flac,eac3,ac3' \
--enable-encoder='libmp3lame,flac' \
--enable-static \
--enable-small \
--enable-ffmpeg \
--enable-protocol='file,concat' \
--enable-libmp3lame \
--enable-gpl \
--extra-ldflags='-static -static-libgcc -static-libstdc++' \
--extra-ldflags="-L/d/FFmpeg/lame-3.100/build/lib" \
--extra-cflags="-I/d/FFmpeg/lame-3.100/build/include" \

参数根据实际需要进行修改,这里我们需要尽量精简文件,保留程序所需的音视频合并功能,因此使用了 --enable-small 参数,并设置解混器 --enable-demuxer='concat,ffmetadata,mov,mp4',解码器 --enable-decoder='h264,hevc,av1,aac,flac,eac3,ac3',混合器 --enable-muxer=mp4,为了兼容 mp3 格式转换功能,另外编译了 libmp3lame,并 include 相关库文件,如果不需要兼容 mp3 格式,直接去除相关配置即可。

运行下面的命令查看所有编译参数用法:

./configure --help

随后运行 gccconf,进行配置。等待一会,会显示配置信息,因为太长就不展示了。

编译 FFmpeg

依次执行,等待编译完成。

make -j8
make install

进入 ffmpeg-build 目录,查看编译出来的 FFmpeg。

cd ffmpeg-build
./ffmpeg

正常输出,FFmpeg 编译完成。

关于 Linux 和 macOS 上编译

基本上大同小异,只不过 Windows 需要一个 MSYS2 环境提供 mingw64。对于Linux,直接安装相关编译依赖就行。

sudo apt install build-essential pkg-config yasm nasm libx264-dev libx265-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev