Windows下 ffmpeg 的 “Protocol not found“ 的解决

news2024/11/16 19:40:42

文章目录

  • 1. 问题描述
  • 2. 排查方法记录
    • 2.1 检查代码中编码器是否安装
    • 2.2 确定ffmpeg版本号
    • 2.3 打印编译参数
    • 2.4 查看运行中调用dll

1. 问题描述

调用ffmpeg库中,如果使用 avformat_open_input 打开返回 -1330794744,使用 av_strerror

	 char buf[1024]={0};

 	int result = avformat_open_input(&pAVFormatContext, _url.toStdString().c_str(), nullptr, nullptr);
    if(result < 0)
    {
         av_strerror(result,buf,sizeof(buf));
        qDebug() << "open video "<< _url <<"failure" <<QString(buf);
        return false;
    }

网上通用解决办法,需要两步:

  • 在代码初始化时,把所有协议注册了
	av_register_all();
  • 编译ffmpeg 动态库,需要增加–enable-protocols 选项

但是我的问题比较奇怪,在windwos下用Qt 5.12.6同样一个套代码,在简单的测试项目工作正常,集成到正式的大型项目中就出错了。而且在测试项目中更换编译器,无论用MinGW 64还是用VS2017 64bit 均是正常运行,排除编译器的原因。

2. 排查方法记录

2.1 检查代码中编码器是否安装

在成功代码中把成功打开的编码器打印出来是 h264.我首先在出错的代码,可以用如下遍历把所有编码器打印出来,里面包含了h264.也就是说av_register_all()代码生效了。

void QFFmpeg::showAll()
{
    //输出所有支持的解码器名称
    QStringList listCodeName;
    AVCodec *code = av_codec_next(NULL);
    while (code != NULL) {
        listCodeName << code->name;
        //if(::strcmp("h264",code->name)==0)
          qDebug() << "ffmpeg Codec "<< code->name <<", type "<<code->type;
        code = code->next;

    }

  //  qDebug() << __func__ << listCodeName;
}

2.2 确定ffmpeg版本号

我尝试编译ffmpeg ,首先要确定我使用ffmpeg版本,虽然动态库写着的56,但准确的版本需要代码打印出来的,而ffmpeg没有整体版本号,一般用libavutil的版本确定,可以用如下代码打印

 //获取avutil数字版本号
    unsigned int version = avutil_version();
    //获取avutil三个子版本号
    int a = version / (int) pow(2, 16);
    int b = (int) (version - a * pow(2, 16)) / (int) pow(2, 8);
    int c = version % (int) pow(2, 8);
    //拼接avutil完整版本号

    qDebug()  << "MeidaPlayer ffmpeg/avutil version:("<<version<<")="<<a<<"."<<b<<"."<<c ;

运行这段代码,打印出三个数字 56 . 51 . 100

要根据官网下载网页,可以确定是 FFmpeg 4.3.5

在这里插入图片描述

把源码下来发编码工程量巨大,本想改写的qt.pri导入项目进行调试,但是发现需要configure编译参数,要进行一系列配置,网上有人给出来模板,但是每个dll要手动改写,非常痛苦,放弃。

2.3 打印编译参数

但是在源码当中还有有用的发现,我发现如下函数,这个函数明显是用来打印编译时configure的参数的

const char *avformat_configuration(void)
{
    return FFMPEG_CONFIGURATION;
}

于是我在成功和失败项目中分别打印编译参数

失败项目,清晰显示有 --disable-protocols

–prefix=‘c:/projects/repos/cerbero.git/1.18/build/dist/msvc_x86_64’ --libdir=‘c:/projects/repos/cerbero.git/1.18/build/dist/msvc_x86_64/lib’ --ar=x86_64-w64-mingw32-ar --as=x86_64-w64-mingw32-gcc --cc=x86_64-w64-mingw32-gcc --ld=x86_64-w64-mingw32-gcc --nm=x86_64-w64-mingw32-nm --ranlib=x86_64-w64-mingw32-ranlib --strip=x86_64-w64-mingw32-strip --windres=x86_64-w64-mingw32-windres --enable-static --enable-pic --enable-shared --disable-avdevice --disable-postproc --disable-swscale --disable-programs --disable-ffplay --disable-ffprobe --disable-ffmpeg --disable-encoder=flac --disable-protocols --disable-devices --disable-network --disable-hwaccels --disable-dxva2 --disable-vdpau --disable-filters --enable-filter=yadif --disable-doc --disable-d3d11va --disable-audiotoolbox --disable-videoprtoolbox --disable-vaapi --disable-crystalhd --disable-mediacodec --disable-mediafoundation --disable-nvenc --disable-mmal --disable-omx --disable-omx-rpi --disable-cuda --disable-cuvid --disable-libmfx --disable-libnpp --disable-iconv --disable-jni --disable-v4l2_m2m --disable-vulkan --disable-large-tests --disable-stripping --enable-optimizations --disable-nonfree --disable-version3 --enable-cross-compile --target-os=mingw32 --arch=x86_64 --cross-prefix=x86_64-w64-mingw32-

