windows 上 ffmpeg 库的安装

真复杂啊

安装 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

注意:有些库不是必要的,仅供参考

posted @ 2023-09-19 15:46  strive-sun  阅读(374)  评论(0编辑  收藏  举报