• Windows下如何编译FFmpeg


      ffmpeg一般在linux环境中使用,但是我们目前很多的开发工具是windows,为了方便在windows下调试和使用ffmpeg,我们需要再windows下面编译和使用ffpeg,本文只讲述windows下如何编译ffmpeg的内容。
      windows下编译ffmpeg有很多的方法,本文主要用MSYS2的方式来编译。其本质就是模拟一个linux的命令环境,用来编译ffmpeg

    一、需要的软件下载

      在windows下编译ffmpeg,需要下载几个软件,我们将其下载在一个不带有中文名称的文件夹中。

    1、下载MSYS2

    官网下载地址:https://www.msys2.org/
    在这里插入图片描述

    2、下载FFmpeg源码

    ffmpeg官网上下载的源码好像不是最新的,后面编译的时候会报错,所以我们直接从github上下载5.1.2版本

    在这里插入图片描述

    3、下载x264源码

    官网下载地址:https://www.videolan.org/developers/x264.html
    在这里插入图片描述

    4、下载SDL源码(可选,在编译FFplay.exe时需要)

    官网下载地址:https://www.libsdl.org/
    在这里插入图片描述
    这里下载了2.26.3版本
    在这里插入图片描述

    将下载的软件解压放在一个没有中文名称和空格的文件夹中,以下是我的地址路径

    在这里插入图片描述

    二、安装MSYS2及编译工具链

    1、点击msys2-x86_64-20230718.exe并完成安装,完成后的工具如下:

    在这里插入图片描述

    2、修改C:\msys64\msys2_shell.cmd文件,将 rem set MSYS2_PATH_TYPE=inherit 修改成 set MSYS2_PATH_TYPE=inherit

    在这里插入图片描述

    3、启动MSYS2 MINGW64,依次输入以下命令行开始安装mingw64编译链和基本依赖

    • 更新环境
    pacman -Sy
    
    • 1

    如果出现 clang32: signature from “Christoph Reiter (MSYS2 development key) reiter.christoph@gmail.com” is invalid
    解决方法是输入以下命令,

     rm -r /etc/pacman.d/gnupg/
     pacman-key --init
     pacman-key --populate msys2
     curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz
     curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz.sig
     pacman -U --config <(echo) msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz
     pacman -Syu
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    最终结果:
    在这里插入图片描述

    • 安装基本依赖库
    pacman -S mingw-w64-x86_64-toolchain  # mingw64编译工具链,win下的gcc,用于编译64位的库
    pacman -S mingw-w64-i686-toolchain # 用于编译32位的库
    pacman -S base-devel    # 一些基本的编译工具
    pacman -S yasm nasm  gcc   # 汇编器
    pacman -S mingw64/mingw-w64-x86_64-SDL2  #SDL2 是ffmpeg依赖的,因为没有它ffpaly不能用
    
    • 1
    • 2
    • 3
    • 4
    • 5

    安装完毕后,可以输入gcc -v查看 gcc 版本:
    在这里插入图片描述

    3、添加环境变量

    最后需要添加环境变量。右击此电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 选择 Path (用户变量和系统变量都要)-> 编辑 -> 新建,添加编译工具链的路径:
    在这里插入图片描述
    注意如果 MSYS2 没有安装在 C 盘,或者使用的不是 MINGW64 的shell,那么这里需要改成对应的路径。添加环境变量这一步,是为了以后使用其他编辑器或者IDE时,能够找到 MINGW64 的编译工具链。在 MSYS2 中编译 ffmpeg 本身是不需要添加 Windows 的环境变量的。

    三、编译和安装

    1、新建FFmpeg-n5.1.2-install和x264-install两个文件夹,用来存放编译后安装的文件

    2、打开SDL源码中的sdl2-config文件

    在这里插入图片描述
    修改其中的prefix路径,具体路径根据你文件所在位置确定,不能直接复制文件资源管理器中的路径,需要修改为以下格式

    prefix=/d/worksoft/audioAndVideo/SDL2-2.26.3/x86_64-w64-mingw32
    
    • 1

    在这里插入图片描述

    3、打开FFmpeg源码目录中的configure文件

    在这里插入图片描述

    修改SDL2_CONFIG路径,规则同上

    SDL2_CONFIG="/d/worksoft/audioAndVideo/SDL2-2.26.3/x86_64-w64-mingw32/bin/sdl2-config"
    
    • 1

    在这里插入图片描述

    4、编译x264

    在放置文件的目录下新建build_x264.sh文件,内容如下:

    #!/bin/sh
    #进入执行脚本所在目录
    basepath=$(cd `dirname $0`;pwd)
    echo ${basepath}
     
    #进入h264源码目录
    cd ${basepath}/x264-master   # 根据路径名称自行修改
    pwd
    #配置编译参数
    ./configure --prefix=${basepath}/x264-install --enable-shared
    #开始8线程编译
    make -j8
    #将编译后的文件拷贝到--prefix参数配置目录
    make install
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在MSYS2 MINGW64中执行如下命令,等待x264编译完成

    cd /d/worksoft/audioAndVideo
    ./build_x264.sh
    
    • 1
    • 2

    编译完成后,在x264-install目录下就可以看到编译后的文件
    在这里插入图片描述

    5、编译ffmpeg

    在在放置文件的目录下新建build_ffmpeg.sh文件,内容如下:

    #!/bin/sh
    #进入执行脚本所在目录
    basepath=$(cd `dirname $0`;pwd)
    echo ${basepath}
    
    #进入ffmpeg源码目录
    cd ${basepath}/FFmpeg-n5.1.2  # 根据路径名称自行修改
    pwd
    #指定PKG_CONFIG_PATH变量,告知编译器x264库的路径
    export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:${basepath}/x264-install/lib/pkgconfig
    echo ${PKG_CONFIG_PATH}
    #配置编译参数
    ./configure --prefix=${basepath}/FFmpeg-n5.1.2-install \
    --enable-gpl \
    --enable-debug \
    --enable-libx264 \
    --disable-static \
    --enable-shared \
    --enable-sdl2 \
    --enable-ffplay \
    --enable-ffprobe \
    --enable-ffmpeg \
    --disable-vulkan \
    --disable-doc  \
    --disable-htmlpages  \
    --disable-manpages  \
    --disable-podpages  \
    --disable-txtpages \
    --extra-cflags=-l${basepath}/x264-install/include \
    --extra-ldflags=-L${basepath}/x264-install/lib
     
     
    #开始8线程编译
    make -j8
    #将编译后的文件拷贝到--prefix参数配置目录
    make install
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在MSYS2 MINGW64中执行如下命令,等待编译完成

    ./build_ffmpeg.sh
    
    • 1
    • 如果出现如下错误:
      在这里插入图片描述
      解决方案:
      修改FFmpeg-n5.1.2\libavcodec\x86\mathops.h文件的三个函数,修改对应的函数的内容如下:
    #define MULL MULL
    static av_always_inline av_const int MULL(int a, int b, unsigned shift)
    {
        int rt, dummy;
        if (__builtin_constant_p(shift))
        __asm__ (
            "imull %3               \n\t"
            "shrdl %4, %%edx, %%eax \n\t"
            :"=a"(rt), "=d"(dummy)
            :"a"(a), "rm"(b), "i"(shift & 0x1F)
        );
        else
            __asm__ (
                "imull %3               \n\t"
                "shrdl %4, %%edx, %%eax \n\t"
                :"=a"(rt), "=d"(dummy)
                :"a"(a), "rm"(b), "c"((uint8_t)shift)
            );
        return rt;
    }
    
    #define NEG_SSR32 NEG_SSR32
    static inline  int32_t NEG_SSR32( int32_t a, int8_t s){
        if (__builtin_constant_p(s))
        __asm__ ("sarl %1, %0\n\t"
             : "+r" (a)
             : "i" (-s & 0x1F)
        );
        else
            __asm__ ("sarl %1, %0\n\t"
                   : "+r" (a)
                   : "c" ((uint8_t)(-s))
            );
        return a;
    }
    
    #define NEG_USR32 NEG_USR32
    static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
        if (__builtin_constant_p(s))
        __asm__ ("shrl %1, %0\n\t"
             : "+r" (a)
             : "i" (-s & 0x1F)
        );
        else
            __asm__ ("shrl %1, %0\n\t"
                   : "+r" (a)
                   : "c" ((uint8_t)(-s))
            );
        return a;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    然后重新编译
    编译完成后的结果如下:
    在这里插入图片描述

    6、复制一份x264-install\bin下面的libx264-164.dll到FFmpeg-n5.1.2-install\bin下面,否则打开的时候会报找不到

    四、ffmpeg的Hello World程序

    在 ffmpeg 安装路径下,打开 share\ffmpeg\examples ,可以看到 ffmpeg 的示例程序,它们也可以在 ffmpeg 的在线 API 文档 中查看到。

    其中的 avio_reading.c 相当于 ffmpeg 的 Hello World,它会读取一个媒体文件的元数据信息并打印显示。
    另外建一个文件夹test_hello_world,将avio_reading.c复制过去,然后用在 MYSY2 中打开这个目录,使用 gcc 命令编译。
    命令如下:

    cd /d/worksoft/audioAndVideo/FFmpeg-n5.1.2-install/share/ffmpeg/examples
    mkdir test_hello_world
    cp avio_reading.c test_hello_world/
    
    cd test_hello_world
    gcc avio_reading.c -o test \
    -I"D:/worksoft/audioAndVideo/FFmpeg-n5.1.2-install/include/" \
    -L"D:/worksoft/audioAndVideo/FFmpeg-n5.1.2-install/bin/" \
    -lavcodec -lavformat -lavutil
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    编译完毕后,将在当前文件夹下生成可执行文件test.exe。
    在这里插入图片描述

    在 shell 中运行程序之前,需要将两个库的安装目录添加到环境变量 PATH (这是MSYS2 的环境变量,不是 Windows 系统的)。

    export PATH=$PATH:/d/worksoft/audioAndVideo/x264_install/bin:/d/worksoft/audioAndVideo/FFmpeg-n5.1.2-install/bin
    
    
    • 1
    • 2

    如果不执行export命令的话,那么运行test.exe时就无法链接到动态库,更令人困扰的是不会弹出任何提示,所以一定记得添加。当然如果你觉得每次打开都要运行太麻烦,也可以将这条命令添加到 你的安装位置/msys64/etc/profile 文件的末尾,这个文件和 Linux 下的/etc/profile文件作用是类似的。

    找一个视频文件,运行测试效果如下:
    在这里插入图片描述

    五、踩过的坑

    1、安装MSYS2的时候,如果执行了sed -i “s#mirror.msys2.org/#mirrors.ustc.edu.cn/msys2/#g” /etc/pacman.d/mirrorlist*,在执行pacman -Sy时会报错,还了各个ffmpeg版本无法解决

    2、从ffmpeg官网下载的文件源码内容和github上的不一样

    3、在编译ffmpeg的时候,如果不加

    –disable-doc
    –disable-htmlpages
    –disable-manpages
    –disable-podpages
    –disable-txtpages
    这几个,会在make install的时候报错,导致无法安装完成

    后记
      个人总结,欢迎转载、评论、批评指正


    参考资料:
    Windows下FFmpeg库编译安装指南
    ffmpeg库编译安装及入门指南(Windows篇)- 2022年底钜献

  • 相关阅读:
    C#范围运算符
    Python爬虫抓取经过JS加密的API数据的实现步骤
    双目视觉测量系统在不同纵向距离中测量精度比对实验
    外星人入侵游戏-(创新版)
    HBuilderx快捷键
    怎么批量删除WordPress自定义栏目?
    ceph高可用
    MySQL数据库UDF提权学习
    MySQL计算时间差
    云服务器部署Springboot项目
  • 原文地址:https://blog.csdn.net/u012559967/article/details/134035253