VS2019+msys2编译ffmpeg

2023-10-26

最近在学习音视频相关开发技术。第一步是搭建开发环境,通过参考网上查到的资料结合实际情况,最终将ffmpeg编译通过,并支持x264、x265、fdk-aac。在这里将具体的操作过程记录下来,方便以后参考。

1、下载VS2019社区版本、下载msys64位版本的可执行文件进行安装。

https://www.msys2.org msys2官网
https://visualstudio.microsoft.com/zh-hans/downloads/ VS2019下载地址

2、通过vs2019的x86 Native Tools 命令行工具打开msys2,并继承命令行工具的环境变量

用文本编辑器打开 msys2安装根目录下的msys2_shell.cmd ,将
rem set MSYS2_PATH_TYPE=inherit
改为set MSYS2_PATH_TYPE=inherit,即去掉行首的rem字符并保存。

打开x86 Native Tools 命令行工具,cd到msys2安装根目录下,执行命令
msys2_shell.cmd -mingw32 打开一个mingw32终端,这时候输入cl会有正常提示信息,如果是乱码则将options里的语言设置为GBK即可。

3、配置编译环境

安装之前,先替换安装包的源地址,打开msys2的安装目录进入/etc/pacman.d/文件夹下配置3个文件(mirrorlist.mingw32、mirrorlist.mingw64、mirrorlist.msys)

在mirrorlist.mingw32文件最前面增加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686
在mirrorlist.mingw64文件最前面增加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64
在mirrorlist.msys文件最前面增加:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch

依次执行下面的命令更新环境

pacman -S nasm #汇编工具,安装
pacman -S yasm #汇编工具,安装
pacman -S make #项目编译工具,必须安装 
pacman -S cmake #项目编译工具,必须安装 
pacman -S diffutils #比较工具,ffmpeg configure 生成makefile时会用到,若不安装会警告,最好是安装 
pacman -S pkg-config #库配置工具,编译支持x264和x265用到 pacman -S git #下载源码用,可以不安装,可自行通过其它方式下载源码
pacman -S base-devel # 安装基本开发组件
pacman -S binutils #包含ld等命令

4、下载并编译x264

在msys根目录的home目录下新建xsrc目录,使用git下载源码达到本地。在msys2命令行中输入下面的命令克隆代码。

git clone https://code.videolan.org/videolan/x264.git

下载完成后,cd到x264目录下,执行命令

CC=cl ./configure --enable-shared

生成makefile 文件

输入命令

make

等待编译,编译完成后输入命令

make install

默认安装到msys2根目录的 usr/local 目录下

5、下载并编译x265

在xsrc 下执行命令

git clone https://github.com/videolan/x265.git

下载完成后关闭所有命令行窗口,重新以管理员身份运行x86 Native Tools 命令行工具,打开msys2命令行,cd到x265目录下执行编译命令

./make-Makefiles.sh

编译完成后执行安装命令

nmake install

该命令默认将x265安装到 C:/Program Files (x86)/目录下。将该目录x265中的bin、lib、include 目录拷贝到msys2根目录的usr/local/对应的目录下,并修改lib/pkgconfig 中的 x265.pc,将第一行的prefix路径改为prefix=/usr/local

6、下载并编译fdk-aac

在xsrc 下执行命令

git clone https://github.com/mstorsjo/fdk-aac.git

cd到fdk-aac源码文件夹 ,执行文件autogen.sh

./autogen.sh

执行命令生成makefile

./configure --enable-shared --enable-static

编译 make -j6

安装 make install

默认安装到mingw32目录下,将对应的bin、lib、include目录拷贝到/usr/local对应目录下,并修改fdk-aac.pc,将第一行的prefix路径改为prefix=/usr/local。

7、下载并编译ffmpeg

在xsrc 下执行命令

git clone https://github.com/FFmpeg/FFmpeg.git

cd到FFmpeg源码文件夹 ,新建install目录,后面执行make install时,会将生成的库安装到这个目录下。

执行命令,生成makefile文件 CC=cl.exe ./configure --prefix=./install --toolchain=msvc --enable-shared --enable-libx264 --enable-gpl --enable-libfdk-aac --enable-nonfree --enable-libx265

./configure -h 可以查看每个配置项的具体含义。这里

–prefix=./install --toolchain=msvc

//指定安装路径和工具链MSVC --enable-shared //编译为动态库 --enable-libx264 --enable-libx265

