Windows环境下编译ffmpeg 6.1源码--Virtual Studio + Msys2方式

环境准备

约定:源码全部放到sources下,目录结构说明

/d/java/ffmpeg    #工程工目录
├── build                #存放编译文件的目录,子目录为具体模块的构建目录
│   ├── fdk-aac
│   ├── ffmpeg
│   └── x264
├── installed         #模块的安装目录,各模块的安装文件(如:dll、so等)会存到此处
│   ├── bin
│   ├── include
│   ├── lib
│   └── share
└── sources           #源码目录,存放各模块源码
    ├── fdk-aac
    ├── ffmpeg
    └── x264

依赖工具安装

2.1 安装vs 2022

略过...

2.2 安装msys2

下载地址:MSYS2

安装:

选择好安装目录,默认是:C:\msys64

2.2.1 修改mysys配置
  1. 编辑msys2_shell.cmd脚本

找到 rem set MSYS2_PATH_TYPE=inherit所在的行,并将rem移除,最终如下

含义:msys使用windows的环境变量。

启动msys的命令:msys2_shell.cmd -use-full-path

2.2.2 更换msys为国内源

修改C:\msys64\etc\pacman.d中mirrorlist.mingw、mirrorlist.mingw32、mirrorlist.mingw64、mirrorlist.msys四个文件中的源,在## Primary下面添加清华大学的源

保存后启动msys。

2.2.3 安装msys中的依赖库
#pacman -Syu 一键安装和升级所有的库
pacman -Syu
#安装编译ffmpeg所需的包
pacman -S gcc
pacman -S make
pacman -S pkg-config
pacman -S diffutils
pacman -S yasm
pacman -S nasm
#//用于编码fda-aac时运行。/autogen.sh生成configure文件
pacman -S autoconf 
pacman -S automake
pacman -S libtool

#避免与msvc的link冲突
mv /usr/bin/link.exe /usr/bin/link.exe.bak

2.3 编译fdk-aac编码器

在msys环境下运行

  1. 下载源码

    cd /d/java/ffmpeg/sources
    git clone --depth 1 https://gitee.com/mirrors/fdk-aac.git

  2. 切换到编译目录

目录结构:

/d/java/ffmpeg
├── build
│   ├── fdk-aac
│   ├── ffmpeg
│   └── x264
├── installed
│   ├── bin
│   ├── include
│   ├── lib
│   └── share
└── sources
    ├── fdk-aac
    ├── ffmpeg
    └── x264

开始编译

cd ../build/fdk-aac
#此时所在目录:/d/java/ffmpeg/build/fdk-aac

#执行如下命令
#1. config
cmake ./../../sources/fdk-aac/ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./../../installed

# 2. build
cmake --build . --config Release

# 3. install
cmake --install . --config Release

编译成功,如下图所示:

参考文档

  1. cmake编译不同的版本

    cd debug
    cmake -DCMAKE_BUILD_TYPE=Debug ..
    cmake --build .
    cd ../release
    cmake -DCMAKE_BUILD_TYPE=Release ..
    cmake --build .

Step 12: Packaging Debug and Release --- CMake 3.29.0-rc4 Documentation

  1. cmake指定安装目录

    cmake --install . --config Release --prefix "/home/myuser/installdir"

Step 5: Installing and Testing --- CMake 3.29.0-rc4 Documentation

2.4 编译x264源码

  1. 打开x64 Native Tools Command Prompt for VS 2022的命令行工具
  1. 进入msys64的安装目录

    cd C:\msys64

  2. 执行msys2_shell.cmd脚本

    .\msys2_shell.cmd -use-full-path

  3. 下载源码

    #1. 进入到源码目录
    cd sources #执行后当前目录: /d/java/ffmpeg/sources
    #2. clone代码
    git clone --depth 1 https://code.videolan.org/videolan/x264.git

  4. 修改编译脚本内容

    cd sources/x264
    curl "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD" > config.guess
    sed -i 's/host_os = mingw/host_os = msys/' configure

  5. 配置与编译

    cd build
    mkdir x264
    cd x264 #执行后当前目录: /d/java/ffmpeg/build/x264

    CC=cl ./../../sources/x264/configure
    --prefix=./../../installed
    --enable-shared
    make -j 8
    make install
    mv ./../../installed/lib/libx264.dll.lib ./../../installed/lib/libx264.lib

