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

相关推荐
用户8055336980321 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner1 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript