Windows环境 源码编译 FFmpeg

news2024/11/19 23:33:21

记录一下windows环境纯代码编译ffmeg的过程!

目录

一、安装MSYS2

1.下载安装

2.配置

3.修改源

4.测试与更新

二、安装其他必要工具

1.安装MinGW-w64

2.安装git

3..安装make等工具

4.编译前的其他准备工作

①.重命名link.exe

②.下载和安装YASM

③.安装Visual Studio

④.检查

5.下载和编译 x264

6.下载和编译 fdk-aac

7.下载和编译 mp3

8.下载和编译 libvpx

三、下载和编译 ffmpeg

1.下载

2.编译

3.测试

4.添加其他必要的dll库

四、QT使用msvc64位编译器测试


一、安装MSYS2

1.下载安装

https://www.msys2.org/

注意

使用国外浏览器下载速度可能会很慢,例如谷歌浏览器,微软浏览器等;

推荐使用国内浏览器下载,例如搜狗浏览器等,速度会稍微快一些!!!

下载完成后直接双击安装即可!!

2.配置

进入自己的安装路径,打开 msys2_shell.cmd 文件

打开文件后,搜索 MSYS2_PATH_TYPE ,找到如下图这一行内容,删掉前面的rem即可。

3.修改源

进入路径 etc\pacman.d,打开如下三个文件

①.在mirrorlist.mingw32文件的最上方加入如下源

Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686/

②.在mirrorlist.mingw64文件的最上方加入如下源

Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/

③.在mirrorlist.msys文件的最上方加入如下源

Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch/
Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/

4.测试与更新

打开命令提示符窗口,进入msys2自己的安装路径

#如果想要打开64的窗口
msys2_shell.cmd -mingw64

#如果想要打开32的窗口
msys2_shell.cmd -mingw32

#如果想要打开msys2的msys的窗口
msys2_shell.cmd

因为本教程使用的是64位,所以在输入命令 msys2_shell.cmd -mingw64 打开的窗口中,输入如下命令进行更新:

pacman -Sy

二、安装其他必要工具

1.安装MinGW-w64

更新完毕后,继续输入命令:

pacman -S mingw-w64-x86_64-toolchain

安装MinGW-w64编译工具。

默认安装全部即可,输入命令后按下回车,会出现安装选项,再次按下回车即可,然后输入Y进行安装,最后等待安装完成即可。

2.安装git

安装完成后,继续输入命令:

pacman -S git

3..安装make等工具

依次执行如下命令进行安装:

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

4.编译前的其他准备工作

①.重命名link.exe

继续在msys窗口输入命令进入路径 D:\msys64\usr\bin (相应找到自己的安装路径)

cd D:
cd /usr/bin/
mv link.exe link.bak

如果窗口已被关闭可以通过如下命令重新打开:

# cmd 进入命题提示符窗口输入如下命令进入msys2窗口
D:
cd D:\msys64
msys2_shell.cmd -mingw64

②.下载和安装YASM

pacman -S nasm
pacman -S yasm

③.安装Visual Studio

自行网上下载安装,我这里是安装了vs2017的;

注意,安装时,需要选择安装msvc64位的编译器!!!

安装成功后,添加环境变量

④.检查

重启电脑!!!

可以输入命令 which cl link yasm cpp 检查 cl link yasm cpp 编译工具是否正常;

注意,如果有出现 which: no cpp in ... 那么就说明没有找到cpp,cpp没有装好;

which: no cl in ... 那么就说明vs环境变量没有配置好导致的。(配置好后需要电脑重启才会生效)

5.下载和编译 x264

进入自己的home路径,新建ffmpeg文件夹

然后输入命令下载x264。可能需要你输入账号密码,自己去GitHub注册即可。

git clone http://git.videolan.org/git/x264.git

cd x264

然后进入下载好的x264文件夹执行如下命令进行编译:(注意替换自己的路径)

# 如需生成dll库,需要加上  --enable-shared
./configure --prefix=/home/17634/ffmpeg/build/libx264 --host=x86_64-w64-mingw32 --enable-static --extra-ldflags=-Wl,--output-def=libx264.def

make

make install

注意:
执行完如上命令后是没有生成libx264.lib的,需要手动生成;

首先执行完 configure 命令后,会生成 libx264.def 文件,将其拷贝到  /home/17634/ffmpeg/build/libx264/lib (修改自己的路径)

然后进入该路径,执行命令 lib /machine:x64 /def:libx264.def 即可,如下:

cp libx264.def /home/17634/ffmpeg/build/libx264/lib/
cd /home/17634/ffmpeg/build/libx264/lib/

