在Windows上基于MSYS2 UCRT64工具链编译ffmpeg源码

1. 使用的基本工具链介绍

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

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

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

2. 编译过程

使用 MSYS2 UCRT64 工具链,需要打开 msys64/ucrt64.exe 工具。

msys 工具介绍可参见该文章 在Windows上编译Emacs源码

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

bash 复制代码
# 基础多媒体库
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

bash 复制代码
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 进行安装。

3. 程序运行

编译完成后,执行./ffmpeg -version,显示版本信息及启用的编解码器列表。

类似的,在 Windows 上直接运行时提示缺少 zlib1.dll、libva.dll、libfdk-acc-2.dll、libiconv-2.dll库文件,需要将文件复制到 exe 文件所在目录。具体可参考该文章: 在Windows上编译Emacs源码

相关推荐
用户6135411460161 天前
IE9浏览器在Windows7 64位系统上的安装步骤(中文版)
windows
非凡ghost1 天前
NSMusicS(开源音乐播放器)
windows·学习·firefox·软件需求
Sahm5k1 天前
win10的恢复分区导致C盘无法扩展卷
windows·操作系统
seabirdssss1 天前
修改联想电脑的截图保存位置
windows·经验分享·笔记
问道飞鱼1 天前
【桌面应用开发】Windows 环境下 Dioxus 桌面应用开发环境搭建
windows·桌面应用·dioxus开发
hu55667981 天前
Windows XP原生支持并可以使用NTFS分区吗?支持GPT分区技术吗?三星N310老笔记本可以装什么系统。
windows
染指11101 天前
28.实现MDL驱动读写-Windows驱动
windows·驱动开发·驱动·mdl
专业开发者1 天前
开发者可从蓝牙 ® 低功耗音频(Bluetooth® LE Audio)中获得的 4 大功能
物联网·ffmpeg·音视频
dwp11471706071 天前
在Windows上基于MSYS2 MSVC工具链编译ffmpeg源码
windows·ffmpeg