音视频windows安装ffmpeg6.0并使用vs调试源码笔记
建立在上一步,vs已经能够正常调试qt项目,可以实现:
1:qt可以使用mvsc (使用cdb)进行调试。
2:vs已经可以加载qt项目,借助vs进行调试。
本文目标:编译ffmpeg库,编译出对应的相关库,使用qt,vs进行调试demo,为研究源码做准备。
windows安装ffmpeg以前整理过们可以参考:音视频windows环境ffmpeg搭建_
本文编译ffmpeg6.0,使调试源码环境能正常进行。
技巧:which.exe cl.exe 可以查看当前生效的执行文件
1:安装MSYS2(提供相关指令类似linux操作系统进行编译,可能windows使用)
参考:使用MSYS的一些经验 - 知乎 (zhihu.com)
可以官网下载:https://www.msys2.org/
建议通过阿⾥云的链接更快速下载:https://mirrors.aliyun.com/msys2/distrib/x86_64/msys2-x86_64-20230318.exe。
2:修改MSYS2的配置和源
安装目录下(D:\software\msys2)msys2_shell.cmd 文件进行修改:
#inherit 代表把当前窗口的环境变量导入给 msys2 的命令行。 把vs窗口继承给msys2
#修改源文件中rem set MSYS2_PATH_TYPE=inherit 为:
set MSYS2_PATH_TYPE=inherit
修改对应文件下的源,在文件开头增加:
#D:\software\msys2\etc\pacman.d\mirrorlist.mingw32 中
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686/#D:\software\msys2\etc\pacman.d\mirrorlist.mingw64 中
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/#D:\software\msys2\etc\pacman.d\mirrorlist.msys 中
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch/
Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/
修改验证方式:
# 在D:\software\msys2\etcpacman.conf中
#大概40行位置 作用是修改源后,屏蔽签名SigLevel = Never
#SigLevel = Required
#LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
3:使用msys2安装基础组件
1:这里要基于vs2019进行调试,所以编译时基于vs2019启动msys2.
===》在启动项中visual studio 2019 目录下,以管理员身份启动命令行窗口(x64 Native Tools Command Prompt for VS 2019 )
-----------》用vs启动msys2,加上上面配置过,则msys2继承vs2019的环境变量了。
===》跳转到对应msys2安装目录下,启动
D:\software\msys2>doskey /HISTORY
D:
cd msys2
msys2_shell.cmd -mingw64 #启动对应指令#如果要打开msys2的msys窗⼝
#msys2_shell.cmd
===》启动对应的msys2窗口,只想相关的安装指令:
#刷新软件包数据
pacman -Sy
#安装编译环境:pacman -S mingw-w64-x86_64-toolchainpacman -S gitpacman -S makepacman -S automakepacman -S autoconfpacman -S perlpacman -S libtoolpacman -S mingw-w64-x86_64-cmake #注意这里安装的是x64的cmakepacman -S pkg-configpacman -S mingw-w64-x86_64-SDL2 #安装SDL 这里是mingw 使用时支持 vs要支持需要安装vc版,下面安装
#安装一些编译需要依赖的库 pacman -S yasmpacman -S nasm
===》修改msys2窗口支持中文显示:
窗⼝右键->Options->Text,然后locale选择:zh_CN,Character set 选择 UTF-8。
4:用msys2源码编译安装第三方库。
1:libx264
要求编译ffmpeg时配置:–enable-gpl --enable-libx264.
cd ~
mkdir ffmpeg6.0_sources
cd ffmpeg6.0_sources/
git clone --depth 1 https://github.com/mirror/x264.git
cd x264/
CC=cl ./configure --enable-shared
make
make install
cp /usr/local/lib/libx264.dll.lib /usr/local/lib/libx264.lib#需要有/usr/local/lib/pkgconfig/x264.pc 文件 改成:
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/includeName: x264
Description: H.264 (MPEG4 AVC) encoder library
Version: 0.164.x
Libs: -L${exec_prefix}/lib -lx264
Libs.private:
Cflags: -I${prefix}/include -DX264_API_IMPORTS
2:libx265
要求编译ffmpeg时配置:–enable-gpl --enable-libx265.
#libx265编译比较特殊 编译脚本文件是vs调用makefile文件,并且要用nmake进行编译
#注释掉 msys2本身的cmake
mv /mingw64/bin/cmake.exe /mingw64/bin/ccmake.exe
#进行编译
cd ffmpeg6.0_sources/
git clone https://gitee.com/mirrors_videolan/x265.git
cd x265/build/msys-cl/
#进行编译
./make-Makefiles.sh#拷贝相关目标文件 及配置
cp x265.exe libx265.dll /usr/local/bin/
cp libx265.lib /usr/local/lib/x265.lib
cp x265-static.lib /usr/local/lib/
cp x265_config.h /usr/local/include/
cp ../../source/x265.h /usr/local/include/
cp x265.pc /usr/local/lib/pkgconfig/#需要修改/usr/local/lib/pkgconfig/x265.pc 文件 改成:
prefix=/usr/local
3:libfdk-aac
要求编译ffmpeg时配置:–enable-libfdk-aac ( 如果你已经配置了 --enable-gpl则需要加上-- enable-nonfree).
cd ffmpeg6.0_sources/
#下载网络问题 就多试几次
git clone https://github.com/mstorsjo/fdk-aac.git fdk-aac-2.0.1
cd fdk-aac-2.0.1/
git checkout v2.0.1
#注释掉msys2的link 要用vs2019的link
mv /usr/bin/link.exe /usr/bin/link-bk.exe
which.exe link #可以多看看
#编译和安装
nmake -f Makefile.vc all
nmake -f Makefile.vc prefix=/usr/local install
#恢复link
mv /usr/bin/link-bk.exe /usr/bin/link.exe#需要新增 /usr/local/lib/pkgconfig/fdk-aac.pc 文件 增加
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: Fraunhofer FDK AAC Codec Library
Description: AAC codec library
Version: 2.0.1
Libs: -L${libdir} -lfdk-aac
Libs.private:
Cflags: -I${includedir}
4:安装SDL2(msvc支持,需要安装vc版本)
ffmpeg需要配置支持: --enable-sdl2
安装路径:Release 2.26.5 · libsdl-org/SDL · GitHub
下载对应的包:SDL2-devel-2.26.5-VC.zip
#下载后解压对应的包后。 拷贝头文件和lib文件
#把SDL2目录下的include目录 拷贝到msys2安装目录下 \usr\local\include目录下,并把文件夹改为SDL2
#把SDL2目录下的lib/x64下相关lib拷贝到 \usr\local\lib目录下#需要配置sdl2的环境变量,使sdl2可以被系统识别到
export INCLUDE=$INCLUDE";D:\software\msys2\usr\local\include\SDL2"
export LIB=$LIB";D:\software\msys2\usr\local\lib"
#查看
echo $LIB#同样需要配置/usr/local/lib/pkgconfig/sdl2.pc 编辑如下:
prefix==/usr/local
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include
Name: sdl2
Description: Simple DirectMedia Layer is a cross-platform multimedia libra
ry designed to provide low level access to audio, keyboard, mouse, joystic
k, 3D hardware via OpenGL, and 2D video framebuffer.
Version: 2.26.5
Requires:
Conflicts:
Libs: -L${libdir} -lSDL2main -lSDL2
Cflags: -I${includedir}
拷贝lib参考:
5:源码安装ffmpeg6.0 (6.0还有一些报错,日志相关,先屏蔽后)
cd ffmpeg6.0_sources/
git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg/
git checkout remotes/origin/release/6.0
cd ../
cp -arf FFmpeg ffmpeg6.0
cd ffmpeg6.0/
CC=cl.exe PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ ./configure --toolchain=msvc --enable-shared --enable-ffplay --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-sdl2 --enable-gpl --enable-nonfree --disable-optimizations --disable-stripping
mv /usr/bin/link.exe /usr/bin/link.exe.bk
which link #这里直接用vs的link编译了
make -j24 #这里编译有报错,日志相关的直接注释掉就好,暂不关注 但是测试时日志显示不全#这里还有一个编码的警告 c4828,应该需要修改编码格式,但是暂时没处理
make install#进行测试:
ffplay.exe http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4
ffplay.exe http://mirror.aarnet.edu.au/pub/TED-talks/911Mothers_2010W-480p.mp4
5:qt项目进行调试
ffmpeg以及相关依赖都已经安装成功,使用qt调用进行调试。
===》这里目的时可以debug ffmpeg api内部源码,用vs2019+qt插件+MSCV。
===》qt+mingGw 无法调试ffmpeg api内部源码
===》建立在上述ffmpeg编译时,没有进行编译优化。
1:使用qt新建一个项目(c/c++)
c项目:
#include <stdio.h>
#include "libavutil/avutil.h"
int main()
{printf("hello ffmpeg version is: %s \n",av_version_info());return 0;
}
c++项目注意,头文件的包含
#include <iostraem>
// 包含ffmpeg头⽂件
#ifdef __cplusplus //⽽这⼀部分就是告诉编译器,如果定义了__cplusplus(即如果是cpp⽂件,
extern "C"{
#include "libavutil/avutil.h"
#endif
#ifdef __cplusplus
}
#endif
int main()
{
std::cout << Hello FFMPEG, version is " << av_version_info() << std::end
l;
return 0;
}
注意在对应的.pro文件中增加头文件和lib文件识别:
#win32代表了是windows上执行 $$PWD代表项目目录本身。
win32 {
INCLUDEPATH += $$PWD/ffmpeg6.0\include
LIBS += $$PWD/ffmpeg6.0/lib/avformat.lib \$$PWD/ffmpeg6.0/lib/avcodec.lib \$$PWD/ffmpeg6.0/lib/avdevice.lib \$$PWD/ffmpeg6.0/lib/avfilter.lib \$$PWD/ffmpeg6.0/lib/avutil.lib \$$PWD/ffmpeg6.0/lib/postproc.lib \$$PWD/ffmpeg6.0/lib/swresample.lib \$$PWD/ffmpeg6.0/lib/swscale.lib
}
====》拷贝对应的头文件和lib到对应目录下(这里应该可以配置成死目录):
这里直接拷贝msys2目录下 /usr下的local目录到项目目录,然后修改文件夹local为ffmpeg6.0
=====》编译时报找不到对应的lib
对目录进行修改:把目录下bin目录中对应avformat.lib等lib文件拷贝到lib目录下。
=====》进行编译,报错The CDB process terminated,在相关的环境都安装正常场景下,该问题是运行第三方库的问题。
拷贝对应的dll文件到构建后生成的项目文件夹下,再次调试ok。
2:使用vs加载qt项目进行尝试。
启动vs2019并不加载项目,在**扩展---->QT VS Tools–>Open Qt Project(.pro)**加载qt项目。
加载完成后,会在对应的qt项目下生成相关vs的项目文件,以vcxproj结尾。
用vs2019加载vcxproj项目文件,即可以在vs2019中调试我们的项目。
总结:
1:调试环境搭建比较繁琐,需要注意细节,第一个demo调试程序要运行ok。
2:使用msys2进行ffmpeg源码,需要注意相关库的编译,pkgconfig中配置,编译时用到的cmake,link,以及最终生成的lb,头文件,以及可执行文件目录位置,以及需要配置环境变量。
3:需要注意qt配置文件中,相关头文件,依赖lib文件,运行时需要的dll文件的拷贝。
4:vs2019也可以直接创建qt项目,但是相关的各种依赖配置比较复杂和繁琐,加载qt项目会直接转换过去,同时需要研究vs中加载运行参数方法。
5:项目中相关的头文件依赖,运行时依赖,可以配置在环境变量中方便多个项目的测试(先在本目录下查,再依次在环境变量目录中搜索)
相关文章:

音视频windows安装ffmpeg6.0并使用vs调试源码笔记
建立在上一步,vs已经能够正常调试qt项目,可以实现: 1:qt可以使用mvsc (使用cdb)进行调试。 2:vs已经可以加载qt项目,借助vs进行调试。 本文目标:编译ffmpeg库…...

Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数、各版本差异、官方提供常见问题
Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数、各版本差异、官方提供常见问题 1.Midjourney Prompt 高级参数 Quality 图片质量是另一个我比较常用的属性,首先需要注意这个参数并不影响分辨率,并不改变分辨率&#x…...
什么是Java虚拟机(JVM)?
Java虚拟机(Java Virtual Machine,JVM)是Java平台的关键组成部分之一。它是一种虚拟的计算机,可以在计算机上运行Java字节码(即编译后的Java程序)。 JVM具有以下主要功能: 字节码执行ÿ…...
【HISI IC萌新虚拟项目】Package Process Unit模块整体方案·PART3
5. 模块方案说明 5.1CRG 模块方案说明 5.1.1简介 CRG 模块实现复位信号的滤抖功能,可滤除小于100ns的低电平复位毛刺,并对复位信号进行同步化处理。同时,对100MHz的输入时钟信号进行2分频,作为 CPU_IF模块和TEST_CORE模块的工作时钟。 5.1.2接口信号 信号位宽I/O描述...

