ffmpeg(一) ffmpeg+QT开发环境搭建

news2024/11/25 10:38:18

 
1、开发库的选择 


(1)音视频开发库
每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如:

iOS:AVFoundation、AudioUnit 等
Android:MediaPlayer、MediaCodec 等
Windows:DirectShow 等
但是有一个跨平台的库:FFmpeg 库。

其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。
 

2)GUI 界面开发库

同理我们也选择可以 跨平台开发的 GUI 界面开发库,QT

  • Windows:MFC

2、下载安装环境


(1)安装 ffmpeg
第一种方式:下载源码,将ffmpeg 的所有源码加入到我们的工程当中。(不推荐使用这种方法,因为源码太庞大了,并且里面有很多的代码我们是不需要的。)

下载地址:Download FFmpeg

snapshot:快照版,不是正式版本。
releases:发布版,就是正式版本,我们可以点击 release。
 

image-20210812133649637

 在这里插入图片描述

 1、我们目前是新手,可能编译会不通过
2、所以我们直接使用别人编译好的动态链接库。(官网就有提供编译好的动态库,体积大一点)
3、等我们技术达到之后,可以自己对源码进行裁剪,然后编译出属于自己的动态库

在这里插入图片描述

 第一个链接:(我是使用这个链接进行下载)

在这里插入图片描述

 

  • 7z 、zip:压缩算法不同,压缩大小不同而已。里面的内容一样。
  • essentials:必要的组件,东西可能不全。
  • full:全面的,里面的库文件比较全。
  • shared:有动态链接库。(我们选取这一个)

在这里插入图片描述

 

  • shared :代表里面的应用程序:ffmpeg、ffplay、ffprobe 使用的动态链接库。
  • 没有带 shared 后缀:说明不是使用动态链接库。
  • gpl、lgpl:代表不同的开源协议。

3、将 ffmpeg 的功能集成到 QT 项目当中

在Windows中,我们最终是通过调用FFmpeg动态库(dll)中的函数来操作音视频数据,使用dll的其中一种方式是需要用到3种文件:

.h:头文件(Header File)

包含了函数的声明
通过*#include*去导入相应的头文件
.dll :动态链接库(Dynamic Link Library)

包含了函数的具体实现代码
Windows程序会在运行过程中,动态调用dll中的函数
.lib 或 .dll.a:(动态链接库的)导入库(Import Library)

.lib:用于MSVC编译器中(微软 编译器)
.dll.a:用于MinGW编译器中(g++ 编译器)
包含了dll中函数的入口,用于辅助找到并调用dll中的函数,里面只存放索引信息。最终需要链接到Windows程序中(比如合并到exe文件中)
本质:!!!! 是一个静态库文件,这一部分是要放到 exe 文件当中去。然后指引 exe 程序去寻找 dll 文件当中的函数体。
值得一提的是,在Windows中,静态链接库(Static Link Library)的扩展名也是.lib、.dll.a。静态链接库和导入库的区别是:

静态链接库:包含了函数的具体实现代码
导入库:不包含函数的具体实现代码(函数的具体实现代码存储在dll中) 

在这里插入图片描述

 

(0)dll的搜索顺序(exe运行的时候)

  • 指导 windows 程序运行的时候,是否可以找到对应的动态链接库。

exe在寻找dll文件时,大概按照以下优先级顺序去查找(这里只列出了大概的搜索路径,并没有写全):

环境变量Path中的路径

所以可以考虑将 %FFMPEG_HOME%/bin 目录配置到 Path 变量中
置于如何配置Windows的环境变量Path,这是基本开发常识了,就不再讲解了 

在这里插入图片描述

 

2).pro文件( exe 编译的时候)

与上一个配置环境变量的作用不同,这个是指导 程序的链接过程,是否能找到对应的动态库。

.pro 文件是Qt项目的主配置文件。(相当于 linux 当中的 makefile 文件,用来指导编译)

# 包含了core、gui两个模块
QT       += core gui

# 高于4版本,就包含widgets模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

# 源代码
SOURCES += \
    main.cpp \
    mainwindow.cpp

# 头文件
HEADERS += \
    mainwindow.h

# ui文件
FORMS += \
    mainwindow.ui

配置如下

修该 .pro 文件,以便于我们的项目支持 ffmpeg 的库函数

这个 .pro 文件的配置,是指导程序编译的时候,可以找到对应的动态库。之前配置的环境变量,是指导 windows 运行程序的时候,可以找到对应的动态库。
INCLUDEPATH、LIBS、是 QT 内部自己定义的环境变量。用来存放头文件路径、库文件路径。
FFMPEG_HOME :我们自己定义的变量,用来标记我们的主目录。
 

