在windows下使用MSVC编译ffmpeg

article/2025/10/21 2:25:10

FFmpeg 在windows上面用msvc编译

首先你得准备好msys2环境,安装好对应的工具链,msys2他本身提供了三个环境,但是这次我们是用msvc去编译用哪个环境都无所谓,但是你在哪个环境装的工具链就进入到哪个环境,msys2是环境隔离的。然后下载好对应的ffmpeg源码,x264源码,x265源码,fdk-aac源码,openssl源码,openssl我是用的1.1.1的。还有最重要要安装vs

首先我们先进入到msys2环境里,但是要通过vs命令行工具打开命令行,因为这样才能访问 cl.exe 这个vc的编译器,以及一些编译套件比如 nmake 。也可以不用从vs命令行工具进入,只要把vs这些对应的工具配置到环境变量里也行,这里我们选择x64的命令工具进入,因为我们要编译 ffmpeg 64位库,如果要编译32位的就选择x86。

在这里插入图片描述

然后我们进入到安装好的msys2文件夹下面,找到一个msys2_shell.cmd的文件执行 msys2_shell.cmd -help 命令查看他的帮助文档,然后我们以 msys2_shell.cmd -defterm -full-path -no-start -here -mingw64 进入到msys2的环境里,这话代表的意思是 以默认终端,不打开新的新的命令行窗口(就是msys2提供的终端),然后继承当前环境的系统变量进入到当前目录,在mingw64的环境里 这里我说一句不是非得进入到mingw64的环境里,因为我们是用msvc的编译器去编译,用msys2是为了可以用他提供的linux的工具套件,以帮助我们编译ffmpeg,你的工具安装到哪个环境进入到哪个环境都行,如果我们是用mingw去编译ffmpeg的话,就要选择对应的环境去编译了,比如说你用clang去编译ffmpeg,就进入到clang的环境里,就像msys2为不同的环境提供了不同的类gcc的套件

在这里插入图片描述

然后我们就原地进入到了msys2环境里,然后我们验证一下环境变量有没有继承过来输入 cl.exe 我们就看到了msvc这个c++的编译器已经正常集成过来了。
在这里插入图片描述

编译x264

接下来我们编译 x264 进入x264源码目录,输入 configure -help 查看帮助,选择对应的选项,这里x264编译的时候他会默认选择 CC 这个编译器,这个编译器就是mingw64的编译器,但是我们要编译MSVC的,编写一个脚本,最重要的是 CC=cl 因为x264的编译选项没有提供CC的选项,这里我们就创建一个临时变量让CC=MSVC这个编译器,然后正常 make&&make install

OPTIONS="--enable-static --disable-cli"
BUILD_DIR="/home/X264msvc64"
CC=cl ./configure $OPTIONS --prefix=$BUILD_DIR/

编译x265

然后我们编译 x265 ,x265 是个cmake工程并且提供了各种环境编译的脚本,就更简单了,进入build目录,可以看到各种环境的脚本,我们现在实在msys2上编译msvc版本的x265,我们进入到 msys-cl 这个目录可以看到两个sh脚本一个是编译32位的,一个是64位,其实两个脚本没差别,只不过64的脚本会检查你的 cl.exe 是不是64的,如果不是会直接退出,这里会生成 nmake 然后用nmake工具去编译安装就行了,具体我已经写了注释。

#!/bin/sh
# This is to generate visual studio builds with required environment variables set in this shell, useful for ffmpeg integration
# Run this from within an MSYS bash shell
INSTALL_DIR="/home/x265Msvc64"if cl; thenecho
elseecho "please launch msys from 'visual studio command prompt'"exit 1
fi#选择使用生成nmake
#/W4 显示级别1、级别2和3级警告,并显示默认情况下不关闭的所有级别 4 (信息) 警告
#启用 /GR 时,编译器定义 _CPPRTTI 预处理器宏。 默认情况下, /GR 为打开状态。 /GR- 禁用运行时类型信息
#EH指定编译器生成的异常处理模型支持
#其余具体去查看微软文档
cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4" ../../sourceif [ -e Makefile ]; thennmake
fi