//启用支持x264和x265,解码h264和265会需要用到 --enable-gpl //开启协议,x264,x265必需 --enable-libfdk-aac --enable-nonfree

//aac音频编码,aac必须启用nonfree

如果一切顺利接下来执行 make 开始编译

编译结束后 执行 make install 将生成的文件和依赖安装到install目录下。

在 ./configure 阶段可能遇到的问题

a) libx264.lib找不到,这是因为生成的x264库默认命名为libx264.dll.lib,将其改为libx264.lib可解决这个问题。

b) fdk-aac 库文件找不到,这里有两个方法,一个是将/usr/local/lib 目录下的pkgconfig目录移动到mingw32/lib目录下;另一个是将/usr/local/lib/pkgconfig 设置到环境变量中,export PKG_CONFIG_PATH=“/usr/local/lib/pkgconfig”:$PKG_CONFIG_PATH

c) ERROR: x265 not found using pkg-config
将libx265.lib 改名为x265.lib后配置成功。

总结:

编译ffmpeg时会遇到各种奇奇怪怪的问题,但是只要静下心来慢慢的看日志,查资料总能把问题解决,有志者事竟成,加油!!!。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS2019+msys2编译ffmpeg 的相关文章

  • 为 DocumentDb 设置自定义 json 转换器

    我正在使用类型化 DocumentQuery 从 Azure DocumentDb 集合中读取文档 from f in client CreateDocumentQuery
  • 带有 ASP.NET 按钮回发的 jQuery UI 对话框

    我的 ASP NET 页面上有一个运行良好的 jQuery UI 对话框 jQuery function jQuery dialog dialog draggable true resizable true show Transfer hi
  • 并行运行多个任务

    我有一个代理列表 每个代理都会访问不同的站点并从站点中提取所需的数据 目前它一次只做一个 但我希望同时运行 10 20 个任务 这样它就可以一次性从 20 个站点下载 而不是只下载一个 这是我目前正在做的事情 private async T
  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • 维护 VS Test Project 中单元测试方法之间的上下文

    我想按顺序运行以下单元测试 使用随机数字的名称 密码等创建新客户 检索刚刚创建的客户并断言其属性包含相同的随机数 对同一用户调用 ForgotPassword 函数 并使用相同的随机数作为用户名 清楚地看到 我需要生成一次随机数 并在 3
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 让 Windows 尝试读取文件

    我正在对 Windows 文件系统进行某种封装 当用户请求打开文件时 Windows 调用我的驱动程序来提供数据 在正常操作中 驱动程序返回缓存的文件内容 但是 在某些情况下 实际文件没有缓存 我需要从网络下载它 问题是是否有可能让 Win
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • 稀疏矩阵超定线性方程组c/c++库

    我需要一个库来解决 Ax b 系统 其中 A 是一个非对称稀疏矩阵 每行有 8 个条目 而且可能很大 我认为实现双共轭梯度的库应该没问题 但我找不到一个有效的库 我尝试过 iml 但 iml sparselib 包中缺少一些标头 有小费吗

