ffmpeg的av_format_open_input返回-1330794744(Protocol not found)

PS:此贴为解决过程记录贴,比较啰嗦,凑合着看。

环境:vistual studio2017(x64+debug)+ffmpeg-4.3-win64-dev+ffmpeg-4.3.1-win64-shared;

前提:已配置好ffmpeg-4.3-win64-dev版本到vs中;

目录

一、解决过程

1、查资料

2、尝试解决

3、总结

二、后续

        从.dll文件导出对应的.lib文件

结语


一、解决过程

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年年末做毕业设计时遇到的,当时我的导师推荐我尝试一下踏入编解码的知识海洋中,所以这次毕设是我第一次入坑视频编解码的尝试,可惜当时花了一个多月时间都没能找到方法,最后灰溜溜的换题目回去做图像处理了,还是蛮可惜的。最近准备找工作了,突发奇想,想要弥补我当时的遗憾,恰逢遇到几篇博客启发了我,遂留下记录,供后来者参考。

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
av_dump_format函数是FFmpeg中的一个非常有用的函数,可以用来打印音视频文件的信息,比如文件格式、时长、编码器等等。 该函数的定义如下: ```c void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output); ``` 其中,参数ic是一个AVFormatContext指针,表示音视频文件的上下文,它包含了音视频文件的所有信息;参数index表示要打印的流的索引,如果index为负数,则表示打印所有流的信息;参数url是一个字符串,表示音视频文件的文件名;参数is_output表示该文件是输入文件还是输出文件,如果是输入文件,则is_output为0,否则为1。 使用av_dump_format函数非常简单,只需要在打开音视频文件后调用该函数即可,例如: ```c AVFormatContext *ic = avformat_alloc_context(); if (avformat_open_input(&ic, filename, NULL, NULL) < 0) { printf("Failed to open file '%s'\n", filename); return -1; } if (avformat_find_stream_info(ic, NULL) < 0) { printf("Failed to retrieve input stream information\n"); return -1; } av_dump_format(ic, 0, filename, 0); ``` 这个例子中,我们首先使用avformat_alloc_context函数创建了一个AVFormatContext对象,然后通过avformat_open_input函数打开了音视频文件,再通过avformat_find_stream_info函数获取音视频文件的流信息,最后调用av_dump_format函数打印出文件的信息。 注意,av_dump_format函数会将信息打印到标准输出流中,如果需要将信息保存到文件中,可以重定向标准输出流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值