在MSYS2中使用MSVC编译FFmpeg V6.1.4并增加H.264编解码支持,核心是先编译x264库,再将其集成到FFmpeg中。以下是详细操作步骤:
一、环境准备与配置
1.1 基础软件安装
-
安装Visual Studio:确保已安装VS2019/2022,并包含"使用C++的桌面开发"组件
-
安装MSYS2 :从官网下载并安装至无空格路径(如
C:\msys64) -
修改MSYS2配置 :编辑
C:\msys64\msys2_shell.cmd,取消rem set MSYS2_PATH_TYPE=inherit的注释,使MSYS2继承VS环境变量
1.2 启动MSYS2环境
# 从VS x64 Native Tools Command Prompt启动MSYS2
cd C:\msys64
.\msys2_shell.cmd -mingw64 -use-full-path
1.3 安装编译工具链
# 更新包管理器
pacman -Syu
# 安装基础编译工具
pacman -S base-devel make diffutils pkg-config yasm nasm git
1.4 解决link.exe冲突
# 重命名MSYS2的link.exe,避免与MSVC冲突
mv /usr/bin/link.exe /usr/bin/link.exe.bak
二、编译x264库(H.264编码器)
2.1 下载x264源码
# 进入home目录
cd ~
# 克隆x264源码(或下载压缩包)
git clone https://code.videolan.org/videolan/x264.git
cd x264
2.2 创建编译脚本build_x264.sh
#!/bin/bash
# build_x264.sh
# 设置基础路径
BASE_PATH=$(pwd)
X264_SOURCE="$BASE_PATH/x264"
INSTALL_PATH="$BASE_PATH/x264_install"
# 进入源码目录
cd "$X264_SOURCE"
# 配置x264(使用MSVC编译器)
CC=cl ./configure \
--prefix="$INSTALL_PATH" \
--enable-shared \
--enable-static \
--disable-asm \ # MSVC不支持x264的汇编优化
--extra-cflags="-MT" # 静态运行时库
# 编译安装
make clean
make -j$(nproc)
make install
2.3 关键修改:x264.h适配MSVC
编译完成后,需修改x264_install/include/x264.h:
// 找到X264_API定义处,修改为:
#define X264_API
/* 注释掉原有定义
#ifdef X264_API_IMPORTS
# define X264_API X264_DLL_IMPORT
#else
# ifdef X264_API_EXPORTS
# define X264_API X264_DLL_EXPORT
# else
# define X264_API
# endif
#endif */
若不修改此文件,后续FFmpeg链接x264时会报错。
2.4 执行编译
# 赋予执行权限
chmod +x build_x264.sh
# 执行编译
./build_x264.sh
编译成功后,x264_install目录将包含include/x264.h和lib/x264.lib。
三、编译FFmpeg V6.1.4集成x264
3.1 下载FFmpeg源码
cd ~
# 下载FFmpeg 6.1.4
wget https://ffmpeg.org/releases/ffmpeg-6.1.4.tar.gz
tar -xzf ffmpeg-6.1.4.tar.gz
cd ffmpeg-6.1.4
3.2 创建编译脚本build_ffmpeg.sh
#!/bin/bash
# build_ffmpeg.sh
BASE_PATH=$(cd "$(dirname "$0")"; pwd)
X264_INSTALL="$BASE_PATH/../x264_install" # 假设x264_install在上级目录
cd "$BASE_PATH"
# 配置FFmpeg
./configure \
--prefix="$BASE_PATH/ffmpeg_install" \
--toolchain=msvc \
--arch=x86_64 \
--enable-x86asm \
--enable-cross-compile \
--enable-asm \
--enable-shared \
--disable-programs \
--enable-d3d11va \
--enable-dxva2 \
--disable-static
--enable-gpl \
--enable-encoder=libx264 \
--enable-decoder=h264 \
--enable-libx264 \
--extra-cflags="-I$X264_INSTALL/include -MT" \
--extra-ldflags="-LIBPATH:$X264_INSTALL/lib" \
--extra-libs="x264.lib" \
--pkg-config=pkg-config
# 编译安装
make clean
make -j$(nproc)
make install
3.3 关键配置说明
| 参数 | 作用 | 必要性 |
|---|---|---|
--toolchain=msvc |
指定MSVC编译器 | 必需 |
--enable-gpl |
启用GPL许可(x264要求) | 必需 |
--enable-libx264 |
链接外部x264库 | 必需 |
--extra-cflags="-I..." |
指定x264头文件路径 | 必需 |
--extra-ldflags="-LIBPATH:..." |
指定x264库路径 | 必需 |
--enable-asm |
汇编优化 | 建议 |
--enable-shared |
生成DLL动态库 | 可选 |
3.4 执行编译
chmod +x build_ffmpeg.sh
./build_ffmpeg.sh
四、验证编译结果
4.1 检查x264支持
# 进入安装目录
cd ffmpeg_install/bin
# 查看编码器列表
./ffmpeg.exe -encoders | findstr "264"
# 应显示:V..... libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
4.2 测试编码功能
# 使用x264编码测试
./ffmpeg.exe -i input.mp4 -c:v libx264 -preset medium -crf 23 output.mp4
五、常见问题解决
5.1 链接错误:未找到x264符号
问题 :编译FFmpeg时提示undefined reference to x264_encoder_open等错误。
解决:
-
确认
x264.h已按步骤2.3修改 -
检查
--extra-ldflags路径是否正确 -
确保x264编译为静态库(
--enable-static)
5.2 MSVC编译器警告
问题 :大量C4996警告('fopen': This function or variable may be unsafe)。
解决 :在--extra-cflags中添加:
--extra-cflags="-I$X264_INSTALL/include -MT -D_CRT_SECURE_NO_WARNINGS"
5.3 运行时缺少DLL
问题 :运行ffmpeg.exe提示缺少x264-164.dll。
解决 :将x264_install/bin/x264-164.dll复制到ffmpeg_install/bin/目录。
5.4 C compiler test filed

