FFmpeg编译安装(windows环境)以及在vs2022中调用
文章目录
- 下载源码
- 环境准备
- 下载msys
- 换源
- 下载依赖
- 源码位置
- 开始编译
- 编译x264
- 编译ffmpeg
- 在VS2022写cpp调用ffmpeg
下载源码
直接在官网下载压缩包
这个应该是目前(2023/10/24)最新的一个版本。下载之后是这个样子:

我打算添加外部依赖x264,也直接去官网下载一个压缩包来。
环境准备
下载msys
我这里选择用msys2+mingw的方式来编译源码。首先去msys官网下载一下exe文件。可以傻瓜式安装。默认是装到c盘目录下,可以直接修改c为D等。避免后续出现问题。我装到了E盘下

换源
因为需要下载东西,所以换一下源。在这里:
=
用记事本软件(比如vscode之类)打开这几个 .xxx32/64的文件,找到清华和中科大的源,移动到最上方即可

以某一个为例,大概就是在圈的地方找到这两个移动到箭头的位置。
下载依赖
接着就可以下载一些待会用到的依赖。打开msys中的这个终端,可以在开始菜单找到

先更新一下包
pacman -Syu # 更新所有库
然后好像是会重启一下(忘了),再来一下这个
pacman -Sy
接着就可以下载依赖
pacman -S mingw-w64-x86_64-toolchain # mingw64编译工具链,win下的gcc
pacman -S base-devel # 一些基本的编译工具
pacman -S yasm nasm # 汇编器
pacman -S mingw-w64-x86_64-SDL2 # SDL2 是ffmpeg依赖的,因为没有它ffpaly不能用
补充一下,更新库时候直接enter全部更新,一路YYY同意。pacman的使用可自行查询,这里不再赘述。
mingw下载成功之后终端输入命令查看验证一下:

接下来可以把mingw的bin目录配置到环境变量(自行操作),注意是msys文件夹里面的mingw,一开始应该是空的,在我们下载好上面的工具之后就会看到有东西。

源码位置
搜寻n多个网上的教程之后,我选择这样安排

把ffmpeg和x264的源码解压到msys路径下的home路径下的名字为你的电脑用户名的看路径下,再新建俩空文件夹,用来安装ffmpeg和x264。如图所示,source文件夹是源码,install是准备安装的文件夹。
开始编译
编译x264
可以看到上面图中有两个sh脚本文件,
#!/bin/sh
basepath=$(cd `dirname $0`;pwd)
echo ${basepath}cd ${basepath}/x264-master-source # 根据路径名称自行修改
pwd./configure --prefix=${basepath}/x264-master-install --enable-shared
make -j10 这个数字是线程数,根据自己电脑自行选择
make install
./configure命令,它的参数会指导编译器应该如何编译代码。这里 --prefix 参数指定了编译好的库文件的安装路径,可以自己任意指定。 --enable-shared 代表编译动态库。如果你需要静态库,那么需要加入 -enable-static 参数。
编写好脚本之后,用mingw64终端进入到这个目录下,可以通过以下命令执行
./build-x264.sh
成功之后便可以在我们设置的安装目录下看到编译好的文件

