六、VS 项目中引用 FFmpeg 库
编译好 FFmpeg 库后,下面我们就可以在 VS 中引用它了。
1、创建新项目
2、控制台应用
3、确定项目名称及位置
4、点击创建
5、引入FFmpeg 头文件
在 项目右键 -> 属性 -> C/C++ -> 常规 -> 附加包含目录
中添加 FFmpeg 头文件所在路径。
6、指定库文件位置
首先说明一点,我编译出来的库文件存在于 D:\msys64\usr\local\ffmpeg\bin 目录下
在 项目右键 -> 属性 -> 链接器 -> 常规 -> 附加库目录
中添加 FFmpeg 库所在路径。
7、指定使用哪个库
在 项目右键 -> 属性 -> 链接器 -> 输入 -> 附加依赖项
中指定你所用到的 FFmpeg 库
指定以下所有库:
avcodec.lib avdevice.lib avfilter.lib avformat.lib avutil.lib postproc.lib swresample.lib swscale.lib
8、运行编译好的程序
当上面这此工作完成后,我们就可以在 main(…) 函数中调用 FFmpeg API 了,如调用 FFmpeg 库中的日志函数:
#include <iostream> extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" } int main() { av_log_set_level(AV_LOG_DEBUG); av_log(NULL, AV_LOG_INFO, "Hello World!\n"); return 0; }
上述代码中,调用了 FFmpeg 中的两个 API,分别是 av_log_set_level(…) 以及 av_log(…),这两个函数都是 FFmpeg avutil 库中的 API。所以在使用这两个 API 之前,我们要在 main.c 中需要通过 #include 关键字将 libavtuil/log.h 这个头文件引入进来。
- 此外,由于 FFmpeg 是 C 语言库,而我们用 VS 创建的是 C++ 工程,所以在引入头文件时需要加上 extern “C” 关键字,否则的话 VS 无法将其成功编译。
执行出现了这样的报错,其原因是在运行时无法找到需要的动态库。
解决方案一:
将 D:\msys64\usr\local\ffmpeg\bin 目录下的 avutil-58.dll 文件拷贝到 C:\Windows\System32 目录下
拷贝结果如下:
再次执行程序,可以看到如下的结果
解决方案二:
只需将我们之前编译好的 FFmpeg 库,即提示的无法找到的 .dll 库,拷贝到执行程序的同一目录下,这样执行程序就可以找到该库并正确执行了。
七、编译 FFmpeg 依赖库
很多时候我们在编译 FFmpeg 库时还要增加一些其它库,如 SDL、x264 等,如果要将这些库添加到 FFmpeg 中,首先我们要编译出 Windows 下可用的对应库。
1、编译 SDL
①、下载 SDL 源码
首先从 github 上获取 SDL 源码,命令如下:
git clone https://github.com/libsdl-org/SDL.git git checkout release-2.26.x
需要注意的是,SDL现在已经发布了3.0版本,而ffmpeg目前只能用SDL2版本,所以在拉取代码后,需要切换到2.26这个版本
可以到这里自取 SDL-2.26.x
链接:https://pan.baidu.com/s/1n_wMhIsBb9yaDhAL8NHZ8Q
提取码:qqbh
②、下载 CMake
下载好 SDL2 源码后,我们需要使用 CMake 为其生成 VS 工程,并将其安装到 Windows 系统上。
可以到这里自取 CMake 安装包
链接:https://pan.baidu.com/s/1pQ7hh3WA6ES8pdBTpds1_Q
提取码:et4t
关于安装 CMake 这里,针对所有用户把 CMake 目录安装到系统目录
并将其安装到 D:\CMake\ 目录下
③、编译 SDL
之后打开 CMake-GUI,在 CMake-GUI 中指定 SDL 源码所在路径(D:/Git-Space/SDL)以及编译后的输出路径(D:/CMake/usr/local/)
随后执行
Configure -> Generate -> Open Project
生成 VS 工程。有了 VS 工程,我们就可以通过 VS2022 来编译 SDL 了。
分别在 Release 和 Debug 模式下,重新生成一下 All_BUILD 子项目。
没啥问题的话 SDL 就编译好了,你可以去 D:\Project\VS_Project\sdl_test\Debug 和 D:\Project\VS_Project\sdl_test\Release 目录下看看有没有对应的 lib 文件
D:\CMake\usr\local\sdl\Debug 目录如下:
D:\Project\VS_Project\sdl_test\Release 目录如下
为了满足要求,我们需要在指定输出目录下创建 lib 目录,并将 SDL2.lib 和 SDL2.dll 文件拷贝到 lib 目录下。同时在 lib 目录下创建 pkgconfig 目录,将 sdl2.pc 文件拷贝到该目录中。
最终完整的目录结构如下所示:
/usr/local/sdl2 |------------ lib | |-- sdl2.lib | |-- sdl2.dll | |-- pkgconfig | |----- sdl2.pc |------------ include
此外,我们还要修改 sdl2.pc 中的内容,将其中的库路径修改为指定的输出路径