在Windows上使用 MSYS2 工具链编译ffmpeg源码

1. 使用 Mingw 编译器编译

1.1 编译工具链介绍

本文使用 MSYS2 UCRT64 工具链在 Windows 上编译 FFmpeg 源码,不使用
MSYS2 MINGW64,下面介绍一下 MINGW64UCRT64 的区别。

它们的核心区别在于使用的 C 语言运行时库不同,这直接影响了程序的兼容性、现代性和对C/C++新标准的支持。两者都使用MinGW编译器,但是使用不同的运行时库和工具链版本。

特性MSYS2 MINGW64环境MSYS2 UCRT64 环境核心影响
C 运行时库传统的 msvcrt.dll现代的 ucrtbase.dllUCRT64更现代、标准、一致
目标系统Windows 7 及更高版本Windows 10 及更高版本UCRT64放弃了旧版Windows支持
标准符合性支持到 C11/C++17,但部分特性受限完全支持 C11/C++17,计划支持C++20/23UCRT64对新语言标准支持更好
路径处理使用旧约定,可能混淆 / 和 \始终使用UTF-8编码,路径处理更清晰、无歧义UCRT64彻底解决了路径编码的“历史包袱”
许可与分发msvcrt.dll 与编译器绑定,分发复杂UCRT 是Windows系统组件,分发更简单UCRT64程序依赖系统自带组件,打包更简单
工具链前缀mingw-w64-x86_64-mingw-w64-ucrt-x86_64-安装包时需注意前缀匹配

1.2 编译过程

使用 MSYS2 UCRT64 工具链,需要打开 msys64/ucrt64.exe 工具。
msys 工具介绍可参见该文章 在Windows上编译Emacs源码

FFmpeg 功能强大,依赖许多多媒体库。在命令行中输入下面的命令,安装多媒体库。

# 基础多媒体库
pacman -S --needed mingw-w64-ucrt-x86_64-lame \
                    mingw-w64-ucrt-x86_64-x264 \
                    mingw-w64-ucrt-x86_64-x265 \
                    mingw-w64-ucrt-x86_64-libvpx \
                    mingw-w64-ucrt-x86_64-opus \
                    mingw-w64-ucrt-x86_64-fdk-aac \
                    mingw-w64-ucrt-x86_64-aom \
                    mingw-w64-ucrt-x86_64-sdl2

在源码目录下创建一个独立的构建目录 build,在 build 目录下运行 configure 进行编译配置,可以使得构建生成的中间文件与源码分离。
../ffmpeg-8.0.1/configure --prefix=/E/OpenSrcProj/ffmpeg/lib/msvc2019_64 --arch=x86_64 --target-os=mingw64 --toolchain=msvc --enable-shared --enable-static --enable-gpl --enable-version3 --enable-nonfree --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libvpx --enable-libopus --enable-libfdk-aac

mkdir build && cd build
../configure \
  --prefix=/usr/local/ffmpeg-custom \		# 指定 make install 时的安装目录
  --arch=x86_64 \							# 处理器架构(x86_64)
  --target-os=mingw64 \						# 必须设为 mingw64 以生成 Windows 原生程序
  --toolchain=msvc \  						# 注意:这里指使用msvc风格的链接器,编译器仍是gcc
  --enable-shared \							# 生成动态链接库(.dll)
  --enable-static \							# 生成静态链接库(.a)
  --enable-gpl \							# 启用 GPL 许可代码(如需 x264 等则必须)
  --enable-version3 \						
  --enable-nonfree \						# 启用非自由代码(如需 fdk-aac 等则必须)
  --enable-libmp3lame \						# --enable-lib*	启用已安装的第三方库支持。
  --enable-libx264 \
  --enable-libx265 \
  --enable-libvpx \
  --enable-libopus \
  --enable-libfdk-aac

如下图所示,打印配置报错,问题分析如下:
在这里插入图片描述

  1. 工具链错配:–toolchain=msvc 告诉 FFmpeg 去寻找并使用 Visual Studio 的 MSVC 编译器(cl.exe, link.exe)。但在 MSYS2 UCRT64 环境中,默认的、可用的编译器是 MinGW-w64 的 GCC。MSYS2 环境通常没有、也不直接兼容 MSVC 的命令行工具。

  2. 路径与环境:即便系统安装了 Visual Studio,其环境变量(如 PATH, INCLUDE, LIB)也没有在当前 MSYS2 UCRT64 终端中被激活,因此 cl.exe 要么找不到,要么因环境不完整而无法工作。

将上面的 --toolchain=msvc 移除,让configure自动使用MinGW的gcc。再次运行,报错如下图所示。因为 NASM 没有安装,或者版本太低。FFmpeg 依赖 NASM(Netwide Assembler) 编译关键的性能优化代码(x86 汇编部分)。
在这里插入图片描述
UCRT64 终端输入命令 pacman -S mingw-w64-ucrt-x86_64-nasm,安装 NASM 工具。
在这里插入图片描述
配置完成后,输入 make -j32 进行编译。
在这里插入图片描述
编译完成后,输入 make install 进行安装。
在这里插入图片描述

1.3 程序运行

编译完成后,执行./ffmpeg -version,显示版本信息及启用的编解码器列表。
在这里插入图片描述
类似的,在 Windows 上直接运行时提示缺少 zlib1.dll、libva.dll、libfdk-acc-2.dll、libiconv-2.dll库文件,需要将文件复制到 exe 文件所在目录。具体可参考该文章: 在Windows上编译Emacs源码

2. 使用 MSVC 编译器编译

打开 “x64 Native Tools Command Prompt for VS 2019” 后,以命令的方式启动 MSYS2 的 bash,使得 MSYS2 继承 VS 的配置。如下图所示:

# 打开 "x64 Native Tools Command Prompt for VS 2019" 后,在 VS 命令提示符中输入:
set MSYS2_PATH=D:\Software\msys64
set PATH=%MSYS2_PATH%\usr\bin;%PATH%
set MSYS2_PATH_TYPE=inherit
%MSYS2_USR_BIN%\bash.exe --login -i

在这里插入图片描述

然后对关键工具进行检查

# 检查编译器
which cl
# 应显示: /c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/版本/bin/Hostx64/x64/cl

# 检查链接器
which link
# 应显示类似路径

# 检查汇编器
which nasm
# 应显示: /usr/bin/nasm 或 /mingw64/bin/nasm

nasm -v
# 应显示版本号,如 NASM version 2.15.05

which make
# 应显示: /usr/bin/make

git --version
# 检查 git 是否可用

如下图所示,我这边提示找不到 nasm , 需要重新打开一个 MSYS2 MINGW64 终端,输入以下命令,安装下列工具。
pacman -Syu
pacman -S nasm yasm make pkg-config git
在这里插入图片描述
安装后就能找到 nasm 工具了。
在这里插入图片描述
进行配置时总是报错,原因定位到 configure 文件使用的是 GNU 风格的命令,MSVC 套件无法识别,目前我还未解决。
在这里插入图片描述
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值