音视频windows安装ffmpeg6.0并使用vs调试源码笔记

news2024/11/17 11:52:48

建立在上一步,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-toolchain
  pacman -S git
  pacman -S make
  pacman -S automake
  pacman -S autoconf
  pacman -S perl
  pacman -S libtool
  pacman -S mingw-w64-x86_64-cmake    #注意这里安装的是x64的cmake
  pacman -S pkg-config
  pacman -S mingw-w64-x86_64-SDL2     #安装SDL 这里是mingw 使用时支持 vs要支持需要安装vc版,下面安装
#安装一些编译需要依赖的库  
  pacman -S yasm
  pacman -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}/include

Name: 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:项目中相关的头文件依赖,运行时依赖,可以配置在环境变量中方便多个项目的测试(先在本目录下查,再依次在环境变量目录中搜索)

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

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

相关文章

chatgpt赋能Python-python3的内置函数

Python3内置函数大全 Python3是一种高级编程语言&#xff0c;拥有丰富的内置函数库。这些内置函数包括许多核心功能和常用操作。在这篇文章中&#xff0c;我们将介绍一些最常用和最有用的Python3内置函数。 1. print() print()函数用于将输出打印到控制台。它是Python中最常…

chatgpt赋能Python-python3怎么换行

Python3中的换行是许多初学者和经验丰富的工程师们都需要掌握的关键概念之一。在本文中&#xff0c;我们将探讨Python3中如何使用换行&#xff0c;包括介绍和结论。 什么是Python3中的换行&#xff1f; 在Python3中&#xff0c;换行是指将一行代码分成多个部分&#xff0c;以…

数据结构-单调栈1

先介绍一下单调栈是什么 一种特别设计的栈结构&#xff0c;为了解决如下的问题&#xff1a; 给定一个可能含有重复值的数组arr&#xff0c;i位置的数一定存在如下两个信息 1&#xff09;arr[i]的左侧离i最近并且小于(或者大于)arr[i]的数在哪&#xff1f; 2&#xff09;arr[…

【天线专题】史密斯(Smith)圆图

对一个器件进行表征时,所发生的反射大小取决于入射信号“看到的”阻抗。由于任何阻抗都能用实部和虚部(R+jX 或 G+jB )表示,故可以将他们绘制在所谓复阻抗平面的直线网络上,如下图所示。遗憾的是,开路(一种常见的射频阻抗)在实轴上表现为无限大,因而无法表示出来。 …

集合Arrary

目录 ArraryList 引用基本类型 案例1&#xff1a;定义一个集合添加学生姓名年龄 案例2&#xff1a;查看是否存在这个id 案例3&#xff1a;手机 案例4&#xff1a;学生管理系统&#xff08;不完整&#xff09; 集合长度可变&#xff1a;自动扩容集合和数据 长度存储数据类…

Riiid Answer Correctness Prediction - lgb baseline 学习

