音视频开发4-补充 FFmpeg 开发环境搭建 -- 在windows 上重新build ffmpeg
本节的目的是在windows 上 编译 ffmpeg 源码,这样做的目的是:在工作中可以根据工作的实际内容裁剪 ffmpeg,或者改动 ffmpeg 的源码。
第一步 :下载, 安装,配置 ,运行 msys64
下载
安装 配置

配置-修改pacman的源 - 在最新的msys64中已经不用改动,改动后反而有错误

Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686/
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch/
Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/
运行 msys2_shell.cmd -mingw64
1. 启动命令⾏窗⼝,在窗⼝中输⼊:
在cmd模式下 进⼊msys2安装⽬录cd c:\msys64
#如果要打开msys2的mingw64窗⼝
msys2_shell.cmd -mingw64
#如果要打开msys2的msys窗⼝
#msys2_shell.cmd

2. 然后在msys2的shell中执⾏:

二 安装编译环境
1 编译工具链
pacman -S mingw-w64-x86_64-toolchain

2 编译工具
pacman -S git
pacman -S make
pacman -S automake
pacman -S autoconf
pacman -S perl
pacman -S libtool
pacman -S mingw-w64-i686-cmake
pacman -S pkg-config
pacman -S mingw-w64-x86_64-SDL2
pacman -S mingw-w64-x86_64-yasm
pacman -S nasm
查看结果 which cl link yasm cpp
3 编译第三⽅库
Administrator@DESKTOP-SU7G9P3 MINGW64 ~
# pwd
/home/Administrator
mkdir ffmpeg
cd ffmpeg
3.1 下载x264,生成动态库文件,静态库文件
git clone http://git.videolan.org/git/x264.git
cd进入到 x264 目录下
cd x264
./configure --prefix=/home/Administrator/ffmpeg/build/libx264 --host=x86_64-w64-mingw32 --enable-shared --enable-static --extra-ldflags=-Wl,--output-def=libx264.defmakemake install



cd /home/Administrator/ffmpeg/build/libx264/lib
#若要生成64位lib文件则输入如下命令:
lib /machine:X64 /def:libx264.def
#若要生成32位lib文件则输入如下命令:
lib /machine:i386 /def:libx264.def
缘由:因为要借助mingw64来编译一个第三方库,需要编译成Windows所需的lib文件,其中执行到一条命令:lib /machine:X64 /def:libx264.def结果出现错误:bash: lib command not found最开始以为是libtool出了问题,后来发现整个msys64目录下没有lib.exe,然后就想到了Visual Studio自带的lib.exe。解决办法:把Visual Studio自带lib.exe的所在目录添加到环境变量Path当中

请注意上面是64位的,请注意要根据实际路径来添加。
添加完毕之后,记得要重启mingw64
然后使用cmd 命令,进入到C:\msys64new\home\Administrator\ffmpeg\build\libx264\lib
执行 lib /machine:X64 /def:libx264.def
3.1.1 制作3rd库
新建lib264文件夹,拷贝libx264-158.dll 到文件夹下,并命名为libx264.dll 新建include和lib目录,分别将x264.h、x264_config.h拷贝到include目录,libx264.lib拷贝到lib目录下
3.2 下载和编译fdk-aac
下载fdk-aac
cd /home/Administrator/ffmpeggit clone --depth 1 https://gitee.com/mirrors/fdk-aac.gitcd fdk-aac./autogen.sh./configure --prefix=/home/Administrator/ffmpeg/build/libfdk-aac --enable-static --enable-sharedmake -j4make install

3.3下载编译mp3
cd /home/Administrator/ffmpeggit clone --depth 1 https://gitee.com/hqiu/lame.gitcd lame./configure --prefix=/home/Administrator/ffmpeg/build/libmp3lame --disable-shared --disable-frontend --enable-static
make
make install
3.4 下载编译libvpx
cd /home/Administrator/ffmpeg
git clone --depth 1 https://github.com/webmproject/libvpx.git
cd libvpx
./configure --prefix=/home/Administrator/ffmpeg/build/libvpx --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make -j4
make install
4.下载和编译ffmpeg

./configure \
--prefix=/home/Administrator/ffmpeg/build/ffmepg-7.0 \
--arch=x86_64 \
--enable-shared \
--enable-gpl \
--enable-libfdk-aac \
--enable-nonfree \
--enable-libvpx \
--enable-libx264 \
--enable-libmp3lame \
--extra-cflags="-I/home/Administrator/ffmpeg/build/libfdk-aac/include" \
--extra-ldflags="-L/home/Administrator/ffmpeg/build/libfdk-aac/lib" \
--extra-cflags="-I/home/Administrator/ffmpeg/build/libvpx/include" \
--extra-ldflags="-L/home/Administrator/ffmpeg/build/libvpx/lib" \
--extra-cflags="-I/home/Administrator/ffmpeg/build/libx264/include" \
--extra-ldflags="-L/home/Administrator/ffmpeg/build/libx264/lib" \
--extra-cflags="-I/home/Administrator/ffmpeg/build/libmp3lame/include"\
--extra-ldflags="-L/home/Administrator/ffmpeg/build/libmp3lame/lib"
此时bin目录中的ffmpeg、ffprobe、ffplay还是没法使用的,因为缺少相关的dll,需要从%MSYS2_HOME%/mingw64/bin中拷贝,或者将%MSYS2_HOME%/mingw64/bin配置到环境变量Path中。
需要拷贝的dll有:libwinpthread-1、SDL2、zlib1.dll、liblzma-5、libbz2-1、libiconv-2、libgcc_s_seh-1、libstdc++-6、libx265、libx264-159、libfdk-aac-2 , libva_win32.dll
从 C:\msys64new\mingw64\bin 中拷贝数据到 C:\msys64new\home\Administrator\ffmpeg\build\ffmepg-7.0\bin

三,另一种安装方案。
参考博客如下:
https://www.cnblogs.com/mjios?page=3
下载安装MSYS2
进入MSYS2官网下载安装包(我这边下载的是:msys2-x86_64-20210228.exe),然后进行安装。
安装完毕后打开命令行工具mingw64.exe。
安装依赖
pacman(Package Manager)是一个包管理工具。
- pacman -Sl:搜索有哪些包可以安装
- pacman -S:安装
- pacman -R:卸载
# 编译工具链
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-yasm
pacman -S mingw-w64-x86_64-SDL2
pacman -S mingw-w64-x86_64-fdk-aac
pacman -S mingw-w64-x86_64-x264
pacman -S mingw-w64-x86_64-x265 这个不会有build error ,但是执行的时候,提示x265.dll找不到 中的某一个路径找不到,因此也不安装了
pacman -S mingw-w64-x86_64-libmp3lame 这个好像不行,使用pacman -Sl 查找并没有libmp3lame相关的,有一个是 mingw-w64-x86_64-gimp3,但是不知道是否就是libmp3lame,这应该也是为什么在这种安装方式下,参考中的博客没有将mp3弄进去的原因
# 需要单独安装make
pacman -S make
关于软件包相关的默认路径:
下载目录:%MSYS2_HOME%/var/cache/pacman/pkg
安装目录:%MSYS2_HOME%/mingw64
%MSYS2_HOME%是指MSYS2的安装目录
cd /C/msys64new/home/Administrator/ffmpeg/ffmpeg-7.0
./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265
按照 如上有运行时异常,总是说libx265.dll有问题,错误如下,
这块找了好久也没有找到方案解决,因此直接 将 --enable-libx265 删除了,重新build 了一版
./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libx264
此时bin目录中的ffmpeg、ffprobe、ffplay还是没法使用的,因为缺少相关的dll,需要从%MSYS2_HOME%/mingw64/bin中拷贝,或者将%MSYS2_HOME%/mingw64/bin配置到环境变量Path中。
需要拷贝的dll有:libwinpthread-1、SDL2、zlib1.dll、liblzma-5、libbz2-1、libiconv-2、libgcc_s_seh-1、libstdc++-6、libx265、libx264-159、libfdk-aac-2 , libva_win32.dll
从 C:\msys64new\mingw64\bin 中拷贝数据到 C:\msys64new\usr\local\ffmpeg\bin

