FFmpeg 1.1 + libvpx 1.3.0 编译配置说明 一、编译目标 目标平台:Windows 32 位(x86 / Win32)。 FFmpeg:n1.1,仅生成 libavcodec、libavformat、libavutil、libswscale 四个动态库及对应 MSVC 导入库。 libvpx:1.3.0,构建 Release 静态库,启用 VP8 编码和解码,禁用 VP9,然后静态链接进 avcodec-54.dll。 FFmpeg 保持 LGPL 2.1 或更高版本配置,关闭 GPL、nonfree 和 version3。libvpx 使用其原有 BSD 许可,另附 PATENTS 文件。 FFmpeg 启用 -O2 优化并保留 -Z7 调试信息;本次没有单独构建一套 Debug DLL。 二、编译环境和源码位置 MSVC:Visual Studio 2010,x86 编译器 16.00.30319.01。 Windows SDK:7.0A。 MSBuild:C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe。 MSYS2:E:\msys64,使用 Bash、GNU Make、Perl、diff 等工具。 Yasm:1.3.0,位于 E:\thirdparty-build\tools\yasm。 C99 转换工具:E:\thirdparty-build\tools\c99-to-c89。 兼容整数头文件:E:\thirdparty-build\tools\msinttypes。 环境入口:E:\thirdparty-build\ffmpeg-vs2010.cmd。 该入口加载 VS2010 vcvars32.bat,仅设置当前终端及子进程的 PATH、INCLUDE、临时目录等环境变量。 本包 source\FFmpeg-n1.1 保存完整 FFmpeg n1.1 源码,包括 configure、公共构建文件和 compat 等目录。 本包 source\libvpx-1.3.0 保留完整 libvpx 源码;其中的 VP9 等文件不代表本次启用了对应功能。 以下命令中的绝对路径是原始构建机记录,迁移后应替换为本包对应源码及工具路径。 三、libvpx 实际构建命令 先启动上述环境入口。以下命令在其 Bash 终端执行,构建目录和输出目录需预先创建。 以下脚本采用本机实际目录;迁移目录时需要同步调整脚本中的所有路径。 #!/usr/bin/env bash set -e # 使用 VS2010 构建供 FFmpeg 链接的 Win32 静态库。 cd /e/thirdparty-build/build/libvpx-1.3.0-x86-static # 旧版工程生成器需要相对源码路径,避免把 MSYS 盘符路径写入 VS 工程。 ../../source/libvpx-1.3.0/configure \ --target=x86-win32-vs10 \ --prefix=/e/thirdparty-build/output/libvpx-1.3.0-x86-static \ --enable-static --disable-shared --enable-static-msvcrt \ --enable-vp8 --disable-vp9 --disable-examples --disable-unit-tests \ --disable-docs --disable-debug-libs make NO_LAUNCH_DEVENV=1 # Yasm 的格式名区分大小写,旧生成器给出的 Win32 必须改为 win32。 sed -i 's/-f $(PlatformName)/-f win32/g' vpx.vcxproj MSYS2_ARG_CONV_EXCL='*' /c/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe \ vpx.sln -t:Build -p:Configuration=Release -p:Platform=Win32 -verbosity:minimal test -f Win32/Release/vpxmt.lib make NO_LAUNCH_DEVENV=1 install # FFmpeg 1.1 的检测脚本使用 vpx.lib 这个名称。 mkdir -p /e/thirdparty-build/output/libvpx-1.3.0-x86-static/lib cp Win32/Release/vpxmt.lib /e/thirdparty-build/output/libvpx-1.3.0-x86-static/lib/vpx.lib 四、FFmpeg 实际构建命令 libvpx 构建、安装完成后执行下面的命令。 --enable-shared/--disable-static 控制 FFmpeg 自身生成动态库;libvpx 则通过静态 vpx.lib 链接进去。 --extra-ldflags 使用 MSVC 链接器的 -libpath: 语法。 FFmpeg 的 avcodec.lib 等四个 .lib 是 DLL 导入库;libvpx 的 vpx.lib 是包含实现的静态库,两者性质不同。 #!/usr/bin/env bash set -e # 保留原四库与 LGPL 配置,静态链接已经构建的 libvpx。 cd /e/thirdparty-build/build/ffmpeg-1.1-lgpl-vpx-x86 test -f /e/thirdparty-build/output/libvpx-1.3.0-x86-static/lib/vpx.lib /c/Users/ljj22/Desktop/thirdparty-build/FFmpeg-n1.1/configure \ --toolchain=msvc --target-os=win32 --arch=x86 \ --prefix=/e/thirdparty-build/output/ffmpeg-1.1-lgpl-vpx-x86 \ --enable-shared --disable-static \ --disable-gpl --disable-nonfree --disable-version3 \ --disable-programs --disable-doc \ --disable-avdevice --disable-avfilter --disable-swresample \ --disable-avresample --disable-postproc \ --enable-libvpx \ --extra-cflags="-IE:/thirdparty-build/output/libvpx-1.3.0-x86-static/include -MT" \ --extra-ldflags="-libpath:E:/thirdparty-build/output/libvpx-1.3.0-x86-static/lib" # 中文版编译器的版本字符串经 MSYS 转码后会使 VS2010 误读引号,改成等价 ASCII 描述。 sed -i 's/^#define CC_IDENT .*/#define CC_IDENT "MSVC 16.00.30319.01 x86"/' config.h make -j4 make install 五、本机兼容性处理 1. libvpx configure 使用相对源码路径,避免旧生成器把 /e/... 路径错误写进 VS2010 工程。 2. 仅在生成的 vpx.vcxproj 中将 Yasm 参数 -f $(PlatformName) 改为 -f win32。Yasm 对格式名称大小写敏感。 3. 将生成的 vpxmt.lib 复制为安装目录 lib\vpx.lib,供 FFmpeg 的 libvpx 检测和链接使用;文件内容一致。 4. 中文版 MSVC 的版本描述在 MSYS 转码后引起 config.h 的 C2001 错误;仅将生成文件的 CC_IDENT 改为 ASCII 描述 MSVC 16.00.30319.01 x86。未修改编解码源码或许可选项。 5. configure 提示 pkg-config 不存在,但本次通过显式头文件路径、库路径及实际链接检测找到 libvpx。 六、配置记录和输出 FFmpeg 实际输出如下: 模块 DLL 文件 导入库文件 模块版本 libavcodec avcodec-54.dll avcodec.lib 54.86.100 libavformat avformat-54.dll avformat.lib 54.59.106 libavutil avutil-52.dll avutil.lib 52.13.100 libswscale swscale-2.dll swscale.lib 2.1.103 make install 将四个 DLL 及四个导入库安装到 bin,将公开头文件安装到 include。 本包将 FFmpeg 输出分别整理到 bin、lib、include;libvpx 源码保存在 source\libvpx-1.3.0,已静态链接进 avcodec-54.dll。 configuration 保留 FFmpeg 的 config.h、config.mak、config.log,其中 config.h 已包含上述 CC_IDENT 修正。 config.log 记录配置检测过程,其中功能探测失败不等于最终构建失败;该文件不是 make 的编译日志。 七、许可文件 FFmpeg:licenses\FFmpeg\LICENSE、licenses\FFmpeg\COPYING.LGPLv2.1。各源文件内的原始声明仍保留。 libvpx:licenses\libvpx\LICENSE、licenses\libvpx\PATENTS。原源码中的许可及署名文件仍保留。 本包 source\FFmpeg-n1.1 已包含本次构建对应的完整 FFmpeg 1.1 源码。 按 FFmpeg LICENSE 保留 IJG 致谢: This software is based in part on the work of the Independent JPEG Group.