Qt + FFmpeg 搭建 Windows 开发环境
Qt + FFmpeg 搭建 Windows 开发环境
- Qt + FFmpeg 搭建 Windows 开发环境
- 安装 Qt Creator
- 下载 FFmpeg 编译包
- 测试 Qt + FFmpeg
- 踩坑
- 解决方法1:换一个 FFmpeg 库
- 解决方法2:把项目改成 64 位
- 后记
官方博客:https://www.yafeilinux.com/
Qt开源社区:https://www.qter.org/
Qt + FFmpeg 搭建 Windows 开发环境
安装 Qt Creator
本文章采用 Qt Creator 4.6.2,详细信息:
安装步骤参考本人博客:Qt 5基础 | Qt Creator 5.6.1-1的下载与安装
下载 FFmpeg 编译包
进入 FFmpeg 官网,点击 Download:
进入下载界面,点击 Windows builds from gyan.dev:
进入 gyan.dev/ffmpeg/builds,选择 ffmpeg-5.1.2-full_build-shared.7z 下载:
注:一般不选用最新版本下载。
下载完成后解压,内容如下:
测试 Qt + FFmpeg
踩坑
新建一个 Qt 项目,项目名 testFFmpeg:
将 ffmpeg-5.1.2-full_build-shared 拷贝到项目目录下:
注:只拷贝其中的 include 和 lib 也行,注意路径名。
在 testFFmpeg.pro 里面添加 ffmpeg 头文件和库文件路径:
win32 {
INCLUDEPATH += $$PWD/ffmpeg-5.1.2-full_build-shared/include
LIBS += $$PWD/ffmpeg-5.1.2-full_build-shared/lib/avformat.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/avcodec.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/avdevice.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/avfilter.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/avutil.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/postproc.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/swresample.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/swscale.lib
}
注:libs 的多行引用一定要记得带斜杠,否则后续的引用无效。
先编译看看:
显示正常。
此时,在项目同目录下生成了 build-testFFmpeg-Desktop_Qt_5_9_6_MinGW_32bit-Debug,里面有项目的执行文件。
把 ffmpeg-5.1.2-full_build-shared\bin 的 dll 文件拷贝到执行文件所在目录:
注:本次我们只用到了 avutil-56.dll,只拷贝这个也行。
修改 main.c 程序:
#include <stdio.h>// 包含ffmpeg头文件
#include "libavutil/avutil.h"int main()
{printf("Hello FFMPEG, av_version_info is %s\n", av_version_info());printf("avutil_configuration is \n%s\n", avutil_configuration());return 0;
}
后面运行程序,出现了报错:error: undefined reference to `av_version_info’。
原因:项目选择了 32 位的构建套件,而 FFmpeg 库是 64 位的!
参考:Qt测试FFmpeg的av_version_info()函数,出现undefined reference to `av_version_info‘
解决方法1:换一个 FFmpeg 库
在网上找到了一个 win32 编译的 32 位 FFmpeg 库,修改前面 .pro 文件的库的配置即可。
FFmpeg 库下载链接:ffmpeg-win32-4.2.2.zip
运行结果:
解决方法2:把项目改成 64 位
重新构建一个项目,选用 MSVC2015 64bit,命名为 testFFmpeg_win64:
pro 文件添加:
INCLUDEPATH += $$PWD/ffmpeg-5.1.2-full_build-shared/include \LIBS += $$PWD/ffmpeg-5.1.2-full_build-shared/lib/avcodec.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/avdevice.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/avfilter.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/avformat.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/avutil.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/postproc.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/swresample.lib \$$PWD/ffmpeg-5.1.2-full_build-shared/lib/swscale.lib \
照旧拷贝 ffmpeg-5.1.2-full_build-shared 到项目里。
构建项目,遇到报错:Qt 程序数据库管理器不匹配。
解决方法:
工具→选项→构建套件(Kit),MSVC2015 64bits 的编译器换成 amd64。之前是 x86_arm64,是 32 位的。
照旧添加那些 dll 文件:
运行成功,结果:
后记
没想到配个环境都能花这么久的时间,Qt + FFmpeg 实现视频播放器项目推迟一下下,看赛马娘第三季要紧!
现在官网的编译包不能直接在 32bit 的项目里用,有点烦的。先用老东西 ffmpeg-win32-4.2.2.zip 凑合。懂这方面的可以评论区指点一下。
相关文章:

Qt + FFmpeg 搭建 Windows 开发环境
Qt FFmpeg 搭建 Windows 开发环境 Qt FFmpeg 搭建 Windows 开发环境安装 Qt Creator下载 FFmpeg 编译包测试 Qt FFmpeg踩坑解决方法1:换一个 FFmpeg 库解决方法2:把项目改成 64 位 后记 官方博客:https://www.yafeilinux.com/ Qt开源社区…...

[网鼎杯 2020 白虎组]PicDown python反弹shell proc/self目录的信息
[网鼎杯 2020 白虎组]PicDown - 知乎 这里确实完全不会 第一次遇到一个只有文件读取思路的题目 这里也确实说明还是要学学一些其他的东西了 首先打开环境 只存在一个框框 我们通过 目录扫描 抓包 注入 发现没有用 我们测试能不能任意文件读取 ?url../../../../etc/passwd …...