随机推荐

  • APP版本升级与服务器交互

    踏入程序媛旅程已经快一年了 学生生涯也即将结束 正式踏入工作岗位 万事开头难 只能多问多记 久病成医 遇到的问题多了自己的技术也会有所提高 博客也一年了 之前一直想写博 然后各种拖延 到现在才开始 希望自己能坚持 项目中加了一个APP版本升
  • 一种基于深度学习的全自动纸心电图数字化算法

    深度学习在医学检测仪方面的应用 人们越来越关注将深度学习方法应用于心电图 ECG 最近的研究表明 神经网络 NN 可以仅通过 ECG 预测未来的心力衰竭或心房颤动 然而 神经网络的训练需要大量的心电图 而目前很多心电图只是纸质的 不适合神经
  • win10安装pycocotools遇到的问题(gcc.exe failed with exit status 1)

    背景安装pycocotools一直过不去 一直报错 PS C Users peter gt pip install git https github com philferriere cocoapi git subdirectory Pyt
  • Java —— 有关存储学生信息数组的操作

    class Test public class Test public static void main String args TODO Auto generated method stub Student s s new Student
  • 启动elasticsearch报错处理方式

    启动elasticsearch报错 bootstrap check failure 1 of 1 memory locking requested for elasticsearch process but memory is not lo
  • Flask web页面加载很慢的原因

    直接上正题吧 Flask写了个简单的页面 居然加载超过30s 排查问题发现如下 能想象加载3分钟后还是失败的心情嘛 解决方法如下 添加CDN 就是让游览器加载moment js时 不需要中介直接找到moment js文件 做法 在momen
  • Vue动态改变title的标题及图标

    1 首先安装 vue wechat title包 npm install vue wechat title save 2 引入包 设置每个页面的标题 在mian js中引入 作为全局使用 import VueWechatTitle from
  • 串口命令出现>号(大于号),无法继续执行命令,如何退出

    如果在输入无法结束 提示 gt 符号 大于号 时 可以尝试按下该组合来结束输入 ctrl c 向当前进程发送 SIGINT 信号 用于终止一个进程 ctrl z 向当前进程发送 SIGSTOP 信号 用于挂起一个进程 ctrl d 不是发送
  • React 组件的分类和Render返回值

    组件化原因 随着web的发展 许多与客户端交互的逻辑放在的客户端 用户交互 数据渲染 数据交换等 前端代码数据增多 页面逻辑复杂 难以维护 以上导致前端代码耦合度高 复用性低 开发效率底下 以上问题可以使用组件化发发解决 优点 对代码进行封
  • Java内部类

    内部类 说简单点就是一个类里面还可以定义一个类 内部类可以定义在别一个类的任意位置上 包括成员位置和局部位置 私有属性 private在本类中有效 1 内部类可以直接访问外部类中的成员 私有和非私有的都可以 2 外部类如果想要访问内部类 必
  • Linux文件创建及查看方法

    1 文件创建 vi vim 原来有文件就打开 没有就创建再打开 回车后进入命令模式 w w保存 q退出 强制 这三个可以自由组合 记住前面有冒号哦 n光标移至第n行 dd 删一行 xx 删一个 光标移至行末 G光标移至文末 查找某个字符串
  • RabbitMQ 启动报错 Failed to check/redeclare auto-delete queue(s) access to vhost '/' refused for user

    RabbitMQ 启动报错 Failed to check redeclare auto delete queue s access to vhost refused for user rabbit 今天项目在新的服务器上启动 所有的配置文
  • element-ui table 表格组件实现可拖拽效果(行、列)

    前言 最近需要实现table表格 行拖拽的功能 参照了一些优秀文章 实现了一下 参考文章 Vue进阶 幺零五 elementUI 实现表格行列拖拽 实现思路 主要是借助sortablejs 关于sortablejs我简单写了篇文章 有兴趣的
  • IDEA 最牛配置,写代码太爽了

    IDEA 最牛配置 写代码太爽了
  • qt:同一份代码在vs2022 QT VS TOOL扩展和 QtCreator下运行结果不同

    公司要求用的是QtCreator 但是谁能离得开安装了Resharper的VS呢 我就在VS下装了QT的环境 开始编写调试代码 其实是两个软件都在用的 可能是没找到方法 VS下的资源文件显示不是很方便 我就用QtCreator加资源 到后面
  • 远程RDP、远控手机、双屏控双屏,向日葵“瓜子会员”妥妥的真香

    最近儿有点 小感冒 没去公司在家歇着 居家归居家 砖还是要搬的 突然来活了也得及时的处理掉 这种时候我一般用远程桌面的方式 之前就一直用的向日葵远程控制 为啥用远程桌面呢 主要原因是家里电脑性能不如公司的工作站 而且缺少很多工作必须的专业软
  • godaddy服务器内网站转移,2021年Godaddy最新域名转出教程

    因为之前Goddady登录界面修改的原因 导致部分新手不知道Godaddy域名转出步骤 笔者特此做了一个简单的教程 供大家学习和参考 第一步 打开Godaddy官网 登录Godaddy账户 然后点击页面右侧的My Account 进入账号管
  • 实战HttpClient 接口调用以及获取token 设置请求头

    简介 HTTP 协议可能是现在 Internet 上使用得最多 最重要的协议了 越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源 虽然在 JDK 的 java net 包中已经提供了访问 HTTP 协议的基本功能 但
  • CrashImmuneDecoder类关系分析(HardwareVideoDecodeSDK)

    关于此项目github地址 https github com shyluo CrashImmuneDecoder 为了以后快速的熟悉老罗大神的视频硬解SdK 画了以下类关系图 画的不好 请见谅
  • VS2019+msys2编译ffmpeg

    最近在学习音视频相关开发技术 第一步是搭建开发环境 通过参考网上查到的资料结合实际情况 最终将ffmpeg编译通过 并支持x264 x265 fdk aac 在这里将具体的操作过程记录下来 方便以后参考 目录 1 下载VS2019社区版本