ffmpeg库编译安装及入门指南(Windows篇)- 2022年底钜献

Posted MidoQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg库编译安装及入门指南(Windows篇)- 2022年底钜献相关的知识,希望对你有一定的参考价值。

最近项目需要,使用了 ffmpeg 做摄像头视频采集和串流。这几天有点时间,打算把相关的一些知识记录分享一下。

在撰写本文时,我又在另外一台电脑上把 ffmpeg 重新安装了一遍,所以绝对真实靠谱!如果你觉得文章写得还不错,敬请点个赞支持一下,十分感谢~

ffmpeg 简介

ffmpeg是一套跨平台的,用于音视频录制、转换、流化等操作的完善的解决方案,它是业界最负盛名的开源音视频框架之一。许多软件都是基于ffmpeg开发的,如格式工厂、各种xx影音等。

ffmpeg 是一套开源库以及命令行工具的集合,用户既可以使用命令行直接对音视频进行操作(CLI),也可以调用其开源库进行个性化的功能开发(SDK)。

如果要在自己的程序中使用 ffmpeg ,那么使用它的 SDK 是最好的选择。当前 ffmpeg 包含以下几个库:

  • libavcodec : 编/解码
  • libavfilter : 帧级操作(如添加滤镜)
  • libavformat : 文件 I/O 和 封装/解封装
  • libavdevice : 设备视频文件的封装/解封装
  • libavutil : 通用工具集合
  • libswresample : 音频重采样、格式处理、混音等
  • libpostproc : 预处理
  • libswscale : 色彩处理和缩放

ffmpeg 库在 Windows 下的安装

这个项目大部分是在 Linux 开发板上做的,Windows 上占一小部分。虽然如此,在 Windows 上安装 ffmpeg 的步骤一点都没法省。

ffmpeg 目前不提供预编译的库文件,而是需要自己下载源码并编译。看网上说 Windows 下编译 ffmpeg 非常麻烦,我想应该是“找到好用的教程”比较麻烦。本文使用 MSYS2 来编译 ffmpeg ,许多问题可以迎刃而解!

环境准备

在 Windows 下,编译需要做的准备如下:

  • 安装并配置 MYSY2
  • 安装 git (可选)
  • ffmpeg 源码
  • x264 源码(可选)

本节只讲述 MSYS2 的安装和配置和源码的下载。git 可根据需要自行选择安装。

安装 MSYS2 及编译工具链

MSYS2 是 Windows 下的一组编译套件,它可以在 Windows 系统中模拟 Linux 下的编译环境,如使用 shell 运行命令、使用 pacman 安装软件包、使用 gcc (MinGW) 编译代码等。简单来说,使用 MSYS2 ,你可以通过在 Linux 下非常熟悉的各种命令,来编译 Windows 下的软件。

官网描述:It provides a native build environment, based on open source software, and makes you feel right at home when you are already comfortable with Linux.

MSYS2 的安装也非常省心,只需要到 MSYS2 官网 下载.exe安装包,管理员身份运行安装即可。

注意安装盘必须是NTFS,路径要全使用 ACSII 字符,不能有空格。建议就安装在默认位置,如果不想装在 C 盘,就直接改下盘符,装在其他盘的根目录。

安装完毕后,开始菜单里就会有下面的程序:

点击它们就会启动一个 shell 窗口,Just like on Linux ! 这个 shell 程序默认是 Mintty,类似 Linux 系统中的 bash shell。MSYS2 支持多个编译器工具链,它们的环境是独立的(可以去安装文件夹查看),这里选择启动 MINGW64 (如果你也是64位系统的话)。

首先为了提高下载速度,将下载源换成中科大的:

sed -i "s#mirror.msys2.org/#mirrors.ustc.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
pacman -Sy

然后安装mingw64编译链和基本的依赖:

pacman -S mingw-w64-x86_64-toolchain  # mingw64编译工具链,win下的gcc
pacman -S base-devel    # 一些基本的编译工具
pacman -S yasm nasm     # 汇编器

安装完毕后,可以输入gcc -v查看 gcc 版本:

最后需要添加环境变量。右击此电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 选择 Path (用户变量和系统变量都要)-> 编辑 -> 新建,添加编译工具链的路径:

注意如果 MSYS2 没有安装在 C 盘,或者使用的不是 MINGW64 的shell,那么这里需要改成对应的路径。

添加环境变量这一步,是为了以后使用其他编辑器或者IDE时,能够找到 MINGW64 的编译工具链。在 MSYS2 中编译 ffmpeg 本身是不需要添加 Windows 的环境变量的。

ffmpeg 源码下载

ffmpeg 官网 下载源码,目前最新的版本是 5.1.2 。注意不要下载成 executable files 了,那个是可以直接运行的 CLI 程序。

你也可以直接下载 snapshot 版本,不过我个人更愿意下载带版本数字的。试想两年之后,谁能知道你电脑里的 snapshot 是何年何月的 snapshot 呢?

三个 download 都可以,只是压缩包格式不一样:

下载后解压到一个好找的文件夹即可。

x264 源码下载

ffmpeg 提供了相当多的外部库支持,但是如果要使用的话需要自己编译外部库。因为项目需要用到视频编码,所以此处加入 x264 库。

libx264 由 VideoLAN 组织所发布,它是 H.264 的一套性能较好的软编码器实现(不包括解码器)。H.264 (AVC) 是当前较常用的视频编码,目前 H.264 的继任者 H.265 (HEVC) 也渐趋成熟, VideoLAN 也有一套实现 libx265 。不过 libx265 的编译方式与 libx264 有所区别,目前我还没仔细研究。

戳这里访问 x264 的官方页面

官方建议使用 git 下载源码(下载压缩包再解压应该也是一样的):

git clone https://code.videolan.org/videolan/x264.git

编译和安装

将所有源码放到同一文件夹下便于管理,我把它们都统一放在一个叫 ffmpeg 的文件夹下。然后再建立各自的 install 文件夹存储编译好的库(当然你也可以选择其他任何地方的文件夹)。

为了方便,将编译的命令写成脚本 build-x264.shbuild-ffmpeg.sh。当前文件夹的结构如下(源码文件夹名称被我修改过了):

编译 x264 库

build-x264.sh脚本内容如下:

#!/bin/sh
basepath=$(cd `dirname $0`;pwd)
echo $basepath

cd $basepath/x264-src   # 根据路径名称自行修改
pwd

./configure --prefix=$basepath/x264_install --enable-shared
make -j8
make install

注意第一行必须是 #!/bin/sh ,才能被 MSYS2 的 shell 识别为可执行脚本。(亲测在 MSYS2 中chmod命令没有效果)

这几条命令中最重要的就是./configure命令,它的参数会指导编译器应该如何编译代码。这里 --prefix 参数指定了编译好的库文件的安装路径,可以自己任意指定。 --enable-shared 代表编译动态库。如果你需要静态库,那么需要加入 -enable-static 参数。

此外,make 命令的-j参数是指并行编译的线程数,可以根据你的 CPU 核数自行确定。

可以在源码文件夹下,通过 ./configure --help 命令查看所有可选参数。

在 MSYS2 的 shell 中,打开源码所在文件夹,并执行脚本:

cd /d/repos/ffmpeg
./build-x264.sh

注意 MSYS2 中文件路径的写法,是以/d代表 D 盘,类似 Linux 的风格。

不出意外的话,等待片刻后就会在 x264_install 路径下看到编译好的库。其中 bin/libx264-164.dll 文件就是x264的动态库文件。

如果出现错误,可以先单独执行 .\\configure 命令,然后再执行 make ,逐步查找错误原因。

编译 ffmpeg 库

build-ffmpeg.sh脚本内容如下:

#!/bin/sh
basepath=$(cd `dirname $0`;pwd)
echo $basepath

cd $basepath/ffmpeg-5.1.2-src
pwd

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/d/repos/ffmpeg/x264_install/lib/pkgconfig
echo $PKG_CONFIG_PATH

./configure --prefix=$basepath/ffmpeg_5.2.1_install \\
--enable-gpl --enable-libx264 --disable-static --enable-shared \\
--extra-cflags=-l$basepath/x264_install/include --extra-ldflags=-L$basepath/x264_install/lib

make -j8
make install