SDL2绘制ffmpeg解析的mp4文件
文章目录 1.FFMPEG利用命令行将mp4转yuv4202.ffmpeg将mp4解析为yuv数据2.1 核心api: 3.SDL2进行yuv绘制到屏幕3.1 核心api 4.完整代码5.效果展示6.SDL2事件响应补充6.1 处理方式-016.2 处理方式-02 本项目采用生产者消费者模型,生产者线程:使用ffmpeg将m…...

决策树C4.5算法的技术深度剖析、实战解读
目录 一、简介决策树(Decision Tree)例子: 信息熵(Information Entropy)与信息增益(Information Gain)例子: 信息增益比(Gain Ratio)例子: 二、算…...

LLMs Python解释器程序辅助语言模型(PAL)Program-aided language models (PAL)
正如您在本课程早期看到的,LLM执行算术和其他数学运算的能力是有限的。虽然您可以尝试使用链式思维提示来克服这一问题,但它只能帮助您走得更远。即使模型正确地通过了问题的推理,对于较大的数字或复杂的运算,它仍可能在个别数学操…...

【12】c++设计模式——>单例模式练习(任务队列)
属性: (1)存储任务的容器,这个容器可以选择使用STL中的队列(queue) (2)互斥锁,多线程访问的时候用于保护任务队列中的数据 方法:主要是对任务队列中的任务进行操作 &…...

Python之函数、模块、包库
函数、模块、包库基础概念和作用 A、函数 减少代码重复 将复杂问题代码分解成简单模块 提高代码可读性 复用老代码 """ 函数 """# 定义一个函数 def my_fuvtion():# 函数执行部分print(这是一个函数)# 定义带有参数的函数 def say_hello(n…...
SQL创建与删除索引
索引创建、删除与使用: 1.1 create方式创建索引:CREATE [UNIQUE – 唯一索引 | FULLTEXT – 全文索引 ] INDEX index_name ON table_name – 不指定唯一或全文时默认普通索引 (column1[(length) [DESC|ASC]] [,column2,…]) – 可以对多列建立组合索引 …...

网络协议--链路层
2.1 引言 从图1-4中可以看出,在TCP/IP协议族中,链路层主要有三个目的: (1)为IP模块发送和接收IP数据报; (2)为ARP模块发送ARP请求和接收ARP应答; (3…...
HDLbits: Count clock
目前写过最长的verilog代码,用了将近三个小时,编写12h显示的时钟,改来改去,估计只有我自己看得懂(吐血) module top_module(input clk,input reset,input ena,output pm,output [7:0] hh,output [7:0] mm,…...
【1day】用友移动管理系统任意文件上传漏洞学习
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...
【c++】向webrtc学习容器操作
std::map的key为std::pair 时的查找 std::map<RemoteAndLocalNetworkId, size_t> in_flight_bytes_RTC_GUARDED_BY(&lock_);private:using RemoteAndLocalNetworkId = std::pair<uint16_t, uint16_t...

SpringBoot+Vue3外卖项目构思
SpringBoot的学习: SpringBoot的学习_明里灰的博客-CSDN博客 实现功能 前台 用户注册,邮箱登录,地址管理,历史订单,菜品规格,购物车,下单,菜品浏览,评价,…...

【AI视野·今日NLP 自然语言处理论文速览 第四十七期】Wed, 4 Oct 2023
AI视野今日CS.NLP 自然语言处理论文速览 Wed, 4 Oct 2023 Totally 73 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Contrastive Post-training Large Language Models on Data Curriculum Authors Canwen Xu, Corby Rosset, Luc…...
c++的lambda表达式
文章目录 1 lambda表达式2 捕捉列表 vs 参数列表3 lambda表达式的传递3.1 函数作为形参3.2 场景1:条件表达式3.3 场景2:线程的运行表达式 1 lambda表达式 lambda表达式可以理解为匿名函数,也就是没有名字的函数,既然是函数&#…...

电梯安全监测丨S271W无线水浸传感器用于电梯机房/电梯基坑水浸监测
城市化进程中,电梯与我们的生活息息相关。高层住宅、医院、商场、学校、车站等各种商业体建筑、公共建筑中电梯为我们生活工作提供了诸多便利。 保障电梯系统的安全至关重要!特别是电梯机房和电梯基坑可通过智能化改造提高其安全性和稳定性。例如在暴风…...
Java异常:基本概念、分类和处理
Java异常:基本概念、分类和处理 在Java编程中,异常处理是一个非常重要的部分。了解如何识别、处理和避免异常对于编写健壮、可维护的代码至关重要。本文将介绍Java异常的基本概念、分类和处理方法,并通过简单的代码示例进行说明。 一、什么…...

小谈设计模式(19)—备忘录模式
小谈设计模式(19)—备忘录模式 专栏介绍专栏地址专栏介绍 备忘录模式主要角色发起人(Originator)备忘录(Memento)管理者(Caretaker) 应用场景结构实现步骤Java程序实现首先ÿ…...
《数据库系统概论》王珊版课后习题
第一章 绪论 1.数据、数据库、数据库管理系统、数据库系统的概念 (1)数据(Data):数据是数据库中存储的基本对象,是描述事物的符号记录。数据有多种表现形式,它们都可以经过数字化后存入计算机…...
MariaDB 修改用户远程登录
今天修改MariaDB数据库用户的Host时出现错误: ERROR 1356 (HY000): View ‘mysql.user’ references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them 我的步骤如下: 1.登陆 2.use mysql; 3.执行…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...