当前位置: 首页 > news >正文

2.1 Windows VS2019编译FFmpeg 4.4.1

一、前期准备

在 Visual Studio 2019 中编译 x264、x265、fdk-aac、lame 和 FFmpeg 需要在 Windows 环境下搭建一个类 Linux 的编译环境,因为这些库主要在 Linux 下开发,源码与 MSVC++ 不完全兼容,基于 MSYS2 和 MinGW 的工具链,并结合 Visual Studio 2019 的编译器(cl.exe)。

1.1 VS2019安装

要安装的组件:

  • 使用C++的桌面开发
  • Visual Studio 扩展开发
  • 英语 语言包
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.2 MSYS2安装

下载地址:msys2-installer

启动MSYS2:

# 进入 mingw32环境
msys2_shell.cmd -mingw32# 进入 mingw64环境
msys2_shell.cmd -mingw64

更换国内源:

# 修改源文件
sed -i "s#mirror.msys2.org/#mirrors.ustc.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*# 更新源
pacman -Sy

参考地址:https://mirrors.ustc.edu.cn/help/msys2.html

继承终端的环境变量
在这里插入图片描述

使用VS2019的终端启动MSYS2(继承VS2019的变量):
在这里插入图片描述
在这里插入图片描述

1.3 安装基本工具

pacman -S --needed git make autoconf automake libtool pkgconf mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake mingw-w64-x86_64-nasm mingw-w64-x86_64-yasm

说明:

  • 核心工具

    • git:用于从 Git 仓库下载源码(如 git clone)。
    • make:用于处理 Makefile,执行编译和安装。
    • autoconf, automake, libtool:用于生成 autotools 构建脚本(如 x264、fdk-aac 和 lame 使用 autotools)。
    • pkgconf:处理 pkg-config 文件,方便 FFmpeg 找到依赖库的路径。
  • 汇编工具(用于 x264 和 x265 的汇编优化):

    • mingw-w64-x86_64-nasm:汇编器,用于编译 x264 和 x265 中的汇编代码(若启用优化)。
    • mingw-w64-x86_64-yasm:另一个汇编器,某些库可能需要(虽然 x264 更倾向于 nasm)。
  • CMake(用于 x265):

    • mingw-w64-x86_64-cmake:x265 使用 CMake 生成构建文件,MSYS2 的 CMake 通常用于 MinGW 环境。
  • 编译工具链mingw-w64-x86_64-toolchain):

    • 包含 gcc, g++, ar, ranlib 等工具,用于部分库的构建脚本或预处理步骤。
    • 编译有了VS2019,为什么还需要 mingw-w64-x86_64-toolchain?【主要为了兼容configure 脚本】

二、编译

所有源码下载:ffmpeg4.4.1源代码

将所有源码解压到msys2家目录下(避免盘符转义问题):
在这里插入图片描述

2.1 设置终端代理

临时设置

# 设置代理
export http_proxy="http://127.0.0.1:11819"
export https_proxy="http://127.0.0.1:11819"# 取消代理
unset http_proxy
unset https_proxy

永久设置

# 修改~/.bashrc配置文件
vim ~/.bashrcexport http_proxy="http://127.0.0.1:11819"
export https_proxy="http://127.0.0.1:11819"# 使环境变量生效
source ~/.bashrc

2.2 设置环境变量

env.sh文件内容:

export CC=cl
export CXX=cl
export LD=link
export AR=lib
export RC=rc
export STRIP=:
export CFLAGS="-O2 -nologo -MT"  # MT 静态运行时库
export CXXFLAGS="-O2 -nologo -MT"
export LDFLAGS="-nologo"

使环境变量生效

chmod +x env.sh
source env.sh

重命名cmake和link(避免与VS2019的冲突):

#  如果使用msys2的cmake,会生成不了NMAKE的构建系统
mv /usr/bin/cmake /usr/bin/cmake_bak# 要使用VS2019的link,否则容易在编译阶段失败
mv /usr/bin/link.exe /usr/bin/link.exe_bak

2.3 编译x264

# 下载源码
git clone https://code.videolan.org/videolan/x264.git# 配置
./configure \
--prefix=$(pwd)/../3rdparty_msvc \
--enable-static# 编译安装
make -j$(nproc) && make install

x264.pc文件内容(位置3rdparty_msvc\lib\pkgconfig\x264.pc):

prefix=/home/wujh/3rdparty_msvc
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/includeName: x264
Description: H.264 (MPEG4 AVC) encoder library
Version: 0.165.3222
Libs: -L${exec_prefix}/lib -lx264 
Libs.private: 
Cflags: -I${prefix}/include 

2.4 编译x265