# 生成64位lib使用
lib /machine:x64 /def:libx264.def

# 生成32位lib使用
#lib /machine:i386 /def:libx264.def

6.下载和编译 fdk-aac

在ffmpeg文件下,输入命令下载和编译fdk-aac

git clone --depth 1 https://gitee.com/mirrors/fdk-aac.git

cd fdk-aac
./autogen.sh
./configure --prefix=/home/17634/ffmpeg/build/libfdk-aac --enable-static --enable-shared
make -j4
make install

# 有问题的话,可以 make clean 后继续

7.下载和编译 mp3

在ffmpeg文件下,输入命令下载和编译md3

git clone --depth 1 https://gitee.com/hqiu/lame.git

cd lame
./configure --prefix=/home/17634/ffmpeg/build/libmp3lame --disable-shared --disable-frontend --enable-static
make -j4
make install

# 有问题的话,可以 make clean 后继续

8.下载和编译 libvpx

在ffmpeg文件下,输入命令下载libvpx

git clone --depth 1 https://github.com/webmproject/libvpx.git

cd libvpx
./configure --prefix=/home/17634/ffmpeg/build/libvpx --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make -j4
make install

# 有问题的话,可以 make clean 后继续

三、下载和编译 ffmpeg

1.下载

git clone git://source.ffmpeg.org/ffmpeg.git
# 或者
git clone https://gitee.com/mirrors/ffmpeg.git

# 查看版本
git branch -a
# 选择4.2版本
git checkout remotes/origin/release/4.2

注意,可以根据自己需要切换版本, 这里切换为4.2的版本

2.编译

手动进入ffmpeg文件夹,新建文件 build_ffmpeg.sh,然后拷贝如下命令到文件中(注意替换自己的路径)

./configure \
    --prefix=/home/17634/ffmpeg/build/ffmpeg-4.2 \
    --arch=x86_64 \
    --enable-shared \
    --enable-gpl \
    --enable-libfdk-aac \
    --enable-nonfree \
    --enable-libvpx \
    --enable-libx264 \
    --enable-libmp3lame \
    --extra-cflags="-I/home/17634/ffmpeg/build/libfdk-aac/include" \
    --extra-ldflags="-L/home/17634/ffmpeg/build/libfdk-aac/lib" \
    --extra-cflags="-I/home/17634/ffmpeg/build/libvpx/include" \
    --extra-ldflags="-L/home/17634/ffmpeg/build/libvpx/lib" \
    --extra-cflags="-I/home/17634/ffmpeg/build/libx264/include" \
    --extra-ldflags="-L/home/17634/ffmpeg/build/libx264/lib" \
    --extra-cflags="-I/home/17634/ffmpeg/build/libmp3lame/include" \
    --extra-ldflags="-L/home/17634/ffmpeg/build/libmp3lame/lib"

然后进入路径后执行脚本编译即可

cd /home/17634/ffmpeg/ffmpeg/
sh build_ffmpeg.sh
make -j4
make install

注意:

如果在执行脚本中出现如下报错

①.有可能是 pkg-config 没有成功被安装,在上面找到安装命令重新安装一遍;

②.需要给他设置环境变量,通过如下命令(替换自己的路径);

 export PKG_CONFIG_PATH=/home/17634/ffmpeg/build/libx264/lib/pkgconfig:$PKG_CONFIG_PATH

(或者说还遇到别的什么问题,可根据错误提示自行百度解决!)

3.测试

手动进入路径 cd /home/17634/ffmpeg/build/ffmpeg-4.2/bin/ 

手动拷贝一个视频到此路径中,然后使用 ffplay.exe 进行播放测试即可

4.添加其他必要的dll库

双击 ffmpeg.exe 或者 ffplay.exe 或者 ffprobe.exe ,会出现异常报错提醒

然后下载一个 Everything 应用程序,全局搜索缺少的库 libfdk-aac-2.dll

拷贝我们自己编译的,将其拷贝到build/ffmpeg-4.2/bin/ 路径下;

然后点击确定,如果还有报错,则根据报错提示,继续查找相应的dll库,继续拷贝到build/ffmpeg-4.2/bin/ 路径下,直到双击 ffmpeg.exe 或者 ffplay.exe 或者 ffprobe.exe 任一程序不再有报错为止。

注意:一般选择我们自行编译的库和msys64\mingw64\bin路径的库!

四、QT使用msvc64位编译器测试

新建QT项目时,选择MSVC64bit编译器

然后把自己编译的整个ffmpeg文件夹拷贝到QT工程路径下

然后双击打开.pro文件,添加头文件路径和路径

INCLUDEPATH += \
            $$PWD/ffmpeg-4.2/include

