在 Visual Studio 中使用 FFmpeg
Posted
技术标签:
【中文标题】在 Visual Studio 中使用 FFmpeg【英文标题】:Use FFmpeg in Visual Studio 【发布时间】:2012-07-26 22:45:46 【问题描述】:我正在尝试在 Visual Studio 2010 的 C++ 项目中使用 FFmpeg。我想将库作为静态链接文件包含在内。像libavcodec/api-example.c 这样的简单程序编译时没有错误,并且在启动它们时错误视图中不会出现链接器错误。但是,启动应用程序后会出现一个消息框,提示缺少 avutil-51.dll。您对如何解决这个问题有任何提示吗?
我使用了来自http://ffmpeg.zeranoe.com/builds/ 的最新开发版本。然后我指定 include 作为附加包含目录,avcodec.lib;avfilter.lib;avformat.lib;avutil.lib 作为附加依赖项,lib 作为附加库目录。
【问题讨论】:
【参考方案1】:使用 FFmpeg,您可以:
-
使用预构建的 .lib/.dll 文件,使用 Visual Studio 生成的二进制文件将依赖于 av*.dll 文件
使用非 Microsoft 编译器将 FFmpeg 从源代码编译成静态库,然后链接到您的 Visual Studio 项目(在这种情况下请注意 LGPL/GPL 许可证)
您按照上述第 1 项构建了您的项目。您必须使用和重新分发依赖于 av*.dll 的文件和您的二进制文件才能使其正常工作。
Zeranoe 上的“静态”表示库静态链接到像 ffmpeg.exe
这样的二进制文件中。不要将此与链接到二进制文件的静态 .lib
库混淆。 Zeranoe 不提供此类服务。
在Zeranoe 你会发现这样的档案:
“共享”ffmpeg-20120726-git-236ecc3-win32-shared.7z:bin/avcodec-54.dll
bin/avutil-51.dll
等
“开发”ffmpeg-20120726-git-236ecc3-win32-dev.7z:
lib/avcodec.lib
lib/avutil.lib
“共享”存档有 FFmpeg,它带有到 DLL 库的动态链接。 “Dev”存档具有 lib 文件,您可以在项目中使用这些文件来链接到它们,以及 ffmpeg.exe 在共享存档中所做的方式。
所以,您的 Visual Studio 项目可以像这样简单 (browse full source here):
extern "C"
// NOTE: Additional directory ..\zeranoe.com\dev\include gets to the files
#include "libavcodec\avcodec.h"
// NOTE: Additional directory ..\zeranoe.com\dev\lib gets to the files
#pragma comment(lib, "avcodec.lib")
// NOTE: Be sure to copy DLL files from ..\zeranoe.com\shared\bin to the directory of
// the FFmpegApp.exe binary
int _tmain(int argc, _TCHAR* argv[])
_tprintf(_T("Trying avcodec_register_all... "));
avcodec_register_all();
_tprintf(_T("Done.\n"));
return 0;
您将“Dev”存档解压缩到 Visual Studio 项目的 dev
子目录中,并在附加包含路径中添加 dev\include
。这足以构建二进制文件,它将依赖于av*.dll
:
这是您提取“共享”存档并将 DLL 从其bin
复制到二进制目录的时候。您的应用将从那里开始工作:
C:\FFmpegApp\Release>FFmpegApp.exe
Trying avcodec_register_all... Done.
2016 年 1 月 20 日更新:存储库中的项目已升级到 Visual Studio 2013(旧版 VS 2010 代码)并对照当前的 Zeranoe 构建进行检查。样品和说明保持良好状态。
请注意,Visual Studio 中的 Win32
构建假定您使用来自 Zeranoe 的 32 位文件。要构建 64 位版本,请下载相应的文件并分别设置 Visual C++ 项目,以构建 x64
(或者,最好同时下载,设置两个配置并分别配置 include/lib 路径)。位数不匹配会导致错误,在下面的 cmets 中有提到。
2021 年 7 月 20 日更新:(来自下面的 cmets)Zeranoe 版本不再可用。 Windows builds by BtbN 是一个很好的官方认可的替代方案。本教程需要(...)-win64-gpl-shared.zip
或(...)-win64-lgpl-shared.zip
文件。
【讨论】:
感谢您解决这个问题!项目中有一些 .dll.a 文件,我还尝试将它们作为链接器的附加包含包含在内。但是,没有 avutil-51.dll,只有 libavutil.dll.a 文件。我是否必须获得额外的 dll 或者我必须在哪里/如何包含它们? 我更新了上面的答案(对“静态”构建进行了更正)。您将需要开发档案链接到您的项目,共享档案会让您丢失 DLL。 我按照你的描述做了,但我无法让它工作(错误仍然存在)。我必须在哪里包含 DLL?我试图将它们放在各种包含路径中,并将它们复制到与可执行文件相同的文件夹中。我必须对“Dev”中的 *.dll.a 文件做任何事情吗? 绝对不要忘记extern "C"
!!我在你的例子中错过了它,因为我看不出我在做什么不同,所以我把头发扯掉了。
Zeranoe 版本不再可用。截至 2021 年 7 月 21 日,官方认可的良好替代方案是 Windows builds by BtbN。本教程需要(...)-win64-gpl-shared.zip
或(...)-win64-lgpl-shared.zip
文件。以上是关于在 Visual Studio 中使用 FFmpeg的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?
visual studio 2012中如何查看一个工程需要哪些dll文件???