分布式事务常见解决方案
分布式事务常见解决方案 一、事务介绍 事务是一系列的动作,它们综合在一起才是一个完的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。 1、单事务概念…...

061:cesium设置棋盘图材质(material-5)
第061个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置棋盘材质,请参考源代码,了解CheckerboardMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共89行)相关API参考:专栏目标…...

【AI Earth试玩】权限配置与openAPI调用工具库
前言 AI earth是阿里达摩院出的遥感云计算平台,我简单体验下来感觉像是GEE的python版本遥感深度学习计算平台,整体体验还是挺不错的,尤其是多分类的结果还是挺惊艳的。 平台提供工具箱和notebook两种模式,工具箱整个交互简单易用…...

Tomcat安装与使用
Tomcat 是HTTP服务器,用于使用HTTP协议。 1、下载Tomcat 下载链接:https://tomcat.apache.org/ 进入官网后,根据自己想要下载的版本进行下载,我这里选择下载的版本是Tomcat 8. 点击选择自己想要下载的对应版本,下载Z…...
大数据课程-学习二十四周总结
6.Hive函数 Hive的函数分为三类: 聚合函数、内置函数,表生成函数,聚合函数之前已经学习过了,接下来学习内置函数和表生成函数. 6.1.Hive的内置函数 6.1.1.数学函数 6.1.1.1. 取整函数: round 语法: round(double a) 返回值: BIG…...