win32: {
    FFMPEG_HOME=D:\SF\ffmpeg\MJ\ffmpeg-4.3.2-2021-02-27-full_build-shared
    #设置 ffmpeg 的头文件
    INCLUDEPATH += $$FFMPEG_HOME/include

    #设置导入库的目录一边程序可以找到导入库
    # -L :指定导入库的目录
    # -l :指定要导入的 库名称
    LIBS +=  -L$$FFMPEG_HOME/lib \
             -lavcodec \
             -lavdevice \
             -lavfilter \
            -lavformat \
            -lavutil \
            -lpostproc \
            -lswresample \
            -lswscale
}

 

# 号后面的内容是注释

$$FFMPEG_HOME 表示对环境变量值的引用,相当于原地展开。

-L:设置导入库的目录,以便编译器能够找到导入库。(exe 程序编译的时候只需要包含 xxx.dll.a 静态导入库,运行的时候才需要 xxx.dll 文件)

-l:设置需要链接的导入库名称

导入库名称需要去掉文件名前面的lib,比如 libavcodec.dll.a 就写成 avcodec

 

  • 打印 av_version_info 的版本:
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>   // 利用打印函数

// ffmpeg 是纯 C 语言的代码,在 C++ 当中不能直接进行 include
extern "C" {
#include <libavcodec/avcodec.h>
}

int main(int argc, char *argv[])
{
    qDebug() << "yeahhh"<< av_version_info();

    QApplication a(argc, argv);
    MainWindow w;

    w.show();

    return a.exec();
}

控制台输出:

 

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

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

相关文章

Flink 学习九 Flink 程序分布式运行部署

Flink 学习九 Flink 程序分布式运行部署 1.Job 执行计划 层级说明备注StreamGraph用户代码生成的最初的图程序的运行流程图JobGraph将多个符合条件的节点多个符合条件的节点合并,减少序列化和反序列化ExecutionGraphJobGraph 的并行化调度层的核心数据结构PhysicalGraphJobMa…

【计算机组成原理】信息编码与数据表示

目录 一、进位计数制 二、信息编码 三、定点数的表示 四、校验码 五、浮点数的表示 一、进位计数制 整数部分&#xff1a; 二进制、八进制、十六进制 ---> 十进制&#xff1a;加权求和二进制 ---> 八进制&#xff1a;每三位分为一组&#xff0c;转为八进制…

CloFormer实战:使用CloFormer实现图像分类任务(一)

文章目录 摘要安装包安装efficientnet_pytorch安装timm安装 grad-cam 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文翻译&#xff1a;https://blog.csdn.net/m0_47867638/article/details/131161083 官方源码&#xff1a;https://github.com/qhfan/CloF…

faceswap安装教程图文详解

Faceswap是一种人脸识别技术&#xff0c;可以将一个人的面部特征与另一个人的面部特征进行交换&#xff0c;从而创建出一个看起来像是两个人融合在一起的图像或视频。这项技术可以用于各种目的&#xff0c;包括艺术创作、电影制作、虚拟现实、安全监控等领域。Faceswap的实现方…

UE特效案例 —— 寒冰武器

一&#xff0c;环境配置 创建默认地形Landscape&#xff0c;如给地形上材质需确定比例&#xff1b;添加环境主光源DirectionalLight&#xff0c;设置相应的强度和颜色&#xff1b;PostProcessVolume设置曝光&#xff0c;设置Min/Max Brightness为1&#xff1b; 与关闭Game Sett…

怎样开始用selenium进行自动化测试?

如果您刚开始使用 Selenium 进行自动化测试&#xff0c;以下是建议的步骤。 1、安装 Selenium 首先&#xff0c;您需要安装 Selenium。Selenium 支持多种编程语言&#xff0c;如 Python、Java、C# 等。可以通过 pip 命令在 Python 中安装 Selenium&#xff1a; pip install …

CloFormer实战:使用CloFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整算法设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试热力图可视化展示…

秀米编辑器(xiumi)+百度编辑器(Ueditor) 集成 :解决集成问题,秀米编辑器导出到百度编辑器格式问题,图片保存到自己的服务器(阿里云OSS)

1.集成前提条件&#xff1a; 1. 需要集成百度编辑器到环境中 2.https环境下才可以导出数据到百度编辑器&#xff0c;如果不是https环境&#xff0c;会出现错误 然后我们开始讲解如何集成&#xff1a; 2.引入资源&#xff1a; //百度编辑器需要修改的文件&#xff08;配置与原始…

