Windows平台MSVC编译的FFmpeg库

在MSYS2中使用MSVC编译FFmpeg V6.1.4并增加H.264编解码支持,核心是先编译x264库,再将其集成到FFmpeg中。以下是详细操作步骤:

一、环境准备与配置

1.1 基础软件安装

  1. 安装Visual Studio:确保已安装VS2019/2022,并包含"使用C++的桌面开发"组件

  2. 安装MSYS2 :从官网下载并安装至无空格路径(如C:\msys64

  3. 修改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.hlib/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等错误。

解决

  1. 确认x264.h已按步骤2.3修改

  2. 检查--extra-ldflags路径是否正确

  3. 确保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。关键点

  1. 环境继承:正确配置MSYS2继承VS环境变量

  2. x264适配 :修改x264.h以兼容MSVC链接器

  3. 工具链指定 :FFmpeg配置必须包含--toolchain=msvc

  4. 路径正确:确保x264头文件和库路径正确传递给FFmpeg

相关推荐
冰暮流星2 小时前
javascript之dom查询操作2
开发语言·javascript·ecmascript
小陈工2 小时前
Python Web开发入门(九):权限管理与角色控制实战
服务器·开发语言·前端·数据库·python·安全·sqlite
孙华贵2 小时前
python编程怎么赚钱
开发语言·python
tryCbest2 小时前
Python之Falsk开发框架(第四篇)- Flask 知识总结与完整博客系统实战
开发语言·python·flask
观测云2 小时前
Python 应用实现 APM 自动注入(Kubernetes 篇)
开发语言·python·kubernetes
jinanwuhuaguo2 小时前
最新更新版本,OpenClaw v2026.4.2 深度解读剖析:Task Flow 重磅回归与安全架构的全面硬化
android·开发语言·人工智能·回归·kotlin·安全架构·openclaw
小陈工2 小时前
2026年4月3日技术资讯洞察:微服务理性回归、AI代码生成争议与开源安全新挑战
开发语言·数据库·人工智能·python·安全·微服务·回归
CesareCheung2 小时前
Python+Vue +K6接口性能压测平台搭建
开发语言·vue.js·python
王璐WL2 小时前
【C++】vector 在OJ中的使用
开发语言·c++