2.5 编译安装sdl2(ffplay需要)

  1. 下载源码

    cd sources #执行后当前目录: /d/java/ffmpeg/sources
    git clone --depth 1 https://github.com/libsdl-org/SDL.git -b SDL2

  2. 编译&安装

    mkdir -p build/SDL
    cd build/SDL #执行后,当前目录:/d/java/ffmpeg/build/SDL
    #1.config
    cmake ./../../sources/SDL/
    -DCMAKE_BUILD_TYPE=Release
    -DBUILD_SHARED_LIBS=ON
    -DCMAKE_INSTALL_PREFIX=./../../installed
    #2. build
    cmake --build . --config Release --parallel

    3. install

    cmake --install . --config Release

  3. 安装完成

参考文档:

  1. SDL2/Installation - SDL Wiki

编译ffmpeg(msvc方式)

源码下载

安装与配置

  1. 打开x64 Native Tools Command Prompt for VS 2022的命令行工具

  2. 进入msys64的安装目录

    cd C:\msys64

  3. 执行msys2_shell.cmd脚本

    .\msys2_shell.cmd -use-full-path

执行后,会打开msys菜单命令行窗口

  1. 在msys中切换到ffmpeg存放编译产物的目录

    #切换到ffmpeg存放编译产物的目录
    cd /d/java/ffmpeg/build/ffmpeg

注:路径需要按Linux方式来设置

  1. 配置pkg-config

将x164、fdk-acc加到环境变量中,ffmpeg编译需要

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/d/java/ffmpeg/installed/lib/pkgconfig
export CC=cl

注:/d/java/ffmpeg/installed是第三方库的安装目录。

  1. 配置

配置用来设置编译器的类型以及参与编译的模块等

#此时所在目录:/d/java/ffmpeg/build/ffmpeg

export CC=cl
./../../sources/ffmpeg/configure \
    --prefix=./../../installed \
    --toolchain=msvc \
    --enable-cross-compile \
    --target-os=win64 \
    --arch=x86_64 \
    --enable-debug=3 \
    --enable-yasm \
    --enable-asm  \
    --enable-shared  \
    --enable-gpl \
    --enable-version3 \
    --enable-nonfree \
    --enable-libfdk-aac \
    --enable-libx264 \
    --enable-sdl2 \
    --extra-ldflags="-LIBPATH:./../../installed/lib/" \
    --extra-cflags="-I./../../installed/include/"
  1. 编译

    make -j 8

  2. 安装

    make install

