在 Windows 10 子系统 Ubuntu 中编译 Win32 版本 FFmpeg 给唧唧特供

FFmpeg 4.1.2, libmp3lame 3.100

FFmpeg 4.1.1 直接下载编译好的版本实在是太大了 64 位的 61M, 32 位的 59M. 但是唧唧用不到所有的功能所以一直用着旧版本的只有 21M 的 FFmpeg 苟命. 但是由于编码更新了, 旧的也出现了问题在此不得不更新 FFmpeg 了.

直接更新存在一个流量费贵的问题, 59M 的压缩后也有 18M 在算上几万次的下载请求. 流量费非常昂贵.

于是想到了编译一个只有唧唧需要功能的 FFmpeg 给唧唧使用. 就有了这篇文章~ 编译完的只有 3M 哟!~

如何编译精简版 FFmpeg

如果你只需要 FFmpeg 的某些功能而不需要全部的功能, 可以通过编译精简版来减少二进制文件的大小。下面是我在编译精简版 FFmpeg 时的一些经验与操作步骤。

唧唧处理视频需要的模块

flv 解流|混流、MP4 混流、h264 解码器、HEVC 解码、文件协议、mp3 编码 (libmp3lame)

环境安装

首先, 需要安装交叉编译工具, 下面是必要的工具包

apt-get install gcc-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64-tools yasm lua5.2 libtool automake autoconf autopoint make gettext pkg-config

编译 libmp3lame

下载地址: LAME (Lame Aint an MP3 Encoder)
备用下载: lame-3.100.tar.gz

我们选择使用 MP3 编码器是 libmp3lame

FFmpeg 4.1.2 需要 3.98.3 以上版本的, 首先需要编译 libmp3lame 3.100

libmp3lame-error.png

libmp3lame 3.100 版本编译 Windows 版本会遇到一个错误

Cannot export lame_init_old: symbol not defined

bug 跟踪连接 https://sourceforge.net/p/lame/bugs/487/

Version 3.100 breaks Windows compatibility when using libiconv since frontend/parse.c now depends on langinfo.h.
I'm using the MinGW-w64 (GCC-compatible) compiler.

Looks better now, except for this error:
Cannot export lame_init_old: symbol not defined

But I was able to build both static and shared libraries for Windows after removing lame_init_old from include/libmp3lame.sym.

大致解释就是编辑 include/libmp3lame.sym 文件, 把 lame_init_old 删除就可以编译了

libmp3lame 编译参数

./configure --host=i686-w64-mingw32 --enable-static=yes --enable-shared=no
make -j
sudo make install

编译 FFmpeg

在编译 FFmpeg 时, 我们需要配置选项来指定要编译的功能, 以便精简不需要的部分。

FFmpeg 大部分参数是由 TG 群的 Xuan 提供的, 感谢

Snipaste_2019-04-02_01-33-14.png

# 配置
./configure --arch=x86 --target-os=mingw32 --cross-prefix=i686-w64-mingw32- --disable-debug --disable-doc --disable-ffplay --disable-ffprobe --enable-static --disable-shared --disable-network --disable-autodetect --disable-decoders --enable-gpl --enable-version3 --enable-decoder=h264,hevc,aac*,mp3*,mp4 --disable-encoders --disable-demuxers --enable-demuxer=concat,mov,m4v,flv,mp3 --disable-muxers --enable-muxer=flv,mp4,mp3 --enable-encoder=libmp3lame,mp3 --disable-parsers --enable-parser=h264,hevc --disable-protocols --enable-protocol=concat,file --disable-bsfs --enable-bsf=h264_metadata,h264_mp4toannexb,hevc_mp4toannexb,hevc_metadata --disable-filters --enable-filter=concat,aresample --disable-iconv --enable-small --enable-libmp3lame --extra-ldflags="-L/usr/local/lib" --extra-cflags="-I/usr/local/include"

# 编译
make -j

注意事项

libmp3lame 交叉编译

如果你没有交叉编译 libmp3lame, 而是直接使用了 Linux 下的 .so 文件, 那么会出现这错误。请确保交叉编译 libmp3lame, 并将其用于 Windows 编译。

undefined reference to '_lame_set_VBR_quality'

/usr/local/lib/libmp3lame.so is your native lame library (for linux). you should cross-compile lame for windows

原文

lame_set_VBR_quality (again)
Best config for ffmpeg to convert MP3 file only
How to compile ffmpeg to get only mp3 and mp4 support

最后更新于 2020-03-13
使用 Hugo 构建
主题 StackJimmy 设计