使用的命令与libx264类似,也是先 configuremake 。如果需要添加 x264 支持的话,需要注意以下几点:

  • 加入 --enable-libx264 参数
  • 指定 PKG_CONFIG_PATH 变量,告知编译器 x264 库的路径
  • 指定 x264 库的头文件包含路径及动态库链接的路径

ffmpeg 可自定义的编译参数非常多,有需要可自行研究。

然后同样也是执行脚本即可:

cd /d/repos/ffmpeg
./build-ffmpeg.sh

ffmpeg 代码量较大,可能会编译比较久,多线程 make 可加快编译速度。我使用make -j8大约花了七八分钟。

编译完成后,就可以在 ffmpeg_5.2.1_install 路径下看到库文件了。其中 bin 下的一堆 dll 就是动态库文件。

现在 ffmpeg 的 SDK 就任你调用了!下一节我们来试试调用 ffmpeg 编写程序。

ffmpeg 的 Hello World 程序

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

其中的 avio_reading.c 相当于 ffmpeg 的 Hello World,它会读取一个媒体文件的元数据信息并打印显示。

另外建一个文件夹,将avio_reading.c复制过去,然后用在 MYSY2 中打开这个目录,使用 gcc 命令编译。

gcc命令如下:

gcc avio_reading.c -o test \\
-I"D:/repos/ffmpeg/ffmpeg_5.2.1_install/include/" \\
-L"D:/repos/ffmpeg/ffmpeg_5.2.1_install/bin/" \\
-lavcodec -lavformat -lavutil

编译完毕后,将在当前文件夹下生成可执行文件test.exe

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

export PATH=$PATH:/d/repos/ffmpeg/x264_install/bin:/d/repos/ffmpeg/ffmpeg_5.2.1_install/bin

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

运行测试效果如下:

至此,我们迈出了使用 ffmpeg 库的第一步——也是一大步!

由于 gcc 的编译命令很长,重复手打很不方便,所以我一般会使用 vscode+cmake 的方式来做开发。不过这个配置又是较为麻烦的一件事,限于篇幅本文不再详述,感兴趣的读者可自行查阅资料。基本上只要注意把 gcc 的命令参数转换到 CmakeLists.txt 文件里,并注意终端的环境变量配置即可。

入门资料

ffmpeg 我也是最近才开始用,官方对 SDK 没有详细的入门教程,仅提供了 Doxygen 风格的 API 文档供查询。所以这里贴两个我觉得很好的入门帖,供与我一样刚刚入门的朋友参考。

首先是 Github 上的一篇tutorial:ffmpeg-libav-tutorial ,篇幅不长,读完可以对音视频有一个基本的认知。

然后是已故的音视频领域先驱雷霄骅(雷神)的博客 。需要注意的是现在的 ffmpeg 相比雷神当年使用的版本已经有了许多变化,使用雷神的源代码有时还需要修改。(斯人已逝,生者如斯!)

其他较为系统的参考资料我还没有找到,基本就是根据需要去百度or谷歌。有时 ffmpeg 官网也能派上一些用场,可以多翻翻。

后记

MSYS2 真是个好东西!

下一篇将讨论 ffmpeg 在 Linux 上的安装以及交叉编译的问题。

参考资料:
MSYS2中科大镜像源帮助
FFmpeg编译无坑版(Windows篇)

Windows环境下FFmpeg编译安装

简介

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证 。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、[Mac OS X](https://baike.baidu.com/item/Mac OS X/470629?fromModule=lemma_inlink)等。

用户既可以使用命令行直接对音视频进行操作(CLI),也可以调用其开源库进行个性化的功能开发(SDK)。

如果要在自己的程序中使用 ffmpeg ,那么使用它的 SDK 是最好的选择。当前 ffmpeg 包含以下几个库:

  • libavcodec : 编/解码
  • libavfilter : 帧级操作(如添加滤镜)
  • libavformat : 文件 I/O 和 封装/解封装
  • libavdevice : 设备视频文件的封装/解封装
  • libavutil : 通用工具集合
  • libswresample : 音频重采样、格式处理、混音等
  • libpostproc : 预处理
  • libswscale : 色彩处理和缩放

FFmpeg编译

为什么要编译它呢?

​ 由于ffmpeg 目前不提供预编译的库文件,而是需要自己下载源码并编译,而且可以自定义配置和优化,比直接下载预编译的二进制的版本更加灵活。

编译安装准备

在 Windows 下,编译需要做的准备如下:

  • 安装并配置 MYSY2
  • 安装 git (可选)
  • ffmpeg 源码

安装 MSYS2 及编译工具链

MSYS2 是 Windows 下的一组编译套件,它可以在 Windows 系统中模拟 Linux 下的编译环境,如使用 shell 运行命令、使用 pacman 安装软件包、使用 gcc (MinGW) 编译代码等。简单来说,使用 MSYS2 ,你可以通过在 Linux 下非常熟悉的各种命令,来编译 Windows 下的软件。

MSYS2 的安装也非常省心,只需要到 MSYS2 官网 下载.exe安装包,管理员身份运行安装即可。

注意安装盘必须是NTFS,路径要全使用 ACSII 字符,不能有空格。建议就安装在默认位置,如果不想装在 C 盘,就直接改下盘符,装在其他盘的根目录。

安装完毕后,开始菜单里就会有下面的程序:

点击它们就会启动一个 shell 窗口,Just like on Linux ! 这个 shell 程序默认是 Mintty,类似 Linux 系统中的 bash shell

MSYS2 支持多个编译器工具链,它们的环境是独立的(可以去安装文件夹查看),

在开始菜单打开MSYS2 MSYS,使用命令pacman -Syu升级所有库

在编译安装FFmpeg之前,先安装FFmpeg编译需要的依赖和工具

pacman -S mingw-w64-x86_64-toolchain  # mingw64编译工具链,win下的gcc
pacman -S base-devel    # 一些基本的编译工具
pacman -S yasm nasm     # 汇编器
pacman -S mingw-w64-x86_64-SDL2 # SDL2 是ffmpeg依赖的,因为没有它ffpaly不能用

安装完毕后,可以输入gcc -v查看 gcc 版本:

最后需要添加环境变量。右击此电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 选择 Path (用户变量和系统变量都要)-> 编辑 -> 新建,添加编译工具链的路径:

添加环境变量这一步,是为了以后使用其他编辑器或者IDE时,能够找到 MINGW64 的编译工具链。在 MSYS2 中编译 ffmpeg 本身是不需要添加 Windows 的环境变量的。

ffmpeg 源码下载

ffmpeg 官网 下载源码,目前最新的版本是 5.1.2 。注意不要下载成 executable files 了,那个是可以直接运行的 CLI 程序。

三个 download 都可以,只是压缩包格式不一样:

下载后解压到一个好找的文件夹即可。

在 MSYS2 的 shell 中,打开源码所在文件夹。

执行编译安装命令

我们编译安装ffmpeg选择使用mingw64终端 (如果你也是64位系统的话)。

  1. ./configure --prefix=/usr/local/ffmpeg --enable-shared --enable-sdl2 --disable-static

    括号中的值都是可选的。

    configure说明
     --prefix=/usr/local/ffmpeg        # 安装位置
     --enable-debug                    # 启动debug调试
     --enable-sdl2					   # 引入SDL2库,ffplay编译必须;
     --enable-static                   # 编译静态库(默认开启)
     --enable-shared                   # 编译动态库(默认关闭)
     --enable-libvpx                   # VP8/VP9 视频编码器
     --enable-libvmaf                  # VMAF视频质量评估工具
     --disable-x86asm                  # 未知
     --enable-gpl                      # 允许使用GPL(默认关闭)
     --enable-nonfree                  # 允许使用非免费的代码, 产生的库和二进制程序将是不可再发行的
     --enable-libx264                  # 启用H.264编码(默认关闭)
     --enable-libfdk-aac               # 使能aac编码(默认关闭)
     --disable-optimizations           # 禁用编译器优化
     --disable-asm                     # 禁用全部汇编程序优化
     --enable-librtmp                  # 使用librtmp拉流(默认关闭)
    

    更多详细说明可查询ffmpeg ./configure参数说明

  2. 编译:make -j 4

    4 表示编译需要用4个线程。

  3. 安装 sudo make install

这一步都安装完成了,在安装目录下的bin目录执行.\\ffmpeg.exe -version

设置环境变量

为了能够每次打开的时候,都能执行ffmpeg命令。在配置文件中末尾添加 export PATH=$PATH:/d/repos/ffmpeg/ffmpeg_5.2.1_install/bin这个命令。配置文件就是msys的安装位置/msys64/etc/profile.这个文件和 Linux 下的/etc/profile文件作用是类似的。

ffmpeg 集成x264

libx264 编译安装

ffmpeg 提供了相当多的外部库支持,但是如果要使用的话需要自己编译外部库。

libx264 由 VideoLAN 组织所发布,它是 H.264 的一套性能较好的软编码器实现(不包括解码器)。H.264 (AVC) 是当前较常用的视频编码,目前 H.264 的继任者 H.265 (HEVC) 也渐趋成熟, VideoLAN 也有一套实现 libx265。

  1. 进入x264官网页面下载

    官方建议使用 git 下载源码(下载压缩包再解压应该也是一样的):

    git clone https://code.videolan.org/videolan/x264.git

  2. 进入源码目录

  3. 执行以下命令进行编译和安装

    编译安装过程和ffmpeg相似。

./configure --prefix=安装路径 --enable-shared
make -j 4
make install 

– enable-shared ,同时在系统中生成共享库,方便其他程序调用。

  1. 查看libx264是否安装成功

    到x264的可执行文件目录,执行./x264.exe --version打印类似如下信息,安装成功。

编译ffmpeg库,集成libx264

  1. 检查 PKG_CONFIG_PATH 环境变量是否正确配置

    pkg-config 工具通过 PKG_CONFIG_PATH 环境变量来查找库的 pkg-config 配置文件。ibx264的pkg-config是一个用于管理库依赖的工具。它可以帮助开发者在编译和链接源代码时自动包含库文件,并提供必要的编译器和链接器选项。此外,它还可以与其他开发工具集成,例如Autotools和CMake,以实现更完整和自动化的构建过程。

    可以执行以下命令确认 PKG_CONFIG_PATH 是否包含了 libx264 的 pkg-config 配置文件路径:

    echo $PKG_CONFIG_PATH
    

    如果没有包含,你可以使用以下命令将 libx264 的 pkg-config 配置文件路径添加到 PKG_CONFIG_PATH 中:

     export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/f/software/install/ffmpeg/x264_install/lib/pkgconfig
    
  2. 编译安装ffmpeg

    ./configure --prefix=/f/software/install/ffmpeg/ffmpeg_install \\
    --enable-shared --enable-sdl2 --disable-static  --enable-gpl --enable-libx264 \\
    --extra-cflags=-I/f/softweg/x264_install/include \\
    --extra-ldflags=-L/f/software/install/ffmpeg/x264_install/lib
    
    make -j 4
    
    make install
    

    这里使用了以下参数:

    • 加入--enable-libx264 参数
  • 加入--enable-gpl参数。否则会提示libx264 is gpl and --enable-gpl is not specified

  • –extra-cflags=“-I/f/softweg/x264_install/include”:指定 x264 的头文件路径为 /f/softweg/x264_install/include。

    • –extra-ldflags=“-L/f/software/install/ffmpeg/x264_install/lib”:指定 x264 的库文件路径为/f/software/install/ffmpeg/x264_install/lib,并链接到 libx264.so 动态库文件。

注意: 有一个坑就是 编译安装完成之后,执行ffmpeg、ffplay等命令都没有反应。或者双节ffmpeg.exe 提示 由于找不到libx264-164.dll,无法继续执行代码。重新安装程序可能会解决此问题。这是因为我们libx264和ffmpeg的安装路径不在同一个地方。需要libx264安装目录的bin文件夹下的libx264-164.dll放到ffmpeg安装路径的bin目录下。

参考

fmpeg库编译安装及入门指南(Windows篇)

以上是关于ffmpeg库编译安装及入门指南(Windows篇)- 2022年底钜献的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg编译安装

Windows环境下FFmpeg编译安装

FFMPEG音视频开发指南

FFMPEG音视频开发指南

FFMPEG音视频开发指南

MinGW32编译ffmpeg+libsrt