编译fdk-aac

然后我们编译 fdk-aac 进入到源码目录,因为fdk-aac2.0.2只给了automake生成makefile的部分文件,而没有直接给出可用的configue,所以我们需要生成 configure ,不过源码码录下面有个 sh 文件 ./autogen.sh ,执行一下就会生成更新 configure,然后我们 configure -h 查看帮助,除了上面的编译选项,它还告诉我们可以覆盖这些变量做对应处理,首先CC肯定是他的C编译器了,他的注释写的很清楚了,CFLAGS是他的编译选项,CXX是C++编译器,等等,我们可以覆盖这些变量对生成的makefile做修改。

在这里插入图片描述

OPTIONS="CC=cl CXX=cl --enable-static"
BUILD_DIR="/home/fdk-aacMsvc64"
./configure $OPTIONS --prefix=$BUILD_DIR/

这里给出对应的sh脚本,编译安装就生成对应的库文件了

编译openssl

首先我们先查看openssl文档,进入openssl源码目录,打开 INSTALL 文件,里面描述了在各个环境编译要注意的事项,这里我们编译 win 上的openssl,步骤很简单,用perl生成对应架构的nmake(makefile)文件,然后用nmake去编译。

在这里插入图片描述

但是这里我试了很多次都不成功,后来我查到是不同平台上的perl的路径,换行符那些不一样,要编译win版的openssl要安装win上面的perl,具体查看openssl文档 NOTES.PERL ,这里叫我们去安装ActiveState Perl,这样我们就能正常生成makefile了,然后执行 nmake test去测试,然后安装

在这里插入图片描述

#看你是什么平台,如果是IA64平台选择VC-WIN64I
#如果构建vc 使用ActiveState Perl,msys的perl不行
#具体看openssl文档
perl Configure VC-WIN64A --prefix=/home/local/opensslMsvc64
nmake && nmake test && nmake install

对应openssl脚本文件

编译ffmpeg

我们的前置工作终于做好了,终于可以编译ffmpeg了,我们进入到ffmpeg源码目录,查看configure -h帮助选项,这次ffmpeg提供了对应的编译器选项,这下更简单了

在这里插入图片描述

X264_INSTALL="/home/X264msvc64"
X265_INSTALL="/home/x265Msvc64"
aac_INSTALL="/home/fdk-aacMsvc64"
openssl_INSTALL="/home/opensslMsvc64"X264_LIB=$X264_INSTALL/lib
X265_LIB=$X265_INSTALL/lib
aac_LIB=$aac_INSTALL/lib
openssl_LIB=$openssl_INSTALL/lib#PKG_CONFIG_PATH是一个环境变量,它指定pkg-config将在其中搜索其.pc文件的其他路径,扩展pkg-config的默认搜索路径
export PKG_CONFIG_PATH=$X264_LIB/pkgconfig:$X265_LIB/pkgconfig:$aac_LIB/pkgconfig:$openssl_LIB/pkgconfig:$PKG_CONFIG_PATHecho $PKG_CONFIG_PATHBUILD_DIR="/home/ffmpeg4.x/ffmpegInstall"OPTIONS="--enable-shared--enable-libx264--enable-libx265--enable-libfdk-aac--enable-gpl--toolchain=msvc--enable-nonfree--cc=cl--cxx=cl--enable-openssl"#         --disable-programs 不构建命令行程序
#         --enable-gpl   //链接x264 x265需要同意这个协议
#         --enable-nonfree //链接fdk-aac需要同意这个协议
./configure $OPTIONS --prefix=$BUILD_DIR

这里给出脚本文件,openssl我是在win上编译的所以没有生成对应的.pc文件,这里手动编写一下,下面给出配置文件,替换成你安装openssl的路径。

