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

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

posted @   strive-sun  阅读(1678)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
历史上的今天:
2022-09-19 字符串以空格分割的两种方法
2019-09-19 DirectX屏幕捕获和输出视频
点击右上角即可分享
微信分享提示