LIBS += $$PWD/ffmpeg-4.2/bin/avformat.lib       \
        $$PWD/ffmpeg-4.2/bin/avcodec.lib        \
        $$PWD/ffmpeg-4.2/bin/avdevice.lib       \
        $$PWD/ffmpeg-4.2/bin/avfilter.lib       \
        $$PWD/ffmpeg-4.2/bin/avutil.lib         \
        $$PWD/ffmpeg-4.2/bin/swresample.lib     \
        $$PWD/ffmpeg-4.2/bin/swscale.lib

最后在main.cpp添加头文件和测试代码验证即可

extern "C" {
#include "libavutil/avutil.h"
}

// 打印版本信息
qDebug() << "Hello FFmpeg :" << av_version_info();

注意:如果不使用 extern "C" { } 包裹头文件,会报错的,因为ffmepg是使用C语言编写的,所以需要指明是C语言头文件。

新建纯C++项目也是需要extern "C" { } 包裹;但是纯C语言项目不需要!

如果无法运行,那么需要将ffmpeg/bin路径的所有dll库拷贝到debug文件夹下,或debug文件夹的上一层路径即可。

如果有报错头文件找不到,将图片中框住的文件删除掉,再次编译可能就不会报错了!

完!

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

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

相关文章

ADC的原理

一、介绍 模数转换&#xff0c;即Analog-to-Digital Converter&#xff0c;常称ADC&#xff0c;是指将连续变量的模拟信号转换为离散的数字信号的器件&#xff0c;比如将模温度感器产生的电信号转为控制芯片能处理的数字信号0101&#xff0c;这样ADC就建立了模拟世界的传感器和…

tomcat服务器控制台乱码(超简单,其中一种方式)

一、问题 为解决前&#xff1a; 是这样子&#xff0c;控制台中文乱码 解决后&#xff1a; 二、解决 在tomcat的安装目录下&#xff0c;找到conf ---》logging.properties 点击去进行编辑 重点&#xff01;&#xff01;&#xff01; 编辑完之后&#xff0c;保存 如何返回到…

文献阅读9.29

目录 基于物理的神经网络在河流淤积模拟中的应用 文献摘要 讨论|结论 理论介绍 PINN 实验方程 Ansys中的数学模型 实验设置 基于物理的神经网络在河流淤积模拟中的应用 文献摘要 本文从水动力学和污染物运移动力学的基本原理出发&#xff0c;全面探讨了用于研究泥沙淤…

六、动画系统

一、动画事件 在此处实现&#xff1a;动画播放至此处&#xff0c;人物角色移动 1、添加动画事件 选择对应的动画 右键动画部分&#xff0c;选择添加动画事件 在人物身上挂载了对应的动画系统&#xff0c;需要在代码中&#xff0c;设置一个函数&#xff0c;作为动画事件 执行…

【ADC】使用仪表放大器驱动 SAR 型 ADC 时的输入输出范围

概述 本文学习于TI 高精度实验室课程&#xff0c;介绍使用仪表放大器时 SAR ADC 驱动放大器的注意事项。具体包括&#xff1a;介绍如何使用仪表放大器设计数据转换器驱动电路。 仪表放大器&#xff08;Instrumentation Amplifier&#xff0c;下文简称 INA&#xff09;可抑制输…

自定义knife4j访问路径

文章目录 本文档只是为了留档方便以后工作运维&#xff0c;或者给同事分享文档内容比较简陋命令也不是特别全&#xff0c;不适合小白观看&#xff0c;如有不懂可以私信&#xff0c;上班期间都是在得 原由&#xff0c;嫌弃doc.html 太大众 直接重定向&#xff0c;直接上代码了 p…

【Linux】Linux内核结构基础

Linux内核结构基础 一、Linux内核结构介绍二、Linux内核结构☆ Linux内核结构框图Linux系统架构 三、认识驱动为什么学驱动文件名与设备号open函数过程实例详解 四、shellshell脚本 参考博文&#xff1a; 【Linux】内核结构&#xff08;全&#xff09;linux内核结构介绍&#…

理解Python闭包概念

闭包并不只是一个python中的概念&#xff0c;在函数式编程语言中应用较为广泛。理解python中的闭包一方面是能够正确的使用闭包&#xff0c;另一方面可以好好体会和思考闭包的设计思想。 1.概念介绍 首先看一下维基上对闭包的解释&#xff1a; 在计算机科学中&#xff0c;闭包…

【动态规划-分组背包】【hard】力扣2218. 从栈中取出 K 个硬币的最大面值和