prefix=D:/softwares/msys2/home/opensslMsvc64
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/includeName: GNU openssl
Description: openssl
#Requires:
Version: 1.1.1n
Libs: -L${libdir} -llibssl -llibcrypto
Cflags: -I${includedir}

这里还有个坑,如果你x264想静态链接到ffmpeg,找到ffmpeg源码目录在 libavcodec 文件夹下 libx264.c 文件修改代码,把这一行注释掉,不然ffmpeg默认是动态链接的,会报找不到对应函数的错误,如果你是动态链接x264,则不需要修改代码,正常编译就行。至于x265,我现在只能动态链接到ffmepg,静态链接会报找不到函数的问题,把libx265.c文件下面对应的 X265_API_IMPORTS 这个宏注释掉也不行,具体我现在也不知道怎么解决,希望大佬们有解决方法
在这里插入图片描述

这里还有一个问题,如果你要生成ffmpeg命令行工具,configure会在目录下面生成一个 config.h 的文件,打开这个文件会有msvc这个编译器生成的中文,这里原本是这样的,但是ffmpeg用到了这个宏,这里会乱码,会报语法错误,所以在make之前先手动把这一行替换为英文 “Microsoft®C/C++” ,内容随便,不产生乱码就行。

#define "用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.27.29111 版"

在这里插入图片描述


http://chatgpt.dhexx.cn/article/eoSjZl5K.shtml

相关文章

Qt Creator配置MSVC编译器

Qt Creator配置MSVC编译器 配置: WINDOWS 7系统4.9.0 Qt CreatorMSVC 2017VS 2017 步骤: VS官网下载Visual Studio Community 2017,在线安装Visual Studio Community2017版本。下载并安装Windows10 SDK, 直接下载.exe版本,然后…

MSVC命令行环境配置

MSVC是微软Windows平台Visual Studio自带的C/C编译器,但是这个IDE比较庞大,有时候我们写一个小程序没有必要去启动IDE,所以可以配置一下MSVC编译器,这样我们就可以通过命令行的方式或者其他一些轻量的工具接入MSVC编译器。 笔者演…

QtCreator配置MSVC

文章目录 1.配置编译器Compiler2.配置调试器(Debugger)3.配置构建套件(Kit) 配置Qt kits需要配置编译器和调试器 1.配置编译器Compiler 配置MSVC需要先下载vs,通过vs安装编译器 具体资料地址 https://www.zhihu.com/question/358058090/answer/1188440282 2.配置调试器(Deb…

Qt离线安装MSVC方法

安装好Qt后,有时候需要用到MSVC编译环境,如果电脑连接了互联网,直接下载安装器在线安装即可,那么需要为没有联网的电脑安装MSVC时,就需要采用下载离线安装包,离线安装的方法,MSVC安装器下载地址…

qt配置msvc

因为mingw是自带的,所以说不用配置直接勾选。但是mingw有一个不足就是有些库用mingw不方便比如opencv。而且web功能,mingw并不支持,今天谈怎么配置msvc。 1.下载vs:重点相关的c和sdk下载 2.下载qt5.14.2之后要自己编译,使用中科…

Qt MSVC开发

环境搭建 安装Virsual Studio,版本可以选择最新版本,我安装的时vs2022,安装时需要勾选 C 桌面开发 安装QT, 下载地址:https://download.qt.io/official_releases/online_installers/,安装时需要选择MSVC 2019 64-bit。…

MSVC编译器介绍

MSVC简介: 与Linux系列操作系统不同,Windows原生环境不提供类似gcc,Clang的C/C语言源程序编译运行工具链。运行在Windows上的IDE(集成开发环境),比如CodeBlocks之类,一般都使用MinGW&#xff0…

PAC的编码

PAC的编码 今晚的沙龙讲到了PAC,在此搬运一下比较简单易懂的部分。 PAC的编码是基于类似于两个D触发器的思路,也就是和时序有关。 PAC编码的思路导图,如下所示:

windows 开启pac,完成规则代理