成功的项目,两者明显不同

configure --disable-static --enable-shared --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib

也就是说两个应用很可能调用不同版本的dll

2.4 查看运行中调用dll

官方任务管理

失败的应用使用的 avutil-56.dll ,这个版本在编译时关掉所有协议支持,所以运行就会提示Protocol not found
请添加图片描述
成功的应用中调用 avutils-54.dll的版本,这个版本打开所有协议支持,所以不会报错。
请添加图片描述

进一步发现

因为我的项目中用同时用GStreamer和自己ffmpeg ,而GStreamer内部自己带了更高版本但无法正常支工作的版本与我带入的ffmpeg有冲突

请添加图片描述

最终解决方法把GStreamer 1.0内的 关于ffmpeg的头文件和库和动态库换成低版本的动态库,我直接使用内部的库

把正确版本的ffmpeg动态为放入目录当中,并移走错的动态库,即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/497879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript高阶项目—组件化的可编辑表格

1. 任务要求 JSON数据,表格中数据来自服务端&#xff0c;由JSON格式表示。通过JSON数据生成可编辑表格&#xff0c;并且灵活配置可编辑得到数据列。输入数据时打开开发者模式有提示&#xff0c;并且设置判断&#xff0c;要求输入正确的成绩。要求表格的可编辑列&#xff0c;计…

新鲜热乎的春招面经汇总

作者&#xff1a;阿秀 校招八股文学习网站&#xff1a;https://interviewguide.cn 这是阿秀的第「263」篇原创 小伙伴们大家好&#xff0c;我是阿秀。 欢迎今年参加秋招的小伙伴加入阿秀的学习圈&#xff0c;目前已经超过 2300 小伙伴加入&#xff01;去年认真准备和走下来的基…

高精度DEM(12.5m)数据以及下载方式介绍

一、 DEM代表数字高程模型&#xff0c;是一种数字地形模型&#xff0c;用于表示地球表面的海拔高度。 DEM数据可以通过多种方法获得&#xff0c;包括激光雷达、遥感技术和GPS测量等。 DEM数据通常以栅格形式呈现&#xff0c;每个栅格单元包含一个高度值。DEM数据可以用于许多…

gitee如何上传自己的代码

1&#xff0c;右击你要上传的项目&#xff0c;选择Git bash Here 2,接着输入 git init 此时你会发现你的当前文件夹会多了一个.git文件夹 点击.git文件夹&#xff0c;进入之后发现是这样&#xff0c;然后用记事本打开config文件 3,发现是这样&#xff0c;然后我们要配置一个用…

简单科普视频云

1. 本文目的 每当我连写几篇行业分析的虚文以后&#xff0c;我都会做一两篇技术科普和产品分析的硬核分享&#xff0c;证明我是脚踏实地的戏说江姗&#xff0c;而非云里雾里的胡乱推倒。 其实是写硬核分享应者寥寥&#xff0c;反倒是写一些虚文很多人看热闹。 最近看到PPIO王闻…

数字化转型导师坚鹏:如何制定企业数字化转型年度培训规划

如何制定企业数字化转型年度培训规划 ——以推动企业数字化转型战略落地为核心&#xff0c;实现知行果合一 课程背景&#xff1a; 很多企业都在开展企业数字化转型培训工作&#xff0c;目前存在以下问题急需解决&#xff1a; 缺少针对性的企业数字化转型年度培训规划 不清…

双目视觉(七)稀疏双目匹配

系列文章 双目视觉&#xff08;一&#xff09;双目视觉系统双目视觉&#xff08;二&#xff09;双目匹配的困难和评判标准双目视觉&#xff08;三&#xff09;立体匹配算法双目视觉&#xff08;四&#xff09;匹配代价双目视觉&#xff08;五&#xff09;立体匹配算法之动态规…

测试1:概念

1.需求 用户需求:该需求一般比较简略。(一句话) 软件需求:或者功能需求,详细描述开发人员必须实现的软件功能(一个文档) 2.BUG 说明是存在的并且正确,程序和规格说明之间不匹配是错误 3.软件生命周期 从诞生到停服 需求分析,计划,设计,编码,测试,运行维护 需求分析:分析…

出海的中国企业,为什么有80%都选择了这家云服务商?