测试入门第一步------编写接口测试用例

自动化始终只是辅助测试工作的一个手段&#xff0c;对于测试人员而言&#xff0c;测试基础和测试用例的设计才是核心。如果测试用例的覆盖率或者质量不高&#xff0c;那将这部分用例实现为自动化用例的意义也就不大了。 那么&#xff0c;接口测试用例应该怎么编写呢&#xff1…

Spring boot集成RabbitMq

Spring boot集成RabbitMq 一、搭建RabbitMq1.1 参考1.2 配置erlong的环境变量1.3 RabbitMQ对应的在注册表中的位置 二、使用教程2.1 打开服务端2.2 注意的问题2.3 Queue的包 三、git命令3.1 git remote3.2 git remote add origin "xxxx"3.3 git push -u origin maste…

使用esp32+micropython+microdot搭建web(http+websocket)服务器(超详细)第一部分

使用esp32micropythonmicrodot搭建web(httpwebsocket)服务器&#xff08;超详细&#xff09;第一部分 microdot文档速查 什么是Microdot?Microdot是一个可以在micropython中搭建物联网web服务器的框架micropyton文档api速查 Quick reference for the ESP32 先来个小demo先体…

数据仓库——原理+实战(一)

一、数据仓库概述 1. 数据仓库诞生原因 &#xff08;1&#xff09;历史数据积存&#xff08;存放在线上业务数据库中&#xff0c;当数据积压到一定程度会导致性能下降&#xff0c;所以需要将实用频率低的冷数据转移到数据仓库中&#xff09; &#xff08;2&#xff09;企业数…

【C++11】线程库

文章目录 1. get_idthis_thread 2. 锁1. 为什么要使用锁&#xff1f;2. 锁的使用并行 与 串行递归锁 recursive_mutextimed_mutexlock_guard 与 unique_lock 3. atomic4. 条件变量线程等待线程唤醒条件变量的应用问题1&#xff1a;如何保证 v1先运行&#xff0c;v2阻塞&#xf…

python的tqdm一些操作

主要参数 iterable: 可迭代的对象, 在手动更新时不需要进行设置 desc: str, 左边进度条的描述性文字 total: 总的项目数 leave: bool, 执行完成后是否保留进度条 file: 输出指向位置, 默认是终端, 一般不需要设置 ncols: 调整进度条宽度, 默认是根据环境自动调节长度, 如果设置…

VUE 2X 事件处理 ⑤

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs E v e n t j s Eventjs Eventjs总结 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ ⡖⠒⠒⠒⠤⢄⠀⠀⠀…

MySQL面试题--聚簇索引,非聚簇索引,回表查询

目录 概念 聚集索引选取规则: 面试回答 大纲 回答 概念 分类 含义 特点 聚集索引(Clustered Index) 将数据存储与索引放到了一块&#xff0c;索引结构的叶子节点保存了行数据 必须有,而且只有一个 二级索引(Secondary Index) 将数据与索引分开存储&#xff0c;索引…

进程的引入(操作系统)

目录 1、进程的概念 2、进程状态及状态转换 &#xff08;1&#xff09;进程的状态 &#xff08;2&#xff09;状态的转换 3、进程控制块&#xff08;PCB&#xff09; 4、进程的组成和上下文 5、进程的队列 6、进程的类型和特征 7、进程间相互联系与相互作用 8、进程的…

pcl1.12.1重新安装boost库

因为我的库有问题&#xff0c;直接使用pcl1.12.1的时候报错&#xff0c;于是重新安装boost库 1.78.0地址(因为打开pcl1.12.1的安装目录&#xff0c;发现boost库是1.78.0&#xff0c;所以去官网找到对应的版本进行安装) Index of main/release/1.78.0/sourcehttps://boostorg.j…

OpenHarmony端云一体化应用开发快速入门练习(中)登录认证

一、登录认证手机 可以在应用中集成手机帐号认证方式&#xff0c;您的用户可以使用“手机号码密码”或者“手机号码验证码”的方式来登录您的应用。 &#xff08;一&#xff09;前提条件 需要在AGC控制台开通认证服务。 需要先在您的应用中集成SDK。 &#xff08;二&#xff…

安全测试-优秀测试工程师必备的4项安全测试方法

用您5分钟时间阅读完&#xff0c;希望能对您有帮助&#xff01; 一.安全性测试 1、安全性测试方法 测试手段可以进行安全性测试&#xff0c;目前主要安全测试方法有&#xff1a;   1&#xff09;静态的代码安全测试 主要通过对源代码进行安全扫描&#xff0c;根据程序中数…