windows 上 ffmpeg 库的安装
真复杂啊
安装 ffmpeg 库有两种途径,一种是自己下载源码再去编译,另一种是使用 vcpkg 自动安装
一般情况下,第二种是最简单方便的,但是如果你需要使用 ffmpeg 的特定历史版本,那就有点困难了
下面记录下我遇到的坑,
借助这篇文章,我打算使用 vcpkg 切换到 ffmpeg 的历史提交并安装
1. cmd 下切换到 vcpkg.exe 的安装目录下,确保该目录下有 .git 文件夹,没有的话,git init 新创建就行
2. 列出 ffmpeg 历史提交
1 | 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)受到影响
1 | git checkout 351fbda5b |
4. 重新安装 ffmpeg 静态库,如果之前已经安装了最新的,卸载即可
1 | 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 并将下面一行取消注释,取消注释后的代码如下
1 | set MSYS2_PATH_TYPE=inherit |
3. 在 x86 Native Tools Command 中运行 msys2_shell.cmd,会自动打开 msys2 窗口,在 msys2 窗口切换到 ffmpeg 源码下,并运行 configure
1 | ./configure --prefix=usr/local/ffmpegmsvc --disable-shared --enable- static --toolchain=msvc --enable-gpl |
这边理论成功的,但是失败了
ffbuild 文件夹下 config.log 记录了错误原因
1 2 3 4 5 6 7 8 | 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 命令来查看
1 2 3 4 5 | $ 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 都可以
另外还需要全局集成,命令行输入
1 | vcpkg integrate install |
一个简单的 vcpkg.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | { "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 声明
1 2 3 | extern "C" { #include "libavcodec/avcodec.h" } |
avcodec 库会引用 windows 系统库,添加一些需要的库是必要的,如下:
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |
注意:有些库不是必要的,仅供参考
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2022-09-19 字符串以空格分割的两种方法
2019-09-19 DirectX屏幕捕获和输出视频