总结:
将 C:\msys64new\mingw64\bin 中的相关dll 拷贝到C:\msys64new\usr\local\ffmpeg\bin
将C:\msys64new\usr\local\ffmpeg\bin 设置为环境变量
四,安装QT,以及配置QT
下载
本教程中选择5.14.2版本(从5.15版本开始是收费版本)。
- 下载地址:Index of /archive/qt/5.14/5.14.2
- Windows系统选择下载:qt-opensource-windows-x86-5.14.2.exe
勾选MinGW 64bit编译器(我电脑的系统是64bit)。
如果后期想阅读Qt源码,就选择勾选Qt源码。
默认已经勾选了QtCreator。
解决控制台中文乱码
工具 -> 选项
文本编辑器 -> 行为 -> 文本编码 -> 默认编码。
每次运行Qt程序,你的控制台可能都会出现以下警告信息:QT_DEVICE_PIXEL_RATIO已经过期。
Warning: QT_DEVICE_PIXEL_RATIO is deprecated. Instead use:QT_AUTO_SCREEN_SCALE_FACTOR to enable platform plugin controlled per-screen factors.QT_SCREEN_SCALE_FACTORS to set per-screen DPI.QT_SCALE_FACTOR to set the application global scale factor.
解决方案:设置环境变量QT_SCALE_FACTOR为1即可。
#include "mainwindow.h"#include <QApplication>// 导入头文件【也可以不导入,因为<QApplication>中已经包含了<QByteArray>】
// #include <QByteArray>int main(int argc, char *argv[]) {// 通过qputenv函数设置QT_SCALE_FACTOR为1qputenv("QT_SCALE_FACTOR", QByteArray("1"));QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
集成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编译器中
- 包含了dll中函数的入口,用于辅助找到并调用dll中的函数
- 最终需要链接到Windows程序中(比如合并到exe文件中)
值得一提的是,在Windows中,静态链接库(Static Link Library)的扩展名也是.lib、.dll.a。静态链接库和导入库的区别是:
- 静态链接库:包含了函数的具体实现代码
- 导入库:不包含函数的具体实现代码(函数的具体实现代码存储在dll中)
修改.pro文件
# 设置头文件的目录,以便编译器能够找到头文件
INCLUDEPATH += %FFMPEG_HOME%/include
# 设置导入库的目录和需要链接的导入库
LIBS += -L%FFMPEG_HOME%/lib \-lavcodec \-lavdevice \-lavfilter \-lavformat \-lavutil \-lpostproc \-lswscale \-lswresample
#号后面的内容是注释
%FFMPEG_HOME%表示ffmpeg-4.3.2-2021-02-27-full_build-shared.7z解压后的目录
需要根据你的实际情况修改为真实的路径
-L:设置导入库的目录,以便编译器能够找到导入库
-l:设置需要链接的导入库名称
导入库名称需要去掉文件名前面的lib,比如libavcodec.dll.a就写成avcodec
调用函数
在main.cpp中调用av_version_info函数,获取FFmpeg的版本信息。
#include "mainwindow.h"#include <QApplication>// 为了使用qDebug函数
#include <QDebug>// FFmpeg是C语言库
// 有了extern "C",才能在C++中导入C语言函数
extern "C" {
#include <libavcodec/avcodec.h>
}int main(int argc, char *argv[]) {// 打印版本信息qDebug() << av_version_info();QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
拷贝dll文件
Qt程序编译成功后,会生成一个exe文件exe是Windows中的一种可执行文件
我们编写的程序代码最终都存在了exe文件中
为了保证exe在运行时能成功调用FFmpeg的函数,那么就得让exe能够找到FFmpeg的dll文件(动态库文件)。可以将%FFMPEG_HOME%/bin目录中的所有dll文件拷贝到exe文件所在的目录中,exe在运行的时候,能自动找到跟它同一目录下的dll文件。
可以通过查看构建目录得知exe文件所在的目录。
运行程序后,如果能在控制台看到当前ffmepg 的版本信息 字样的输出信息,说明FFmpeg已经集成成功。
问题记录:
这里实际测试中还有一个问题,先记录一下,但是原因暂时不知道:
实际开发中 只有使用 MinGW 64-bit这个才能build pass,并运行成功,使用其他的三个都有build error
假设我们开发好程序要给 user 的windows电脑上使用,那么user是不一定装过ffmpeg,或者SDL的,因此我自己觉得好的做法,应该是如下的
INCLUDEPATH += ../include
DEPENDPATH += ../includeLIBS += -L../lib \-lavcodec \-lavdevice \-lavfilter \-lavformat \-lavutil \-lpostproc \-lswresample \-lswscale
这样就能将.h文件 引入,将动态库索引引入。
在执行的时候,还是会遇到 找不到各种dll的问题。
因此还需要将真正的dll文件放在 程序运行的exe 同一目录下
相关文章:

音视频开发4-补充 FFmpeg 开发环境搭建 -- 在windows 上重新build ffmpeg
本节的目的是在windows 上 编译 ffmpeg 源码,这样做的目的是:在工作中可以根据工作的实际内容裁剪 ffmpeg,或者改动 ffmpeg 的源码。 第一步 :下载, 安装,配置 ,运行 msys64 下载 下载地址&…...
第十二周笔记
微信小程序的自定义事件是指开发者可以自行定义并触发的事件,以实现特定的功能或逻辑。通过自定义事件,开发者可以更灵活地管理小程序的交互和数据流动,提升用户体验和开发效率。下面我将详细讲解微信小程序自定义事件,包括定义、…...

SketchUp v2024 v24.0.553 解锁版安装教程 (强大的绘图三维建模工具)
前言 SketchUp(简称SU,俗称草图大师)全球知名的三维建模软件,强大的绘图工具、建模渲染、扩展插件和渲染器模板、海量3D模型库及建模灯光材质渲染效果图,用于建筑师、城市规划专家、游戏开发等行业。 一、下载地址 …...
力扣题解记录
三元组队列、取出元组中的元素:腐烂的橘子...
Flutter 中的 ExpandIcon 小部件:全面指南
Flutter 中的 ExpandIcon 小部件:全面指南 Flutter 提供了一系列的动画图标,ExpandIcon 就是其中之一,它用于表示一个可以展开或收起的内容区域。这个小部件通常用于实现折叠列表、手风琴菜单或其他类似的UI元素。本文将为您提供一个全面的指…...

想转行程序员的朋友,有什么想问的在评论区随便问,我知道的都告诉你。
你想转行程序员吗? 我自己是法学院毕业后,通过2年的努力才转行程序员成功的。 我发现对于一个外行来说,找不到一个适合自己的方向,光靠努力在一个新的行业里成功异常艰难。即使你非常努力,但方向错了也会做大量的无用…...

Jenkins工具系列 —— 通过钉钉API 发送消息
文章目录 钉钉环境搭建使用钉钉API接口 发送消息机器人安全设置使用自定义关键词机器人安全设置使用加签方式 资料下载 钉钉环境搭建 在jenkins安装钉钉插件以及小机器人,这部分内容可参考:插件 钉钉发送消息 使用钉钉API接口 发送消息 机器人安全设置…...

MySQL--存储引擎
一、存储引擎介绍 1.介绍 存储引擎相当于Linux的文件系统,以插件的模式存在,是作用在表的一种属性 2.MySQL中的存储引擎类型 InnoDB、MyISAM、CSV、Memory 3.InnoDB核心特性的介绍 聚簇索引、事务、MVCC多版本并发控制、行级锁、外键、AHI、主从复制特…...

【经典文献】光-声立体成像:关于系统标定与三维目标重建
论文名称:《Opti-Acoustic Stereo Imaging: On System Calibration and 3-D Target Reconstruction》作者列表:Shahriar Negahdaripour, Hicham Sekkati, and Hamed Pirsiavash作者单位:美国迈阿密大学电气与计算机工程系,佛罗里达…...

弘君资本股市行情:股指预计保持震荡上扬格局 关注汽车、银行等板块
弘君资本指出,近期商场体现全体分化,指数层面上看,沪指一路震动上行,创出年内新高,创业板指和科创50指数体现相对较弱,依然是底部震动走势。从盘面体现上看,轮动依然是当时商场的主基调…...

看这两位东北圣女美吗?如何描写美女的大长腿?
看这两位东北圣女美吗?如何描写美女的大长腿? 最近署名为懂球娘娘的一篇描写东北圣女的文章火了,文中描述了海棠朵朵与辛芷蕾这两位娇媚动人的角色。其美艳动人的形象和魅力四溢的描写让人为之倾倒。 这种通过文字展现人物魅力的能力让人佩服…...

Linux相关指令
目录 1、输出重定向 2、追加重定向 3、输出重定向 4、more 5、less 6、head 7、tail 8、| (管道) 9、wc 10、与时间相关的指令 11、cal 12、find 13、grep 14、zip/unzip 1、输出重定向 在linux中,可以用echo向屏幕中输出字符串: 这是向屏幕…...

自建公式,VBA在Excel中解一元一次方程
自建公式,VBA在Excel中解一元一次方程 文章目录 前言一、运行效果图二、操作思路三、代码1.去除方程中未知数,将未知数转为“*0”2.计算方程中常数3.计算方程中未知数的系数一,先将未知数替换成“*1”4.计算方程中未知数的系数二5.计算方程得数前言 小学必考内容:一元一次…...

Linux-之 简易:Shell编程
1 为什么要学习Shell编程 对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shel脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本. 对于大数据程序员来说,需要编写Shell程序来管理集群 2 Shell是什么 Shell是一个命令行解释器ÿ…...

vue3的api风格
Vue的组件有两种不同的风格:组合式API 和 选项式API 选项式api 选项式API,可以用包含多个选项的对象来描述组件的逻辑,如:data,methods,mounted等。 组合式api setup:是一个标识,告…...
MySQL 开源到商业(五):开源 vs 养家糊口
前文提到,Oracle 收购了 Sun 之后,既没有像 Monty 预测的那样修改 MySQL 开源 License,也没有减少 MySQL 的研发投入。恰恰相反,Oracle 在持有 MySQL 知识产权的十几年里大幅提升了 MySQL 的工程质量,并且增加了很多用…...

进程信号(1)
目录 一、信号 1.1、生活中的信号 1.2、Linux中的信号 二、信号处理常见方式 三、信号的产生 3.1、简单理解信号的保存和发送 3.2、键盘产生信号 3.3、核心转储 3.4、系统调用接口产生信号 3.4.1、kill 3.4.2、raise 3.4.3、abort 3.5、软件条件产生信号 3.6、硬…...

Pytorch入门(7)—— 梯度累加(Gradient Accumulation)
1. 梯度累加 在训练大模型时,batch_size 最大值往往受限于显存容量上限,当模型非常大时,这个上限可能小到不可接受。梯度累加(Gradient Accumulation)是一个解决该问题的 trick梯度累加的思想很简单,就是时…...

day12
第一题 本题我们可以使用以下方法: 方法一: 使用hash表<元素,出现次数>来统计字符串中不同元素分别出现的次数,当某一个元素的次数大于1时,返回false,如果每个元素的出现次数都为1,则返回…...
MySQL技术点合集
目录 1. MySQL目录 2. 验证是否首次登陆方法 3. 在Liunx中使用命令来输入sql语句方法 4. 获取修改密码 5. 关闭密码策略 6. 忘记MySQL密码找回 7. 旋转90度横向查看表 8. 添加一个远程连接的用户 1. MySQL目录 /usr/bin/mysql相关命令vim /etc/my.cnfmysql配置文件ls /…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...