# 下载源码
git clone https://bitbucket.org/multicoreware/x265_git.git# 配置(只编译静态库,而且设定运行时库为静态库)
mkdir tmp && cd tmp
cmake -G "NMake Makefiles" \
-DCMAKE_INSTALL_PREFIX=$(pwd)/../../3rdparty_msvc \
-DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc -MT" \
-DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4 -MT" \
-DCMAKE_BUILD_TYPE=Release \
-DSTATIC_LINK_CRT=ON \
-DENABLE_SHARED=OFF \
-DENABLE_CLI=OFF \
-DENABLE_TESTS=OFF \
../source# 编译安装
nmake && nmake install

说明:

  • -MT,明确指定静态 CRT,取代默认的动态 CRT(/MD)。
  • -DSTATIC_LINK_CRT=ON 强化静态 CRT 的使用,确保 x265 的所有对象文件使用 libcmt.lib 而非 msvcrt.lib。
  • -DENABLE_SHARED=OFF 确保只生成静态库 x265-static.lib,避免生成动态库 libx265.lib 和 x265.dll。
  • -DENABLE_CLI=OFF:禁用 x265 的命令行工具,减少依赖(如标准 I/O 函数可能引入的动态 CRT 符号)。
  • -DENABLE_TESTS=OFF:禁用测试程序,进一步简化构建。
  • -DWIN32 -D_WINDOWS -W4 -GR -EHsc 以确保与 Windows 环境的兼容性和编译器警告级别。

x265.pc文件内容(-lx265-static 强制链接静态库):

prefix=/home/wujh/3rdparty_msvc
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/includeName: x265
Description: H.265/HEVC video encoder
Version: 4.1
Libs: -L${libdir} -lx265-static
Libs.private: 
Cflags: -I${includedir}

2.5 编译fdk-aac

注意:2.0.1版提供了Makefile.vc编译文件,2.0.2版本没有提供。

# 下载源码
wget https://github.com/mstorsjo/fdk-aac/archive/refs/tags/v2.0.1.tar.gz# 编译
nmake -f Makefile.vc# 安装
nmake -f Makefile.vc install prefix=$(pwd)/../3rdparty_msvc# 清理
nmake -f Makefile.vc clean

fdk-aac.pc文件内容:

prefix=/home/wujh/3rdparty_msvc
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/includeName: Fraunhofer FDK AAC Codec Library
Description: AAC codec library
Version: 2.0.1
Libs: -L${libdir} -lfdk-aac
Cflags: -I${includedir}

2.6 编译lame

# 下载源码
wget https://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz# 编译64位的库  (默认时编译32位)
nmake -f Makefile.MSVC rebuild MSVCVER=Win64 MACHINE=/machine:x64 OFF=win64# 清理
nmake -f Makefile.MSVC clean

说明:

  • -f Makefile.MSVC 指定makefile文件
  • rebuild 包括clean all
  • MSVCVER=Win64 表示使用 64 位的 MSVC 编译器进行构建
  • MACHINE=/machine:x64 指示链接器和汇编器生成 64 位目标文件。
  • OFF=win64 指定汇编器的输出格式。

copy_dll.sh文本内容:

#!/bin/sh# Check if installation directory is provided
if [ -z "$1" ]; thenecho "Usage: $0 <install_dir>"exit 1
fiINSTALL_DIR="$1"# Check if output directory exists
if [ ! -d "output" ]; thenecho "Error: output directory not found."exit 1
fi# Create destination directories
mkdir -p "$INSTALL_DIR/bin"
mkdir -p "$INSTALL_DIR/lib"
mkdir -p "$INSTALL_DIR/include/lame"# Copy DLLs to bin
cp -v output/*.dll "$INSTALL_DIR/bin/" 2>/dev/null || echo "No DLL files to copy."
cp -v output/*.exe "$INSTALL_DIR/bin/" 2>/dev/null || echo "No exe files to copy."# Copy LIBs to lib, excluding libmp3lame-static.lib
cp -v output/*.lib "$INSTALL_DIR/lib/" 2>/dev/null || echo "No LIB files to copy."# Copy header files to include/lame
cp -v include/* "$INSTALL_DIR/include/lame/" 2>/dev/null || echo "No lame include to copy."

拷贝依赖库到指定目录(因为makefile中没有install指令):

chmod +x copy.sh
./copy_dll.sh $(pwd)/../3rdparty_msvc

将libmp3lame-static.lib重命名为mp3lame.lib:
在这里插入图片描述

2.7 编译ffmpeg

# 下载源码
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg-4.4.1
cd ffmpeg-4.4.1
git checkout n4.4.1# 设置.pc文件搜索路径
export PKG_CONFIG_PATH=$(pwd)/../3rdparty_msvc/lib/pkgconfig:$PKG_CONFIG_PATH# 配置
./configure \
--prefix=$(pwd)/../ffmpeg_build \
--toolchain=msvc \
--disable-everything \
--disable-programs \
--disable-shared \
--disable-doc \
--enable-muxer=mp4 \
--enable-protocol=file \
--enable-bsf=aac_adtstoasc \
--enable-gpl \
--enable-nonfree \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-libmp3lame \
--extra-cflags="-I$(pwd)/../3rdparty_msvc/include" \
--extra-ldflags="-LIBPATH:$(pwd)/../3rdparty_msvc/lib"# 编译安装
make -j$(nproc) && make install

三、vscode使用ffmpeg库

项目目录结构:

./
├── 3rd # 第三方依赖库
│   └── ffmpeg_4.4.1 
│       ├── include   # 头文件
│       ├── lib       # 静态库库
│       └── share
├── CMakeLists.txt    # cmake配置文件
└── src               # 源码文件└── main.c

main.c文件内容:

#include <stdio.h>
#include "libavcodec/avcodec.h"
#include "libavdevice/avdevice.h"
#include "libavfilter/avfilter.h"
#include "libavformat/avformat.h"
int main()
{printf("avcodec version is %u \n",avcodec_version());printf("avdevice version is %u \n",avdevice_version());printf("avfilter version is %u \n",avfilter_version());printf("avformat version is %u \n",avformat_version());return 0;
}

CMakeLists.txt文件内容:

cmake_minimum_required(VERSION 3.10)
project(ffmpeg_test VERSION 1.0)set(CXX_STANDARD 11)
set(CXX_STANDARD_REQUIRED True)set(FFMPEG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rd/ffmpeg_4.4.1)
include_directories(${FFMPEG_DIR}/include)
set(FFMPEG_LIBS${FFMPEG_DIR}/lib/libavutil.a${FFMPEG_DIR}/lib/libswresample.a${FFMPEG_DIR}/lib/libswscale.a${FFMPEG_DIR}/lib/libavcodec.a${FFMPEG_DIR}/lib/libavformat.a${FFMPEG_DIR}/lib/libavfilter.a${FFMPEG_DIR}/lib/libavdevice.a${FFMPEG_DIR}/lib/libpostproc.a
)add_executable(${PROJECT_NAME} src/main.c)
target_link_options(${PROJECT_NAME} PRIVATE "/NODEFAULTLIB:LIBCMT")
target_link_libraries(${PROJECT_NAME} PRIVATE ${FFMPEG_LIBS} ws2_32 user32 bcrypt)# /NODEFAULTLIB:LIBCMT 默认库 LIBCMT(MSVC静态运行时)与其他库冲突
# ws2_32    # Windows Socket基础库
# user32    # 用户基础库
# bcrypt    # Windows加密API

构建命令

# 生成构建系统(在项目根目录下执行)
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE --no-warn-unused-cli -S./ -B./build -G "Visual Studio 15 2017" -T host=x64 -A x64# 编译(在build目录下执行)
cmake --build . --config Release

相关文章:

  • PCL 生成圆柱面点云
  • 人工智能-准确率(Precision)、召回率(Recall) 和 F1 分数
  • YOLO优化之双池化下采样融合块、注意力引导逆残差块
  • 第20篇:数据库中间件的热点 Key 缓存一致性策略与分布式协调机制
  • Spring Boot 整合 Swagger 快速生成 API 文档的最佳实践
  • Axure应用交互设计:中继器数据向多种类型元件赋值
  • jxWebUI--简单易用的webUI库
  • Iceberg与Hive集成深度
  • linux多线程之条件变量
  • 学习昇腾开发的第三天--将服务器连接网络
  • Android 与 ESP-01 WIFI模块通信
  • HTTP协议简易入门
  • Vue3相关知识3
  • JS当中怎么定义一个类
  • Linux信号机制:进程异步通信的秘密
  • Kafka 可靠性保障:消息确认与事务机制(一)
  • XR-RokidAR-UXR3.0-Draggable 脚本解析
  • HTML的最基础入门知识,从零开始逐步讲解,适合为后续爬虫技术打基础:
  • 苏州SAP代理商:哲讯科技助力企业数字化转型
  • [python] 堆
  • 网站开发哪家公司比较好/电商怎么推广自己的产品
  • 张家港建设局官方网站/seochinazcom
  • 毕业论文引用网站数据怎么做脚注/东莞seo公司
  • 公司百度网站建设/培训方案怎么做
  • 做网站需要哪些费用/域名权重是什么意思
  • 鹤岗北京网站建设/软文范例300字