问题: C compiler test filed。
解决:build_ffmpeg.sh 中缺少 --enable-cross-compile 选项。或其他选项不适配。
5.5 doc编译失败

解决:不影响,需要的动态库已经编译出来了,直接使用make install 命令安装。
六、项目集成建议
6.1 Qt项目配置(.pro文件)
注意:添加库的路径需要根据自己需要修改。
# FFmpeg包含路径
INCLUDEPATH += $$PWD/../ffmpeg_install/include
DEPENDPATH += $$PWD/../ffmpeg_install/include
# 库文件路径(Debug/Release分别配置)
CONFIG(debug, debug|release) {
LIBS += -L$$PWD/../ffmpeg_install/lib/debug
} else {
LIBS += -L$$PWD/../ffmpeg_install/lib/release
}
# 链接库(按需添加)
LIBS += -lavcodec -lavformat -lavutil -lswscale -lswresample -lx264
# 运行时DLL复制
win32 {
debug {
QMAKE_POST_LINK += $$quote(copy /Y $$PWD/../ffmpeg_install/bin/*.dll $$OUT_PWD/debug$$escape_expand(\n\t))
}
release {
QMAKE_POST_LINK += $$quote(copy /Y $$PWD/../ffmpeg_install/bin/*.dll $$OUT_PWD/release$$escape_expand(\n\t))
}
}
如果是msvc的编译器增加方法如下:
INCLUDEPATH += $$PWD/../ffmpeg_install/include
# 链接 FFmpeg 库(MSVC)
LIBS += -L$$PWD/../ffmpeg_install/lib \
avcodec.lib \
avformat.lib \
avutil.lib \
swscale.lib
6.2 编译选项优化
如需Release版本,修改build_ffmpeg.sh:
# 将-MT改为-MD(动态运行时库)
--extra-cflags="-I$X264_INSTALL/include -MD -O2 -DNDEBUG"
# 移除调试选项
--disable-debug \
--enable-optimizations \
总结
通过以上步骤,你可以在MSYS2+MSVC环境下成功编译支持H.264编解码的FFmpeg V6.1.4。关键点:
-
环境继承:正确配置MSYS2继承VS环境变量
-
x264适配 :修改
x264.h以兼容MSVC链接器 -
工具链指定 :FFmpeg配置必须包含
--toolchain=msvc -
路径正确:确保x264头文件和库路径正确传递给FFmpeg