注:可能出现以下错误:

  1. 错误1:

    fftools/opt_common.c(206): error C2065: "slib": 未声明的标识符
    fftools/opt_common.c(206): error C2296: "%": 非法,左操作数包含"char [138]"类型
    fftools/opt_common.c(206): error C2059: 语法错误:"数字上的错误后缀"
    fftools/opt_common.c(206): error C2059: 语法错误:"%"
    fftools/opt_common.c(206): error C2017: 非法的转义序列
    fftools/opt_common.c(206): error C2015: 常量中的字符太多
    fftools/opt_common.c(206): error C2001: 常量中有换行符
    fftools/opt_common.c(237): error C2143: 语法错误: 缺少")"(在""的前面)
    fftools/opt_common.c(237): error C2143: 语法错误: 缺少"{"(在"
    "的前面)
    fftools/opt_common.c(237): error C2059: 语法错误:")"
    fftools/opt_common.c(238): error C2054: 在"options"之后应输入"("
    fftools/opt_common.c(278): error C2143: 语法错误: 缺少")"(在""的前面)
    fftools/opt_common.c(278): error C2143: 语法错误: 缺少"{"(在"
    "的前面)

解决方案:

修改fftools/opt_common.c 源码文件, 将第 206 行注释掉,原因是 CC_IDENT 标识未定义引起的,如下所示:

static void print_program_info(int flags, int level)
{
    const char *indent = flags & INDENT? "  " : "";

    av_log(NULL, level, "%s version " FFMPEG_VERSION, program_name);
    if (flags & SHOW_COPYRIGHT)
        av_log(NULL, level, " Copyright (c) %d-%d the FFmpeg developers",
               program_birth_year, CONFIG_THIS_YEAR);
    av_log(NULL, level, "\n");
    //av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT);

    av_log(NULL, level, "%sconfiguration: " FFMPEG_CONFIGURATION "\n", indent);
}
  1. 错误2:

    fftools/ffprobe.c(378): warning C4267: "=": 从"size_t"转换到"int",可能丢失数据
    fftools/ffprobe.c(597): warning C4267: "函数": 从"size_t"转换到"int",可能丢失数据
    fftools/ffprobe.c(2423): warning C4267: "函数": 从"size_t"转换到"int",可能丢失数据
    fftools/ffprobe.c(2424): warning C4267: "函数": 从"size_t"转换到"int",可能丢失数据
    fftools/ffprobe.c(3624): error C2001: 常量中有换行符
    fftools/ffprobe.c(3625): error C2146: 语法错误: 缺少")"(在标识符"writer_print_string"的前面)
    fftools/ffprobe.c(3624): error C2198: "writer_print_string": 用于调用的参数太少
    make: *** [ffbuild/common.mak:81: fftools/ffprobe.o] Error 2

解决方案:

注释CC_IDENT所在的行,如下所示:

static void ffprobe_show_program_version(WriterContext *w)
{
    AVBPrint pbuf;
    av_bprint_init(&pbuf, 1, AV_BPRINT_SIZE_UNLIMITED);

    writer_print_section_header(w, NULL, SECTION_ID_PROGRAM_VERSION);
    print_str("version", FFMPEG_VERSION);
    print_fmt("copyright", "Copyright (c) %d-%d the FFmpeg developers",
              program_birth_year, CONFIG_THIS_YEAR);
    //print_str("compiler_ident", CC_IDENT);
    print_str("configuration", FFMPEG_CONFIGURATION);
    writer_print_section_footer(w);

    av_bprint_finalize(&pbuf, NULL);
}

修改后重新install即可。

configure 详细使用方式如下:

./configure --help

测试&运行

执行如下命令:

ffmpeg --help
相关推荐
躺不平的理查德37 分钟前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
我喜欢就喜欢1 小时前
基于qt vs下的视频播放
开发语言·qt·音视频
安步当歌2 小时前
【WebRTC】视频采集模块中各个类的简单分析
音视频·webrtc·视频编解码·video-codec
EasyGBS3 小时前
国标GB28181公网直播EasyGBS国标GB28181软件管理解决方案
大数据·网络·音视频·媒体·视频监控·gb28181
weixin_537590454 小时前
《C++ Primer Plus》中文版第二章习题
开发语言·c++·visual studio
Johnstons5 小时前
AnaTraf | 网络性能监控系统保障音视频质量的秘籍
网络·音视频·网络流量监控·网络流量分析·npmd
lrlianmengba5 小时前
推荐一款非常好用的视频编辑软件:Movavi Video Editor Plus
音视频
SZ1701102315 小时前
ffplay 实现视频流中音频的延迟
音视频·延迟
LNTON羚通7 小时前
CPU算法分析LiteAIServer视频智能分析平台视频智能分析:抖动、过亮与过暗检测技术
大数据·目标检测·音视频·视频监控
MediaTea8 小时前
Pr 视频过渡:沉浸式视频 - VR 光线
音视频·vr