|
|
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.
|