链接 特征 features [user_questions, user_mean, content_questions, content_mean, prior_question_elapsed_time]user_df train[train.answered_correctly ! -1].groupby(user_id).agg({answered_correctly: [count, mean]}).reset_index() user_df.columns [user_id, …

chatgpt赋能Python-python3怎么安装util

如何安装python3的util模块 Python是一种高级编程语言&#xff0c;可用于从网页应用到人工智能的各种应用程序。它具有简单易学的语法和强大的功能&#xff0c;而且其可扩展性也非常好。 然而&#xff0c;要使用Python的所有功能&#xff0c;需要具有各种库和模块的支持。本文…

【设计模式】单例模式(创建型)

一、前言 学习设计模式我们关注的是什么&#xff0c;如何实现么&#xff1f;是也不是。我认为比了解如何实现设计模式更重要的是这些设计模式的应用场景&#xff0c;什么场景下我们该用这种设计模式&#xff1b;以及这些设计模式所包含的思想&#xff0c;最终帮助我们把代码写…

DNS正反向解析- 的基本实现步骤和报错解决过程

先copy一张图提升一下理解 DNS解析过程如图分为以下三种过程&#xff1a;首先是DNS客户机解析器&#xff0c;从WEB浏览器中输入相应URL&#xff0c;DNS客户机解析器会首先检查自己本地host文件是否存在网站映射关系&#xff0c;成功则直接完成域名解析。如果host中没有相关映射…

Java学习路线(3)——基础数据类型操作

一、自动类型转换 1、什么是自动类型转换&#xff1f; 自动类型转化是范围小的数据可赋值给范围大的数据且精度不损失&#xff0c;且可以跨越式转化。 基础数据类型之间的转换如下&#xff1a; byte(1)—short(2)—char(2)—int(4)—long(8)—float(4)—double(8) 2、表达式的…

cs109-energy+哈佛大学能源探索项目 Part-2.1(Data Wrangling)

博主前期相关的博客见下&#xff1a; cs109-energy哈佛大学能源探索项目 Part-1&#xff08;项目背景&#xff09; 这次主要讲数据的整理。 Data Wrangling 数据整理 在哈佛的一些大型建筑中&#xff0c;有三种类型的能源消耗&#xff0c;电力&#xff0c;冷冻水和蒸汽。 冷冻…

求二进制位中一的个数

原题链接&#xff1a;牛客网 题目内容&#xff1a; 写一个函数返回参数二进制中 1 的个数&#xff0c;负数使用补码表示。 比如&#xff1a; 15 0000 1111 4 个 1 方法一&#xff1a; #include<stdio.h>int NumberOf1(unsigned int n) {int count 0;while (n)…

分布式事务常见解决方案

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

通过关键字搜索接口获取alibaba国际站商品列表

作为一名技术爱好者&#xff0c;我们总会遇到各种各样的技术问题&#xff0c;需要寻找合适的技术解决方案。而在互联网时代&#xff0c;我们可以快速通过搜索引擎获取丰富的技术资源和解决方案。然而&#xff0c;在不同的技术分享中&#xff0c;我们常常会遇到质量参差不齐的文…

eggjs

官网&#xff1a;快速入门 - Egg npm init egg --typesimple 在平时安装/下载依赖时候 控制栏出现如下报错时 npm ERR! code ENOLOCAL npm ERR! Could not install from "Files\nodejs\node_cache\_npx\13944" as it does not contain a package.json file. 解释:无…

【Linux 下】 信号量

文章目录 【Linux 下】 信号量信号量概念信号量操作初始化和销毁P&#xff08;&#xff09;操作V&#xff08;&#xff09;操作理解PV操作 基于信号量与环形队列实现的CS模型基于信号量和环形队列实现的生产者与消费者模型 【Linux 下】 信号量 信号量概念 信号量&#xff08;…

蓝莓投屏 - 超低延时投屏的投屏软件

蓝莓投屏是一个低延时投屏软件&#xff0c;支持安卓、iOS、Mac 设备与Windows系统的电脑之间互相投屏&#xff0c;包括手机/平板之间互投&#xff0c;手机投电脑&#xff0c;电脑投手机 等功能。 投屏画质达到4K高清&#xff0c;播放流畅无延迟。音视频同步&#xff0c;几乎没有…

无需OpenAI API Key,构建个人化知识库的终极指南

一、介绍 今天和大家一起学习下使用LangChain&#xff0b;LLM 来构建本地知识库。 我们先来了解几个名词。 二、什么是LLM&#xff1f; LLM指的是大语言模型&#xff08;Large Language Models&#xff09;&#xff0c;大语言模型&#xff08;LLM&#xff09;是指使用大量文…

Excel中正则表达式函数的使用

有这样一列 上海市闵行区七宝镇中春路7001号37栋 021-54881702 嘉定区黄渡镇金易路1号 021-69580001 如何将地址和电话分开 这两个分成2列&#xff08;地址和电话分开&#xff09; 第一列 第二列 上海市闵行区七宝镇中春路7001号37栋 021-54881702 嘉定区黄渡镇金易路1号 021-6…

【中阳期货】GPT-4正在改进自己,超强进化

GPT是一种预训练语言模型&#xff0c;由OpenAI研发。如果你希望快速了解GPT&#xff0c;可以按照以下步骤进行&#xff1a; 了解预训练语言模型&#xff1a;预训练语言模型是一种人工智能技术&#xff0c;可以通过大量语言数据的训练&#xff0c;自动学习语言的规律和语义。GPT…