PS:此贴为解决过程记录贴,比较啰嗦,凑合着看。
环境:vistual studio2017(x64+debug)+ffmpeg-4.3-win64-dev+ffmpeg-4.3.1-win64-shared;
前提:已配置好ffmpeg-4.3-win64-dev版本到vs中;
目录
一、解决过程
1、查资料
在网上收罗资料后总结为三种可能
(1)没有在av_format_open_input()之前加入av_register_all();
(2)cmake编译时需加入--enable-protocols;
(3)缺少dll动态链接库;
其中
(1)和(2)参考链接为:
ffmpeg 报错 avformat_open_input 返回-1330794744_ffmpeg -1330794744-CSDN博客
(3)参考链接为:
Windows下 ffmpeg 的 “Protocol not found“ 的解决-CSDN博客
2、尝试解决
(1)加入av_register_all()后依然无效
(2)针对编译操作,由于我的FFmpeg是从官网直接下载的dev + static + shared三个版本,并未经过编译步骤。然后尝试参考博客win10下搭建最新版FFmpeg编译环境参考这篇文章就够了 - yongfengnice - 博客园 (cnblogs.com)进行一遍编译操作,结果在第5步执行configure时遇到“找不到intl.dll,无法执行代码”的问题,在网站intl.dll 免费下载 | DLL‑files.com (dll-files.com)下载了两个版本的intl.dll后遇到
【1】版本1:无论在System32或是在SysWOW64中都无法注册dll,错误信息(大致意思)为:该模块与您的系统不兼容;
【2】版本2:无论在System32或是在SysWOW64中都无法注册dll,错误信息(大致意思)为:模块已加载,但是找不到入口点DLLRegisterServer;
两个问题在参考各博客并尝试后,皆无法解决。
(3)在第二个参考链接Windows下 ffmpeg 的 “Protocol not found“ 的解决-CSDN博客中,我发现自己与该博主遇到的问题有点类似,也是配置过GStreamer,并且在查看过三个版本的FFmpeg后,发现shared版本的bin目录中,有与该帖的最后一张图类似的文件,如下图所示,
参考该帖的博主所说,需要到正确版本的dll才可以解决问题,进而发现,FFmpeg官网下载的dev开发者版本文件夹中,并没有任何的dll文件供开发者使用,于是出于好奇,我把这些dll全部复制到我的项目文件夹的debug文件夹中(参考地址:"C:/用户/用户名/source/repos/项目名/x64/debug/"),并重启vs2017,重新执行后顺利解决。
3、总结
综上所述,av_format_open_input需要用到上图的一些dll动态链接库,把ffmpeg-shared版本bin目录下的dll文件扔进vs项目的debug文件夹后,问题解决。
注:我所使用的vs2017模式是x64+debug,如果vs中使用的是release的话可能无效,需要使用其他办法链接这些dll到自己的项目中
二、后续
在问题得到解决后,觉得每创建一个项目都要复制一堆dll文件去项目文件夹好麻烦,作为一个有空没事做的无业闲散人士,当然要折腾一下,想办法一劳永逸。
从.dll文件导出对应的.lib文件
参考博客:如何从dll文件导出对应的lib文件? - Tocy - 博客园 (cnblogs.com)
所用方法为vitual studio自带的dumpbin工具,首先在电脑(win10)左下角的搜索栏中输入“VS 2017的开发人员命令提示符”,搜不到的可以去"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2017\Visual Studio Tools\"文件夹下找,然后cd到FFmpeg的share版本的bin目录下(cd后需要再打一次对应的盘号),如下图所示,
然后按照参考博客的步骤:
(1)对照bin文件夹中所含有的所有dll文件,逐个输入命令行:“dumpbin /exports 目标文件名称.dll > 目标文件名称.def”;
(2)把生成的所有def文件改为以下格式(需参考博客看看格式,有可能需要添加@1、@2......,我这版本没有,所以全部def都直接改成下面的代码了):
LIBRARY export
EXPORTS
(3)使用命令行“lib /def:目标文件名称.def /machine:i386 /out:目标文件名称.lib”,逐个生成各个dll所对应的lib文件;
(4)(注:vs需要先配置好FFmpeg的dev版本,在配置文件中配置好VC++的include、lib,以及链接器的输入依赖项即可,网上有教程,可自行搜索)
复制所有dll文件以及对应的lib文件到ffmpeg-4.3-win64-dev版本的lib文件夹中,在vs的配置文件(即“属性管理器”中的配置) -> 通用属性 -> 链接器 -> 输入 -> 附加依赖项 中输入生成的所有lib,如下图所示,
,然后重启vs即可。
结语
这个问题本来是我2022年年末做毕业设计时遇到的,当时我的导师推荐我尝试一下踏入编解码的知识海洋中,所以这次毕设是我第一次入坑视频编解码的尝试,可惜当时花了一个多月时间都没能找到方法,最后灰溜溜的换题目回去做图像处理了,还是蛮可惜的。最近准备找工作了,突发奇想,想要弥补我当时的遗憾,恰逢遇到几篇博客启发了我,遂留下记录,供后来者参考。