一张桌子上总共有 n 个硬币 栈 。每个栈有 正整数 个带面值的硬币。 每一次操作中&#xff0c;你可以从任意一个栈的 顶部 取出 1 个硬币&#xff0c;从栈中移除它&#xff0c;并放入你的钱包里。 给你一个列表 piles &#xff0c;其中 piles[i] 是一个整数数组&#xff0c;分…

OpenEuler虚拟机安装保姆级教程 | 附可视化界面

0x00 系统介绍 在 2019 年 7 月 19 日&#xff0c;华为宣布要在年底正式开源 openEuler 操作系统&#xff1b;在半年后的 12 月 31 日&#xff0c;华为正式开源了 openEuler 操作系统&#xff0c;邀请社区开发者共同来贡献。 一年后&#xff0c;截止到 2020 年12 月 25日&…

注册中心Eureka

Eureka 文章目录 前言一、Eureka是什么&#xff1f;二、使用步骤1.搭建一个SpringCloud项目2.启动类上增加注解 EnableEurekaServer3.启动项目 访问 配置文件里定义的端口号4.启动成功访问 localhost:70005.以同样的方式创建子项目 eureka-client-xx 作为 服务客户端 然后向eur…

实用SQL小总结

WHERE 条件 column 为纯英文字符 或 不包含任何字符 语法&#xff1a; SELECT * FROM your_table WHERE REGEXP(your_column,^[A-Za-z]$); SELECT * FROM your_table WHERE NOT REGEXP(your_column,^[A-Za-z]$);例&#xff1a; SELECT DISTINCT t.pldlibho FROM kibb_pldlyw…

gRPC基础讲解

一、gRPC原理 1、什么是RPC RPC 即远程过程调用协议&#xff08;Remote Procedure Call Protocol&#xff09;&#xff0c;可以让我们像调用本地函数一样发起远程调用。RPC 凭借其强大的治理功能&#xff0c;成为解决分布式系统通信问题的一大利器。 gRPC是一个现代的、高性能…

电路学习——反激电源(2024.09.29)

参考链接1: XXX 在此感谢各位前辈大佬的总结&#xff0c;写这个只是为了记录学习大佬资料的过程&#xff0c;内容基本都是搬运的大佬博客&#xff0c;觉着有用自己搞过来自己记一下&#xff0c;如果有大佬觉着我搬过来不好&#xff0c;联系我删。 电路学习——反激电源&#xf…

基于大数据的高校新生数据可视化分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

生信科研,教授(优青)团队一站式指导:高通量测序技术--农业植物基因组分析、组蛋白甲基化修饰、DNA亲和纯化测序、赖氨酸甲基化

组蛋白甲基化修饰工具(H3K4me3 ChIP-seq) 组蛋白甲基化类型也有很多种&#xff0c;包括赖氨酸甲基化位点H3K4、H3K9、H3K27、H3K36、H3K79和H4K20等。组蛋白H3第4位赖氨酸的甲基化修饰(H3K4)在进化上高度保守&#xff0c;是被研究最多的组蛋白修饰之一。 DNA亲和纯化测序 DNA亲…

QT设计中文输入法软键盘DLL给到C#开发步骤

开发目的&#xff1a;本文提供解决触摸屏C#程序中无法输入中文问题&#xff0c;中文拼音采用开源的谷歌输入法程序、使用QT编译中文输入法界面和中文输入法接口给到C#使用。 开发步骤&#xff1a; 1、QT中设计字母和字符输入界面 2、QT中设计数字输入界面 3、QT中封装调用谷歌…

神秘“蓝莓“模型横空出世:AI文生图界的新霸主还是营销噱头?

Ai 智能办公利器 - Ai-321.com AI文生图领域近日风起云涌&#xff0c;“蓝莓”模型横空出世&#xff0c;迅速占领行业制高点&#xff0c;成为万众瞩目的焦点。这个神秘而强大的模型&#xff0c;在众多AI竞技高手中脱颖而出&#xff0c;一举超越了OpenAI的“草莓”、Flux.1等强…

基于springboot+小程序的儿童预防接种预约管理系统(疫苗1)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本儿童预防接种预约微信小程序可以实现管理员和用户。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;儿童信息管理&#xff0c;疫苗信息管理&#xff0c;儿童接种管理&#x…

C++中的多态(详细讲解)

目录 一、多态的概念 1、多态的概念 二、多态的定义以及实现 1、多态的构成条件 2、虚函数 3、虚函数的重写 1&#xff09; 虚函数重写的理解 2&#xff09;虚函数重写的两个例外 1. 协变(基类与派生类虚函数返回值类型不同) 2. 析构函数的重写(基类与派生类析构函数的…