【GPT科技系列】国内开发者调用openAI-API科技方法
1. 前言 openAI上线7个月了,但是随着openAI的约束越来越多,国内开发者想要使用openai的接口实现开发简直就是难上加难。那真的就没有办法了吗?no no no,CF解决一切不开心~ 2.准备工作 我们需要一个国际域名 注册cloudflare账号 …...

基于QGIS的长株潭城市群边界范围融合实战
背景 在面向区域的研究过程中,比如一些研究区域,如果是具体的行政区划,比如具体的某省或者某市或者县,可以直接从国家官方的地理数据中直接下载就可以。但如果并没有直接的空间数据那怎么办呢?比如之前遇到的一个场景&…...

【MySQL联合查询】轻松实现数据关联
1、联合查询 联合查询又称为多表查询,它的基本执行过程就是笛卡尔积 1.1 认识笛卡尔积 那么什么是笛卡尔积呢? 答:笛卡尔积就是将两张表放在一起进行计算,把第一张表的每一行分别取出来和第二张表的每一行进行连接,得到…...

Windows安装Ubuntu双系统
Windows安装Ubuntu双系统 1.下载Ubuntu 16.04,地址https://releases.ubuntu.com/16.04/ 2.下载Rufus,地址https://rufus.ie/zh/ 3.准备U盘,烧录系统 4.磁盘分区 5.重启,按住shift键 本人电脑是联想小新 Windows11系统࿰…...
【大数据之Hadoop】三十四、Hadoop综合调优之小文件优化方法
1 Hadoop小文件弊端 HDFS上每个文件都要在NameNode上创建对应的元数据,这个元数据的大小约为150byte,这样当小文件比较多的时候,就会产生很多的元数据文件,一方面会大量占用NameNode的内存空间,另一方面就是元数据文件…...

周赛 Round#3 题解
又不能放图片,又不能写学校,你让我怎么办啊!! 系列文章目录 1.周赛 Round#1 2.周赛 Round#2 前言 这是周赛第三轮。//涉及隐私原因,博文里不放题目,要看的去http://0241:101:610:801.22222 划分字符串贪…...

详解HTTPS加密过程
目录 前言 HTTPS是什么 HTTPS的工作过程 引入对称加密 引入非对称加密 引入证书 总结 前言 对于HTTP上篇文章已经做了详细的解释了。众所周知,HTTPS要比HTTP要安全,但是为什么HTTPS要比HTTP安全呢? 这篇文章主要研究HTTPS的加密机制…...

聚观早报 | ChatGPT登顶美区iOS免费榜;库克不满苹果首款MR设备
今日要闻:ChatGPT登顶美区iOS免费榜;库克不满苹果首款MR设备;索尼正开发小尺寸折叠屏手机;万达辟谣大规模裁员;智能仿生手让截肢者重获手心的温度 ChatGPT登顶美区iOS免费榜 ChatGPT 在 iOS 美区免费 App 排行榜上位列…...

position:sticky-粘性吸附布局
一、描述 就是在一个滚动的容器里,将一个子元素设置为postion:sticky 在元素显示在可视区域内,显示的效果与position:relative 一致,当元素被滑动出可视区域外是,显示效果与position:fixed一致 二、注意事项 1、父元素需要存在滚动(overflow:auto&…...

【MySQL】-【数据库的设计规范】
文章目录 为什么需要数据库设计范式范式简介范式都包括哪些键和相关属性的概念第一范式(1st NF)第二范式(2nd NF)第三范式(3rd NF) 反范式化概述应用举例反范式化的新问题反范式的适用场景 BCNF(巴斯范式)案例案例一案例二 第四范式案例案例一案例二 第五范式、域键范式范式的实…...
全面解析缓存应用经典问题
1、前言 随着互联网从简单的单向浏览请求,发展为基于用户个性信息的定制化以及社交化的请求,这要求产品需要做到以用户和关系为基础,对海量数据进行分析和计算。对于后端服务来说,意味着用户的每次请求都需要查询用户的个人信息和…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...