编译ffmpeg
同样的,搞一个脚本文件
#!/bin/sh
basepath=$(cd `dirname $0`;pwd)
echo ${basepath}cd ${basepath}/ffmpeg-6.0-source
pwdexport PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/E/msys64/home/luv_x/x264-master-install/lib/pkgconfig
echo ${PKG_CONFIG_PATH}./configure --prefix=${basepath}/ffmpeg-6.0-install \
--enable-sdl2 --enable-nonfree --enable-muxer=mp4 --enable-debug \
--enable-gpl --enable-libx264 \
--disable-static --enable-shared \
--extra-cflags=-I${basepath}/x264-master-install/include --extra-ldflags=-L${basepath}/x264-master-install/libmake -j16
make install
因为要把x264搞进去,所以最后一行的的功能就事找到它。
但不要急着执行脚本,6.0版本似乎有点小bug,需要替换掉一个源代码文件
路径大概是这:
msys64\home\luv_x\ffmpeg-6.0-source\libavcodec\x86\mathops.h
就是这个.h文件,打开之后替换为下代码。如下:
/** simple math operations* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al** This file is part of FFmpeg.** FFmpeg is free software; you can redistribute it and/or* modify it under the terms of the GNU Lesser General Public* License as published by the Free Software Foundation; either* version 2.1 of the License, or (at your option) any later version.** FFmpeg is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU* Lesser General Public License for more details.** You should have received a copy of the GNU Lesser General Public* License along with FFmpeg; if not, write to the Free Software* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA*/#ifndef AVCODEC_X86_MATHOPS_H
#define AVCODEC_X86_MATHOPS_H#include "config.h"#include "libavutil/common.h"
#include "libavutil/x86/asm.h"#if HAVE_INLINE_ASM#if ARCH_X86_32#define MULL MULL
static av_always_inline av_const int MULL(int a, int b, unsigned shift)
{int rt, dummy;if (__builtin_constant_p(shift))__asm__ ("imull %3 \n\t""shrdl %4, %%edx, %%eax \n\t":"=a"(rt), "=d"(dummy):"a"(a), "rm"(b), "i"(shift & 0x1F));else__asm__ ("imull %3 \n\t""shrdl %4, %%edx, %%eax \n\t":"=a"(rt), "=d"(dummy):"a"(a), "rm"(b), "c"((uint8_t)shift));return rt;
}#define MULH MULH
static av_always_inline av_const int MULH(int a, int b)
{int rt, dummy;__asm__ ("imull %3":"=d"(rt), "=a"(dummy):"a"(a), "rm"(b));return rt;
}#define MUL64 MUL64
static av_always_inline av_const int64_t MUL64(int a, int b)
{int64_t rt;__asm__ ("imull %2":"=A"(rt):"a"(a), "rm"(b));return rt;
}#endif /* ARCH_X86_32 */#if HAVE_I686
/* median of 3 */
#define mid_pred mid_pred
static inline av_const int mid_pred(int a, int b, int c)
{int i=b;__asm__ ("cmp %2, %1 \n\t""cmovg %1, %0 \n\t""cmovg %2, %1 \n\t""cmp %3, %1 \n\t""cmovl %3, %1 \n\t""cmp %1, %0 \n\t""cmovg %1, %0 \n\t":"+&r"(i), "+&r"(a):"r"(b), "r"(c));return i;
}#if HAVE_6REGS
#define COPY3_IF_LT(x, y, a, b, c, d)\
__asm__ volatile(\"cmpl %0, %3 \n\t"\"cmovl %3, %0 \n\t"\"cmovl %4, %1 \n\t"\"cmovl %5, %2 \n\t"\: "+&r" (x), "+&r" (a), "+r" (c)\: "r" (y), "r" (b), "r" (d)\
);
#endif /* HAVE_6REGS */#endif /* HAVE_I686 */#define MASK_ABS(mask, level) \__asm__ ("cdq \n\t" \"xorl %1, %0 \n\t" \"subl %1, %0 \n\t" \: "+a"(level), "=&d"(mask))// avoid +32 for shift optimization (gcc should do that ...)
#define NEG_SSR32 NEG_SSR32
static inline int32_t NEG_SSR32( int32_t a, int8_t s){if (__builtin_constant_p(s))__asm__ ("sarl %1, %0\n\t": "+r" (a): "i" (-s & 0x1F));else__asm__ ("sarl %1, %0\n\t": "+r" (a): "c" ((uint8_t)(-s)));return a;
}#define NEG_USR32 NEG_USR32
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){if (__builtin_constant_p(s))__asm__ ("shrl %1, %0\n\t": "+r" (a): "i" (-s & 0x1F));else__asm__ ("shrl %1, %0\n\t": "+r" (a): "c" ((uint8_t)(-s)));return a;
}#endif /* HAVE_INLINE_ASM */
#endif /* AVCODEC_X86_MATHOPS_H */
这是从官网的github源码里嫖的,大致三个月前更新的,换成这个之后就可以安心编译了。可能编译时间比较久一些,也可以裁剪一些功能,小白就不多赘述了,可以自行查阅资料了解。
成功后安装目录应该是这样的:

bin目录下有dll,lib,exe文件,include里是头文件,不知为什么lib里面没有库文件,我选择从bin目录下粘贴过去。
还要从x264的bin目录粘到这边bin目录一个
,然后在终端验证一下:

至此,编译安装工作就完成了,后续如果需要安装别的扩展格式,再配置编译就可以了。
在VS2022写cpp调用ffmpeg
新建一个空项目后,

点击上方菜单中的项目,然后属性


然后在包含目录中添加ffmpeg安装目录下的include文件夹,库目录添加lib文件夹,接着添加依赖项

其实就是生成的lib文件名字,都加进去
avcodec.lib
avdevice.lib
avfilter.lib
avformat.lib
avutil.lib
postproc.lib
swscale.lib
swresample.lib
然后点击确定,因为我新建的是cpp文件,所以要用extern添加头文件
extern "C" {
#include "libavcodec/avcodec.h"
#include <libavformat/avformat.h>
}
然后用这两行代码测试一下
cout << avcodec_configuration() << endl;
cout << "FFmpeg 版本 " << av_version_info() << endl;

运行结果出现我们的配置情况和版本信息,大功告成!
相关文章:
FFmpeg编译安装(windows环境)以及在vs2022中调用
文章目录 下载源码环境准备下载msys换源下载依赖源码位置 开始编译编译x264编译ffmpeg 在VS2022写cpp调用ffmpeg 下载源码 直接在官网下载压缩包 这个应该是目前(2023/10/24)最新的一个版本。下载之后是这个样子: 我打算添加外部依赖x264&a…...
gRPC之gateway集成swagger
1、gateway集成swagger 1、为了简化实战过程,gRPC-Gateway暴露的服务并未使用https,而是http,但是swagger-ui提供的调用服 务却是https的,因此要在proto文件中指定swagger以http调用服务,指定的时候会用到文件 prot…...
Pytorch从零开始实战07
Pytorch从零开始实战——咖啡豆识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——咖啡豆识别环境准备数据集模型选择训练模型可视化模型预测其他问题总结 环境准备 本文基于Jupyter notebook,使用Python3.8,Pytor…...
大数据知识扫盲
MapReudece作业启动和运行机制 MapReduce是一种分布式计算框架,最初由Google开发,用于处理大规模数据集的批处理任务。其核心思想是将数据划分为小的块,然后并行处理这些块,最后将结果合并。以下是MapReduce作业的启动和运行机制…...
使用Ubuntu虚拟机离线部署RKE2高可用集群
环境说明 宿主机和虚拟机的OS与内核相同,如下 $ cat /etc/issue Ubuntu 22.04.3 LTS \n \l$ uname -sr Linux 6.2.0-34-generic虚拟化软件版本 $ kvm --version QEMU emulator version 6.2.0 (Debian 1:6.2dfsg-2ubuntu6.14) Copyright (c) 2003-2021 Fabrice Be…...
记一次任意文件下载到Getshell
任意文件下载(Arbitrary File Download)是一种常见的 Web 攻击技术,用于窃取服务器上任意文件的内容。攻击者利用应用程序中的漏洞,通过构造恶意请求,使应用程序将任意文件(如配置文件、敏感数据等…...
java异常处理
异常处理分为三类: 检查性异常 用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。 运行时异常 运行时异常是可能被程序员避免的异常…...
递归为什么这么难?一篇文章带你了解递归
递归为什么这么难?一篇文章带你了解递归 美国计算机科学家——彼得多伊奇(L Peter Deutsch)在《程序员修炼之道》(The Pragmatic Programmer)一书中提到“To Iterate is Human, to Recurse, Divine”——我理解的这句话为:人理解迭代,神理解…...
X86(32位)汇编指令与机器码转换原理
X86(32位)汇编指令与机器码转换原理 1 32位寻址形式下的ModR/M字节2 汇编指令转机器码2.1 mov ecx,[eaxebx*2]2.1.1 查Opcode和ModR/M2.1.2 查SIB 2.2 mov ecx,[eaxebx*210h]2.3 mov ecx,[eaxebx*200000100h] 本文属于《 X86指令基础系列教程》之一&…...
ES 全字段模糊检索时分词方式对检索结果的影响
文章目录 背景创建索引指定 _all 分词为空格创建索引插入索引数据全字段的模糊检索 创建索引指定 _all 分词为 keyword索引创建插入数据模糊检索 创建索引不配置 _all不同分词的结果启示录 背景 2018年参与使用 ES 和 Kafka 项目的开发,当时主要是做前端开发&#…...
基于Python Django 的微博舆论、微博情感分析可视化系统(V2.0)
文章目录 1 简介2 意义3 技术栈Django 4 效果图微博首页情感分析关键词分析热门评论舆情预测 5 推荐阅读 1 简介 基于Python的微博舆论分析,微博情感分析可视化系统,项目后端分爬虫模块、数据分析模块、数据存储模块、业务逻辑模块组成。 Python基于微博…...
python读取Excel到mysql
常见问题: 1.数据库密码有特殊字符 使用urllib.parse.quote_plus 编译密码 mysql_engine create_engine((f"mysqlpymysql://root:%s10.0.0.2:3306/mydb")%urllib.parse.quote_plus("passaaaa")) 2.设置字段类型 设置特定类型,和指…...
C++八股文面经
1.介绍一下你对面向对象的理解, 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作数据的方法组合成一个对象,以此来描述现实世界中的事物和概念。在面向对象编程中&#…...
【Linux】静态库和共享库一分钟快速上手
Linux 前言对比创建静态库动态库 前言 程序库,对于程序原来说是非常重要的。但不少人对其不太了解,接下来一起学习其中的奥秘吧! 简单来说,程序库可以分为静态库和共享库。它们包含了数据和执行代码的文件。其不能单独执行&#…...
C++继承总结(下)——菱形继承
一.什么是菱形继承 菱形继承是多继承的一种特殊情况,一个类有多个父类,这些父类又有相同的父类或者祖先类,那么该类就会有多份重复的成员,从而造成调用二义性和数据冗余。 class Person {public:Person(){cout << "P…...
CCF CCSP2023参赛记 + 算法题题解
大家好啊,时隔多年,作为大四老年人,再次来到这个地方记录算法竞赛相关,可能也是最后一次参加这种算法赛事了,我觉得还是很有纪念意义的。虽然我高中搞OI被强基背刺,以至于到了大学有点躲着竞赛,…...
buuctf_练[GYCTF2020]FlaskApp
[GYCTF2020]FlaskApp 文章目录 [GYCTF2020]FlaskApp常用绕过方法掌握知识解题思路解题一 -- 计算pin码解题二 -- 拼接绕过 执行命令 关键paylaod 常用绕过方法 ssti详解与例题以及绕过payload大全_ssti绕过空格_HoAd’s blog的博客-CSDN博客 CTF 对SSTI的一些总结 - FreeBuf网…...
针对element-plus,跳转jump(快速翻页)
待补充 const goToPage () > {const inputElement document.querySelector(.el-pagination .el-input__inner);console.log(inputElement, inputElement); } 打印之后可以看到分页跳转的数字输入框,是有进行处理的,max"102",是我自己的…...
【软件安装】Windows系统中使用miniserve搭建一个文件服务器
这篇文章,主要介绍如何在Windows系统中使用miniserve搭建一个文件服务器。 目录 一、搭建文件服务器 1.1、下载miniserve 1.2、启动miniserve服务 1.3、指定根目录 1.4、开启访问日志 1.5、指定启动端口 1.6、设置用户认证 1.7、设置界面主题 (…...
iOS .a类型静态库使用终端进行拆解和合并生成
项目中会用到许多第三方的.a类型的静态库,有时候会有一些静态库回包含相同文件而产生冲突,我们就需要对这个库进行去重的一个操作。一般有哪些文件冲突了,xcode报错都会有详细的提示。我们可以将这两个库合并,也可以其中一方中的文…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