对于想要出海的中国企业来说&#xff0c;什么样的云服务才是他们的最佳选择&#xff1f; 中国企业出海驶入快车道 中国企业的出海大潮&#xff0c;多年来一直方兴未艾&#xff0c;并且得到了政府部门的大力支持。这股“走出去”的热潮&#xff0c;一方面对内有利于推动产业升级…

均摊时间复杂度

均摊时间复杂度&#xff0c;它对应的分析方法&#xff0c;摊还分析&#xff08;或者叫平摊分析&#xff09; 均摊时间复杂度应用的场景比它更加特殊、更加有限 // array表示一个长度为n的数组// 代码中的array.length就等于nint[] array new int[n];int count 0;void insert…

电子时钟实现

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 利用汇编语言实现一个可以在显示器上显示时、分、秒的电子时钟&#xff0c;并能提供设置闹钟时间、选择闹钟铃声功能。 问题描述 利用汇编语言实现一个可以在显示器上显示时、分、秒的电子时钟&#xff0c;并能提供设置闹钟时间…

【Go编程语言】 Go和Goland的安装

Go和Goland的安装 文章目录 Go和Goland的安装一、 Goland官网二、打开Goland&#xff0c;并输入激活码 GO官网地址&#xff1a;https://golang.google.cn/ go中文网地址&#xff1a;https://studygolang.com/dl 安装完成得到的目录 环境变量配置&#xff1a; 1.新建变量 变…

【Gin框架深度解析】路由实现原理,让你彻底掌握Gin中路由的奥秘!

文章目录 Gin路由1、基本路由2、Restful风格的API3、API参数4、URL参数5、表单参数6、上传单个文件6.1、上传特定文件 7、上传多个文件8、路由分组9、404页面处理10、路由原理 Gin路由 1、基本路由 ​ 举一个例子&#xff1a; package mainimport ("net/http"&quo…

ARM嵌入式编译器控制诊断信息(warning/error)

ARM编译器以警告&#xff08;warning&#xff09;和错误&#xff08;error&#xff09;的形式来提供编译诊断信息&#xff0c;并且用户可以通过一些命令行选项&#xff0c;来控制这些warnings和errors的打开或者关闭。编译器会在程序编译和链接过程中将遇到的warnings和errors在…

开关电源基础03:正激和反激开关电源拓扑(1)-正激拓扑

说在开头&#xff1a;关于薛定谔的波动方程&#xff08;2&#xff09; 全新的量子理论诞生不到一年&#xff0c;很快面临着粒子和波动的内战。矩阵力学从直接观测到的原子谱线出发&#xff0c;引入矩阵的数学工具&#xff0c;建立了整个新力学的大厦&#xff1b;它强调观测到的…

大数据Doris(十三):Duplicate数据模型以及聚合模型的局限性

文章目录 Duplicate数据模型以及聚合模型的局限性 一、Duplicate数据模型 二、聚合模型的局限性 Duplicate数据模型以及聚合模型的局限性 一、Duplicate数据模型 在某些多维分析场景下&#xff0c;数据既没有主键&#xff0c;也没有聚合需求&#xff0c;只需要将数据原封不…

JDK17新特性之--新的Compact Strings(JEP 254)

前言 JDK9将String底层的数据结构从private final char value[];改成了private final byte[] value; &#xff0c; JEP 254: Compact Strings(紧凑字符串)&#xff0c;这要修改的目的就是为了节省空间1。我们先看一下JDK9和JDK8中String源码的变化。 JDK9中String源码&#xf…

深度学习技巧应用12-神经网络训练中批归一化的应用

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用12-神经网络训练中批归一化的应用,在深度学习中,批归一化(Batch Normalization,简称BN)是一种重要的技巧,它在许多神经网络中都得到了广泛应用。本文将详细介绍批归一化的原理和应用,并结合PyTorch框架构建一个简…

法规标准-SAE J2802标准解读

SAE J2802是做什么的&#xff1f; SAE J2802全名为盲点监测系统&#xff08;BSMS&#xff09;&#xff1a;工作特性和用户界面&#xff0c;其中主要是对BSMS系统的工作特性及用户界面进行了介绍 BSMS目标 强制性目标 任何可获得公路许可的车辆&#xff0c;此处视为大于125 …

深入浅出二叉树— C语言版【数据结构】

目录 ​编辑 1.树概念及结构 1.1树的概念 1.2 树的相关概念 ​1.3 树的表示 2.二叉树概念及结构 2.1概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 简单二叉树题目练习 2.5 二叉树的存储结构 2.5.1 顺序存储——堆 2.5.2 链式存储 1.树概念及结构 1.1树的概念 树…