• FFmpeg4.3.1+h264在windows下编译与VS2017项目集成


    前言

    Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》,结合我自己的工作学习经历,我准备写一个音视频系列blog。本文是音视频系列blog的其中一个, 对应的要学习的内容是:FFmpeg4.3.1+h264在windows下如何编译,以及编译之后的内容如何在VS2017项目集成,还有Ubuntu编译FFmpeg与macOS编译FFmpeg。


    音视频系列blog

    音视频系列blog: 点击此处跳转查看.


    目录

    在这里插入图片描述


    1.1 FFmpeg编译

    macOS、Ubuntu、window下都可以编译ffmpeg,macOS、Ubuntu这两种环境编译ffmpeg相对来说比较简单,window环境下编译ffmpeg,可以说是一步一个坑,这篇文章具体讲一下ffmpeg4.3.1 + h264在windows下编译方法,以及编译后的代码如何集成到VS2017项目中。当然了,如果你不想编译,我已经把编译过的内容放到了源代码中,源代码链接在最后,可以直接使用。


    1.2 ffmpeg4.3.1+h264在windows下编译

    1.2.1 安装MSYS2

    MSYS2(Minimal SYStem 2)是一个软件环境,它提供了类似于Linux的工具和库,可以在Windows操作系统上进行开发和编译。它主要用于在Windows上进行类Unix开发环境的搭建,使开发者能够在Windows上使用像GCC、make、bash等工具,以便更方便地进行跨平台开发。

    要在Windows上安装MSYS2,可以按照以下步骤进行:

    1. 下载安装器:访问MSYS2官方网站(https://www.msys2.org/)并下载最新版本的安装器。通常有32位和64位版本可供选择。

    2. 运行安装器:双击下载的安装器文件,按照提示进行安装。安装程序会询问你有关安装路径、启动菜单等选项。

    3. 安装所需工具:要安装特定的开发工具,可以使用以下命令。例如,要安装编译程序:

      pacman -S make gcc diffutils pkg-config
      
      • 1

      可能需要多尝试几次(安装过程时间有点长),如果不安装 pkg-config,运行./configure 的时候,会出现如下 warning。

    4. 找到安装路径(比如D:\msys2),找到msys2_shell.cmd这个文件,做以下修改:

      rem set MSYS2_PATH_TYPE=inherit
      改为
      set MSYS2_PATH_TYPE=inherit
      
      • 1
      • 2
      • 3
    5. 找到安装路径(比如D:\msys2\usr\bin),找到link.exe这个文件,将这个文件改名为link.exe.bak.2023

    6. 配置mingw64的环境变量,找到安装路径(比如D:\msys2\mingw64\bin),添加windows环境变量。


    1.2.2 下载YASM

    下载地址:http://yasm.tortall.net/Download.html,找到Win64 .exe,点击下载。

    下载后,将 yasm-1.3.0-win64.exe 改名为 yasm.exe,并放置于D:\msys2\usr\bin(这是我的安装路径,找到你自己的MSYS2安装路径,下面涉及到路径,使用你自己的路径,我就不再提示)目录中。


    1.2.3 下载FFmpeg源码

    下载 ffmpeg 代码,版本:FFmpeg 4.3.1 , http://www.ffmpeg.org/releases/ffmpeg-4.3.1.tar.gz

    下载之后,解压到D:\ffmpeg-4.3.1\,下面会用到。


    1.2.4 更新msys64,并改用国内镜像

    进入D:\msys2\etc\pacman.d\这个文件夹中,修改3个文件的镜像

    mirrorlist.mingw32,将下面内容添加到mirrorlist.mingw32的最上面,然后保存。

    Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686/ 
    Server = http://repo.msys2.org/mingw/i686 
    Server = http://downloads.sourceforge.net/project/msys2/REPOS/MINGW/i686 
    Server = http://www2.futureware.at/~nickoe/msys2-mirror/i686/
    
    • 1
    • 2
    • 3
    • 4

    mirrorlist.mingw64,将下面内容添加到mirrorlist.mingw64的最上面,然后保存。

    Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/ 
    Server = http://repo.msys2.org/mingw/x86_64 
    Server = http://downloads.sourceforge.net/project/msys2/REPOS/MINGW/x86_64 
    Server = http://www2.futureware.at/~nickoe/msys2-mirror/x86_64/
    
    • 1
    • 2
    • 3
    • 4

    mirrorlist.msys,将下面内容添加到mirrorlist.msys的最上面,然后保存。

    Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/
    Server = http://repo.msys2.org/msys/$arch
    Server = http://downloads.sourceforge.net/project/msys2/REPOS/MSYS2/$arch
    Server =http://www2.futureware.at/~nickoe/msys2-mirror/msys/$arch/
    
    • 1
    • 2
    • 3
    • 4

    在安装路径中找到mingw64.exe,以管理员身份运行,使用下面的命令行更新 mingw-w64-x86_64-toolchain 工具链,如果没有上面修改上面3个文件的镜像,那么这个更新将非常慢。

    pacman -S mingw-w64-x86_64-toolchain
    
    • 1

    1.2.5 编译x264

    x264下载地址:http://download.videolan.org/pub/videolan/x264/snapshots/

    我下载的是这个版本:x264-snapshot-20170208-2245-stable.tar.bz2

    将下载的压缩包放到一个文件夹(D:\x264),然后解压。

    找到mingw64.exe,以管理员身份运行,将目录切换到x264解压文件夹中

    cd /d/x264/x264-snapshot-20170208-2245-stable/
    
    • 1

    使用以下命令行编译x264(64位)(如果是64位编译,VS2017集成代码的时候解决方案平台选择x64)

    ./configure --prefix=/usr/local/x264 --host=x86_64-w64-mingw32 --enable-shared --disable-thread --disable-avs --extra-ldflags=-Wl,--output-def=libx264.def 
    
    • 1

    这个过程比较慢,请耐心等待

    也可以使用以下命令行编译x264(32位)(如果是32位编译,VS2017集成代码的时候解决方案平台选择x86)

    ./configure --prefix=/usr/local/x264 --host=i686-w64-mingw32 --enable-shared --disable-thread --disable-avs --extra-ldflags=-Wl,--output-def=libx264.def
    
    • 1

    这个过程比较慢,请耐心等待,上面两个命令行编译x264可以二选一

    make -j4
    
    • 1
    make install
    
    • 1

    当编译成功后,D:\msys2\usr\local\这个目录下就会出现x264文件夹,这个文件夹中有3个文件夹,bin,include,lib,证明你编译x264成功。
    在这里插入图片描述


    1.2.6 编译ffmpeg4.3.1,集成x264

    找到mingw64.exe,以管理员身份运行,将目录切换到D:\ffmpeg-4.3.1\中(ffmpeg源代码目录)

    cd /d/ffmpeg-4.3.1/
    
    • 1

    使用以下命令行编译ffmpeg4.3.1,集成x264

    ./configure  --enable-yasm  --enable-asm --enable-shared  --disable-static --prefix=/usr/local/ffmpeg431   --enable-libx264  --enable-gpl   --extra-cflags="-I/usr/local/x264/include" --extra-ldflags=-L/usr/local/x264/lib
    
    • 1

    这个过程更慢,请耐心等待

    make -j4
    
    • 1

    这个过程也慢,请耐心等待

    make install
    
    • 1

    当编译成功后,D:\msys2\usr\local\这个目录下就会出现ffmpeg431文件夹,这个文件夹中有4个文件夹,bin,include,lib,share,证明你编译ffmpeg4.3.1,集成x264成功。
    在这里插入图片描述


    1.3 Ubuntu编译FFmpeg

    以下是在Ubuntu上编译FFmpeg的一般步骤:

    1. 安装依赖项

      打开终端并运行以下命令来安装编译FFmpeg所需的依赖项:

      sudo apt update
      sudo apt install build-essential yasm nasm cmake libx264-dev libx265-dev libnuma-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev libass-dev
      
      • 1
      • 2
    2. 获取FFmpeg源代码

      可以从FFmpeg官方网站下载源代码,或者通过使用Git进行克隆。以下是使用Git克隆FFmpeg源代码的示例:

      git clone https://git.ffmpeg.org/ffmpeg.git
      
      • 1
    3. 配置和编译

      进入FFmpeg源代码目录并进行配置和编译。可以根据自己的需求启用或禁用不同的组件和库。

      cd ffmpeg
      ./configure --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libfdk-aac --enable-libmp3lame --enable-libopus --enable-libass
      make -j$(nproc)
      
      • 1
      • 2
      • 3

      这里使用的configure命令启用了一些常用的库。您可以根据需要自行修改。

    4. 安装

      安装编译完成的FFmpeg:

      sudo make install
      
      • 1
    5. 验证安装

      运行以下命令来验证FFmpeg是否已成功安装:

      ffmpeg -version
      
      • 1

    1.4 macOS编译FFmpeg

    以下是在macOS上编译FFmpeg的一般步骤:

    1. 安装依赖项

      打开终端并安装一些必要的依赖项,可以使用Homebrew来简化这个过程。如果尚未安装Homebrew,请打开终端并运行以下命令:

      /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
      
      • 1

      然后,安装编译FFmpeg所需的依赖项:

      brew install nasm yasm x264 x265 libvpx lame opus libass
      
      • 1
    2. 获取FFmpeg源代码

      可以从FFmpeg官方网站下载源代码,或者通过使用Git进行克隆。以下是使用Git克隆FFmpeg源代码的示例:

      git clone https://git.ffmpeg.org/ffmpeg.git
      
      • 1
    3. 配置和编译

      进入FFmpeg源代码目录并进行配置和编译。可以根据需要启用或禁用不同的组件和库。

      cd ffmpeg
      ./configure --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libmp3lame --enable-libopus --enable-libass
      make -j$(sysctl -n hw.ncpu)
      
      • 1
      • 2
      • 3
    4. 安装

      安装编译完成的FFmpeg:

      sudo make install
      
      • 1
    5. 验证安装

      运行以下命令来验证FFmpeg是否已成功安装:

      ffmpeg -version
      
      • 1

    1.5 创建VS2017项目,集成编译的FFmpeg代码

    在1.2中已经成功编译ffmpeg4.3.1,集成x264,得到了一个ffmpeg431文件夹,在以后的项目中我们就会使用该文件夹的内容进行相关开发,我就对ffmpeg431文件夹进一步整理简化。如果你不想编译ffmpeg源代码,可以直接使用我的编译之后的简化版ffmpeg431dev。

    ffmpeg编译简化版(ffmpeg431dev):
    在这里插入图片描述

    VS2017项目中引用ffmpeg开发库,一共分3步:

    (1)dll运行时库

    (2)头文件

    (3)库文件


    1.5.1 创建VS2017项目,添加dll运行时库

    打开VS2017,创建项目HelloFFmpeg,将ffmpeg431dev直接放到HelloFFmpeg项目中,点击运行,HelloFFmpeg项目出现Debug文件夹。

    将ffmpeg431dev的dll文件夹中的8个dll文件,复制到Debug文件夹中。


    1.5.2 添加头文件,库文件

    设置包含目录和库目录

    • 右键单击项目,选择 “属性”。
    • 在 “VC++ 目录” -> “包含目录” 中添加FFmpeg头文件的路径,比如 ../ffmpeg431dev/include
    • 在 “VC++ 目录” -> “库目录” 中添加FFmpeg库文件的路径,比如 ../ffmpeg431dev/lib
      在这里插入图片描述

    在这里插入图片描述

    添加链接器依赖项

    在 “链接器” -> “输入” -> “附加依赖项” 中添加FFmpeg库文件名,如 avformat.lib, avcodec.lib, avutil.lib 等,项目中需要什么lib就添加什么。
    在这里插入图片描述


    1.5.3 编写代码

    1. 引入头文件:

      #include 
      #include 
      extern "C"
      {
          #include 
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      这些是引入所需的C++标准库和FFmpeg库的头文件。

    2. 初始化网络模块:

      avformat_network_init();
      
      • 1

      这一行代码初始化了FFmpeg的网络模块,以便在需要时能够处理网络资源。

    3. 打开视频文件:

      AVFormatContext* formatContext = nullptr;
      if (avformat_open_input(&formatContext, "D:/input.mp4", nullptr, nullptr) != 0)
      {
          std::cerr << "Error opening input file" << std::endl;
          return 1;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      这段代码尝试打开指定的视频文件。

    4. 查找流信息:

      if (avformat_find_stream_info(formatContext, nullptr) < 0)
      {
          std::cerr << "Error finding stream information" << std::endl;
          avformat_close_input(&formatContext);
          return 1;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      这部分代码查找并获取视频文件的流信息。

    5. 查找视频流索引:

      int videoStreamIndex = -1;
      for (unsigned int i = 0; i < formatContext->nb_streams; ++i)
      {
          if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
          {
              videoStreamIndex = i;
              break;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

      这个循环用于找到第一个视频流的索引。

    6. 获取视频帧的宽度和高度:

      AVCodecParameters* videoCodecParams = formatContext->streams[videoStreamIndex]->codecpar;
      int frameWidth = videoCodecParams->width;
      int frameHeight = videoCodecParams->height;
      
      • 1
      • 2
      • 3

      这部分代码从视频流的参数中获取帧的宽度和高度。

    7. 输出视频帧的宽度和高度:

      std::cout << "Video frame width: " << frameWidth << std::endl;
      std::cout << "Video frame height: " << frameHeight << std::endl;
      
      • 1
      • 2

      这里将视频帧的宽度和高度信息输出到控制台。

    8. 关闭视频文件和清理资源:

      avformat_close_input(&formatContext);
      
      • 1

      最后,这行代码关闭已经打开的视频文件,并释放相应的资源。

    运行结果:
    在这里插入图片描述


    源代码:(欢迎star)
    FFmpeg4.3.1+h264在windows下编译与VS2017项目集成

  • 相关阅读:
    中国贵金属白银技巧:与做人
    Ubuntu离线或在线安装Python解释器
    echarts——实现大屏数据展示——基础积累(超详细)
    CentOS服务器利用docker搭建中间件命令集合
    Python编程基础 | Python编程基础内置函数
    【Linux进程】冯·诺依曼体系结构以及操作系统的深入理解
    RDMA Shared Receive Queue(四)
    4.1 网络层提供的两种服务
    竞赛 基于深度学习的人脸表情识别
    Linux - 进一步理解 文件系统 - inode - 机械硬盘
  • 原文地址:https://blog.csdn.net/a13027629517/article/details/132590095