在 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 中 如何还原.bak数据文件

如何在visual studio开发android程序

visual studio 2012中如何查看一个工程需要哪些dll文件???

如何在Visual Studio Code 中运行 Python

在 Visual Studio 2015 中打开 Visual Studio 2017 项目