特别鸣谢 10分钟搭建linux代理服务器_三雷科技的博客-CSDN博客 Windows7/10/11 Pac代理脚本及配置_pac脚本_ylf尘风的博客-CSDN博客 1. 代理服务器搭建 yum install tinyproxy代理服务器,配置 编辑配置/etc/tinyproxy/tinyproxy.conf: (1&…

解析PAK文件

工具好不好主要看用的人 ----Mantra 众所周知,UE4打包之后生成的资源文件被压缩成.pak格式,那么如何找到合适的工具提取其中的资源呢?(既然UE4是开源的,那么UE4的打包工具也应该是开源的,所以大佬们逆流而…

代理自动配置文件PAC的使用方法

注意: 1、微软从Internet Explorer(IE)11版本开始,已经弃用本地PAC文件的方式(也就是我们说的“file://”方式)配置自动代理了,只能通过http或者https方式加载代理自动配置的PAC文件 2、 Chrome…

pacp格式文件分析

1 介绍 1.1. 五元组 网络通信过程中会发送大量的请求,每一个请求都需要通过IP数据包进行交互,但是IP数据包的头部信息过于复杂,如果通过IP数据包头进行数据包之间的区分就太复杂了,所以就产生了元组。 五元组是元组中的一种&am…

【pac文件】win10自动配置代理

目的 手动代理:所有地址经过代理,指定ip不经过代理 现在需求:实现指定ip范围才使用该代理 可以通过“自动设置代理”的方式实现 准备 已有代理地址,如:192.168.18.101:808有python环境 自动代理配置 编写sxProxy.…

实战PyQt5: 120-像素图QPixmap和QBitmap

Qt提供了四个用于处理图像数据的类:QImage,QPixmap,QBitmap和QPicture。QImage是为I/O设计的,并且针对直接的像素访问和操作做了优化,QPixmap是为在屏幕上显示图像而设计和优化的。QBitmap为继承自QPixmap的便利类。如…

Qt实战案例(54)——利用QPixmap设计图片透明度

目录 一、项目介绍二、项目基本配置三、UI界面设置四、主程序实现4.1 widget.h头文件4.2 widget.cpp源文件 五、效果演示 一、项目介绍 本文介绍利用QPixmap设计图片透明度,可以看到拖动下方进度条,用于控制上方图片的透明度。 二、项目基本配置 新建…

利用QPixmap显示图片

我们来实现在窗口上显示图片,并将图片进行平移,缩放,旋转和扭曲。这里我是利用QPixmap类来实现图片显示的。 一、利用QPixmap显示图片。 1.将以前的工程文件夹进行复制备份,我们这里将工程文件夹改名为painter05。(经…

PyQt5基本控件详解之QPixmap(十九)

QPixmap 前言 QPixmap类用于绘图设备的图像显示,它可以作为一个QPainterDevice对象,也可以加载到一个控件中,通常是标签或者按钮,用于在标签或按钮上显示图像 QPixmap可以读取的图像文件类型有BMP,GIF,JP…

[PyQt5]基本控件9 - 图片显示QPixmap

文章目录 PyQt5系列文章效果图完整代码 PyQt5系列文章 基本控件---1.按钮QPushButton2.标签QLabel3.可编辑框QTextEdit4.文本提示QToolTip5.单行输入框QLineEdit6.消息框QMessageBox7.单选按钮QRadioButton8.下拉列表QComboBox9.图片显示QPixmap10.分组框QGroupBox11.进度条QP…

关于QPixmap/QImage/QPicture

Qt学习之路(29):绘图设备(2) 绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和 QPicture。其中,QPixmap专门为图像在屏幕上的显示做了优化&a…

QPixmap、QBitmap、QImage 與 QPicture

在處理影像資料上,Qt提供了QPixmap、QBitmap、QImage與QPicture等類別。 一. 几种类的简介 QPixmap繼承了QPaintDevice,您可用以建立QPaint er並於上進行繪圖,您也可以直接指定圖案載入Qt所支援的圖檔,像是BMP、GIF、JPG、JPEG、…