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

2023-05-16

文章目录

  • 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动态为放入目录当中,并移走错的动态库,即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows下 ffmpeg 的 “Protocol not found“ 的解决 的相关文章

  • 如何在Windows服务器上将node.js文件作为后台进程运行?

    我正在创建一个 node js 项目并将其上传到我的 Windows 服务器 以为移动应用程序提供 API 服务 当我打开命令提示符并键入 node app js 它运行正常 但是当我关闭命令提示符时 我的 Node js 服务器停止运行
  • 在 Windows 上通过 ctypes 将文件描述符传递给 C 库函数

    我试图通过 ctypes 将文件描述符传递给在 fd 上执行写入的 C 函数 在linux上它可以工作 在 Windows 上则不然 我不明白为什么 我没有 Windows 开发人员的经验 C func signature void fun
  • 更改当前工作目录 VS13?

    如本文所述post https stackoverflow com questions 11979632 c sdl why does sdl loadbmp return null我调试 SDL 程序时的工作目录是相对于 vcproj 而
  • Qt GUI 应用程序中的控制台输出?

    我有一个在 Windows 上运行的 Qt GUI 应用程序 它允许传递命令行选项 在某些情况下我想向控制台输出一条消息 然后退出 例如 int main int argc char argv QApplication a argc arg
  • 如何将 Hudson/Jenkins 参数传递给 Windows 批处理命令

    好吧 我需要在我的 Hudson 作业中执行一个批处理文件 我有一个参数 Jenkis 参数 我需要将这个值 如参数 传递给批处理文件 我尝试了以下操作 Deploy cmd configuration DEPLOYCONFIGURATIO
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 使用 Windows 套接字的 WriteFile 返回无效参数错误

    我已经在 Windows 套接字上苦苦挣扎了两天 无法像在 Linux 中那样只使用写入套接字 我想编写自己的 shellcode 并且正在研究如何将 stdout stdin 重定向到套接字句柄 这就是我的演奏的来源 如果有必要 我使用
  • MSI 安装程序,64 位操作系统,写入 \windows\system32\inetsrv 文件夹

    在 Windows Server 2008 64 位上 我需要一个 msi 安装程序文件来将一些文件写入 windows system32 inetsrv 文件夹 这些文件是一些 XML 架构验证文件 C XmlReaderSettings
  • FFMPEG:使用具有复杂滤波器的视频滤波器

    我正在使用fluent ffmpeg用于对视频文件执行批量操作的 Node js 库 视频过滤器裁剪 16 9 输入 添加填充并将字幕刻录到填充中 在下一步中 我想使用复杂的滤镜来覆盖图像作为水印 ff input video mp4 ff
  • 使用特定的 JRE 运行 JAR 文件

    在 Windows 上有没有办法使用位于特定文件夹中的 JRE 运行 JAR 文件 类似于 Eclipse 在您提供给它的某个路径中查找其 JRE 的方式 一些 Windows 可执行代码 C 或 C 或批处理文件都可以完成这项工作 谢谢
  • 查找所有 DHCP 和 DNS 服务器

    我有一位客户要求我找到他所有的 Dhcp 和 DNS 服务器以及一些附加信息 例如 DC 服务器和操作系统 所以我决定尝试提高我的 powershell 技能 但我对此还很陌生 所以我写了这个脚本 但我想仍然缺少一些东西 因为它不起作用 编
  • 在 Python 中静默打印 PDF

    我正在尝试使用 Python 打印 PDF 而不打开 PDF 查看器应用程序 Adobe Foxit 等 我还需要知道打印何时完成 以删除文件 Here http permalink gmane org gmane comp python
  • Windows:如何获取所有可见窗口的列表?

    无论如何都要使用相关技术重新标记 我不知道它们是什么 稍后我可能会提出更详细的问题 关于具体细节 但现在我正在尝试掌握 大局 我正在寻找一种方法来枚举 Windows 上的 真实可见窗口 我所说的 真正可见的窗口 就是指 用户所说的 窗口
  • 如何使用 MSYS2 获取旧版本的软件包?

    我决定尝试 CLion for Windows 它推荐使用 MinGW 或 Cygwin 进行编译 我安装了MSYS2 http sourceforge net p msys2 wiki MSYS2 20installation 包管理器进
  • 当系统上没有留下任何可执行文件时,如何卸载 Windows 服务?

    当系统上没有留下任何可执行文件时 如何卸载 Windows 服务 我跑不了installutil u因为系统上没有留下可执行文件 我仍然可以在服务控制台中看到该服务的条目 出现这种状态的原因可能是因为 msi 包中存在问题 没有正确删除服务
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • 如何在 Windows 中创建上下文菜单子菜单?

    我一直在编写实用程序并通过 Shell 键 上的 Regedit 将它们映射到上下文菜单 但我不知道如何像一些更流行的实用程序那样创建子菜单 例如 如果我有三个脚本将文件移动和重命名到三个不同的文件夹 那么现在我有三个不同的上下文菜单条目
  • Apache 子进程已退出,状态为 255

    经过大量的搜索 尝试 修复 等待和哭泣 在我放弃之前 我想为这个错误抓住最后的机会 我们正在奔跑Microsoft Windows Server 2012 Apache 2 4 6 Win64 OpenSSL 1 0 1e PHP 5 5
  • 为什么某些安装程序需要在运行程序之前重新启动计算机?

    我对部署桌面应用程序相当陌生 所以这是我第一次为我的软件构建安装程序 目前 我安装软件后第一次运行它时 它崩溃了 之后 它运行良好 我仍在调试此问题 但我注意到在安装后和运行软件之前立即重新启动似乎可以修复此崩溃 某些安装程序要求您在运行软
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav

随机推荐

  • cmake学习4--自定义编译选项

    CMake 允许为项目增加编译选项 xff0c 从而可以根据用户的环境和需求选择最合适的编译方案 例如 xff0c 可以将 MathFunctions 库设为一个可选的库 xff0c 如果该选项为 ON xff0c 就使用该库定义的数学函数
  • ROS与C++学习1

    ROS与C 入门教程 构建工作空间 构建Catkin包 搭建开发环境 catkin make 编写简单发布节点和订阅节点 编写简单服务端和客户端 使用类方法作为回调函数 使用Timers类 编写高级的发布器和订阅器 Callbacks和Sp
  • IAR的UI界面优化

    显示行数 Tools Options 点击 Editor Tab size xff1a 设置Tab键占用多少个空格Indent size xff1a 应该是设置过行时缩进多少个空格Insert tab xff1a 选了之后在删除Tab时 x
  • MYNTEYE小觅双目摄像头深度版+VINS测试

    小觅双目深度版性能分析 今年 xff08 18年 xff09 11月9号小觅智能科技的深度版双目相机上市 xff0c 于是我在12月初花了2999软妹币购买了120度视角的相机 其中我比较感兴趣的是 双目 43 惯导 43 结构光 的多传感
  • QT+ROS开发

    Qt Creator for ROS 如果想在Qt上进行ros包的开发和GUI界面开发 建议采用下面的方法 http fumacrom com 1mipW Setup Qt Creator for ROS Setup Ubuntu to a
  • PX4、APM无人机仿真连接QGC地面站记录(udp连接、更改home点等)

    文章目录 一 PX41 gazebo 仿真2 连接地面站3 更改 Home点 二 APM 仿真1 执行仿真指令2 连接地面站3 更改 Home 点 本文仅记录仿真指令 xff0c 搭建安装不在此 一 PX4 首先给飞控源码和子目录权限 sp
  • LeetCode 解题笔记(一)总

    文章目录 一 常用技巧二 常用翻译三 题目x 其他9 回文数 2021 12 0911 盛最多水的容器 2022 01 0515 三数之和 2022 01 14 17 电话号码的字母组合 2022 01 1520 有效的括号 2021 12
  • LeetCode 解题笔记(二)数组篇

    文章目录 一 基础篇26 删除排序数组中的重复 2022 01 16122 买卖股票的最佳时机 II 2022 01 17189 轮转数组 2022 01 18217 存在重复元素 2022 01 19136 只出现一次的数字 2021 1
  • LeetCode 解题笔记(四)链表

    文章目录 一 总结二 题目237 删除链表中的节点 xff08 2022 03 10 xff09 19 删除链表的倒数第 N 个结点 xff08 2022 03 11 xff09 206 反转链表 xff08 2022 03 18 xff0
  • QT Quick QML 实例之 Popup 弹出界面

    QT Quick QML 实例之 Popup 弹出界面 一 演示二 实现过程1 居中弹出2 正下方弹出 所有的热爱都要不遗余力 xff0c 真正喜欢它便给它更高的优先级 xff0c 和更多的时间吧 xff01 GIT工程文件在这里 QmlL
  • QGC(GGroundControl) 系统核心架构图

    关于QGC地面站其它文章请点击这里 QGC地面站 UML 核心类图 xff1a xff08 点击图片放大看效果更好 xff09 核心系统分析图 xff1a xff08 点击图片放大看效果更好 xff09 工程结构 xff1a 整个 QGC
  • Qt 国际化翻译,函数外部字符串、Map 翻译(QT_TRANSLATE_NOOP)

    文章目录 1 Qt 的翻译流程2 利用 QT TRANSLATE NOOP 翻译 GitHub 源码 QmlLearningPro xff0c 选择子工程 xff1a TranslationsDemo pro QML 其它文章请点击这里 Q
  • IAR新建工程

    下载库函数 本文介绍基于 IAR 43 官方标准固件库 xff0c 来新建 STM8S003F 工程 xff0c STM8S 的标准固件库可以到 ST 的官方网站中找到并下载 xff1a ST官网 1 在搜索栏上搜索 STM8S003F x
  • RTSP 推流和拉流记录(运行代码)

    文章目录 1 RTSP 推流2 RTSP 拉流 1 RTSP 推流 用C 43 43 11 实现的RTSP服务器和推流器 xff0c 链接如下 RtspServer GitHub原地址 xff1a https github com PHZ7
  • FFmpeg 中 RTSP推流桌面和Android设备延时测试

    文章目录 1 FFMPEG 推流 xff1a 1 1 FFmpeg 源码准备1 2 RTSP 推流服务器 2 执行流程2 1 启动服务器2 2 执行桌面推流2 3 播放 3 安卓测试 1 FFMPEG 推流 xff1a 1 1 FFmpeg
  • Windows 下 GitKraken 6.5.1免费版本安装

    文章目录 1 安装 6 5 1 版本2 更换快捷方式3 登录 用过 GitKraken 都说好 xff0c 不过 xff0c GitKraken 从 6 5 3 版本开始收费 xff0c 它的最后一个免费版本是 6 5 1 xff0c 当你
  • QT 中的多线程之 moveToThread

    文章目录 1 概述2 方法描述3 代码 xff1a 4 运行结果5 注意事项6 结语 1 概述 在 Qt 中 xff0c 多线程也被广泛用于实现后台任务 异步操作 多任务处理等功能 通过使用多线程 xff0c 可以提高程序的响应性和用户体验
  • QT 多线程之继承 QThread

    文章目录 1 概述2 方法描述3 代码 xff1a 4 运行结果5 结语 1 概述 在 Qt 中 xff0c 可以使用 QThread 的两种方式来创建和控制线程 xff1a 继承 QThread 类和使用 QObject moveToTh
  • Qt 多线程同步:互斥锁QMutextLocker 、读写锁 QReadWriteLock、信号量 QSemaphore、 条件变量QWaitConditio、QThread::wait()

    文章目录 1 Qt 多线程为什么需要同步机制 lt font gt 2 多线程有哪些同步机制 2 1 互斥锁 xff08 QMutex xff09 2 2 读写锁 xff08 QReadWriteLock xff09 2 3 信号量 xff
  • Windows下 ffmpeg 的 “Protocol not found“ 的解决

    文章目录 1 问题描述2 排查方法记录2 1 检查代码中编码器是否安装2 2 确定ffmpeg版本号2 3 打印编译参数2 4 查看运行中调用dll 1 问题描述 调用ffmpeg库中 xff0c 如果使用 avformat open in