真复杂啊
安装 ffmpeg 库有两种途径,一种是自己下载源码再去编译,另一种是使用 vcpkg 自动安装
一般情况下,第二种是最简单方便的,但是如果你需要使用 ffmpeg 的特定历史版本,那就有点困难了
下面记录下我遇到的坑,
借助这篇文章,我打算使用 vcpkg 切换到 ffmpeg 的历史提交并安装
1. cmd 下切换到 vcpkg.exe 的安装目录下,确保该目录下有 .git 文件夹,没有的话,git init 新创建就行
2. 列出 ffmpeg 历史提交
git log --color=always --pretty="%Cred%h%Creset -%C(auto)%d%Creset %Cgreen%s%Creset %Cgreen(%ad)" --date=short | grep --color=never ffmpeg
3. 找到你需要的历史提交,复制并切换,这里你可以先自己 checkout 一个测试分支,以免原始分支(master)受到影响
git checkout 351fbda5b
4. 重新安装 ffmpeg 静态库,如果之前已经安装了最新的,卸载即可
vcpkg install ffmpeg:x86-windows-static
问题来了,到这一步应该就安装成功了,可是事实往往相反,报错了
搜了相关错误文章,没有找到合适的解决方法,所以这条路先放弃
补充:要安装 grep 工具,自行查找安装即可,以及 PowerShell Core 工具,可以到 github 上下载安装包
我又尝试手动编译 ffmpeg 库,下载了相关的源码,并借助这篇文章来学习如何编译
文章中的 MINGW 编译库的方法是可以成功的,不过我们需要在 visual studio 中调试源码,所以要用 msvc 编译源码
方法如下:(x86 版本)
1. 打开 x86 Native Tools Command Prompt for VS 2019,切到 msys64 目录
2. 用 Notepad++ 打开 msys2_shell.cmd 并将下面一行取消注释,取消注释后的代码如下
set MSYS2_PATH_TYPE=inherit
3. 在 x86 Native Tools Command 中运行 msys2_shell.cmd,会自动打开 msys2 窗口,在 msys2 窗口切换到 ffmpeg 源码下,并运行 configure
./configure --prefix=usr/local/ffmpegmsvc --disable-shared --enable-static --toolchain=msvc --enable-gpl
这边理论成功的,但是失败了
ffbuild 文件夹下 config.log 记录了错误原因
BEGIN ./ffconf.ZNgb3tDo/test.c
1 int main(void){ return 0; }
END ./ffconf.ZNgb3tDo/test.c
cl -nologo -c -Fo./ffconf.ZNgb3tDo/test.o ./ffconf.ZNgb3tDo/test.c
test.c
./compat/windows/mslink -nologo -out:./ffconf.ZNgb3tDo/test.exe ./ffconf.ZNgb3tDo/test.o
LINK : fatal error LNK1104: 无法打开文件“LIBCMT.lib”
C compiler test failed.
这个错误我搜索了很多资料,但是都无法解决
另:我在自己的电脑上操作了上面的安装步骤,是可以成功的,感觉是公司电脑环境有问题,无语
还有要避坑的地方是注意 cl 的路径是否正确,以及 link 的位置,可以使用 which 命令来查看
$ which link
/c/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.37.32822/bin/HostX86/x86/link
$ which cl
/c/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.37.32822/bin/HostX86/x86/cl
特别是 link,往往最后会提醒你找不到匹配的 link.exe,因为配置过程中有可能会使用 msys2 下的 link.exe,我们可以简单的将 link.exe 重命名来避免链接错误
最后打算使用微软出的 vcpkg 控制版本来完成这个需求,使用 vcpkg.json 文件控制,相关文章如下
更新:(两种方法都可以正常工作)
站内有专门的文章介绍了两种使用 Mainifest 方法,第一种是在 cmake 时检测 vcpkg.json 并构建 .sln 工程
注意:baseline 是控制的最低版本,但是 vcpkg 提供的一些库的历史 baseline 并没有用,在 cmake 时会提示错误,建议多测试几个 baseline
第二种是在 msbuild 中检测 vcpkg.json,该方法是在 build 工程时检测是否有 json 文件(vcpkg.json 需要放在 .sln 同级目录下),如果有,则依赖清单中的库,方法比较简单
补充:这两种方法都需要设置环境变量
变量值个人感觉设置 versions 或者 mainifest 都可以
另外还需要全局集成,命令行输入
vcpkg integrate install
一个简单的 vcpkg.json
{
"name": "versions-test",
"version": "1.0.0",
"dependencies": [
"ffmpeg",
"pthreads",
"openssl",
"glew",
"glfw3",
"sdl2"
],
"builtin-baseline": "6a349fe1fbea1e5fcda2e0775f555d829a5e82df",
"overrides": [
{ "name": "ffmpeg", "version": "4.4" },
{ "name": "glew", "version": "2.2.0"},
{ "name": "glfw3", "version": "3.3.8"},
{ "name": "sdl2", "version": "2.26.2"}
]
}
ffmpeg 是 C 接口,需要在相关头文件前加 extern 声明
extern "C" {
#include "libavcodec/avcodec.h"
}
avcodec 库会引用 windows 系统库,添加一些需要的库是必要的,如下:
ws2_32.lib
crypt32.lib
shlwapi.lib
winmm.lib
ddraw.lib
dxguid.lib
mfuuid.lib
Mfplat.lib
mf.lib
Secur32.lib
Strmiids.lib
Bcrypt.lib
注意:有些库不是必要的,仅供参考