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
    

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

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

    rem set MSYS2_PATH_TYPE=inherit
    改为
    set MSYS2_PATH_TYPE=inherit
    
  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/

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/

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/

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

pacman -S mingw-w64-x86_64-toolchain

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/

使用以下命令行编译x264(32位)

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

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

make -j4
make install

当编译成功后,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/

使用以下命令行编译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

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

make -j4

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

make install

当编译成功后,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
    
  2. 获取FFmpeg源代码

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

    git clone https://git.ffmpeg.org/ffmpeg.git
    
  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)
    

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

  4. 安装

    安装编译完成的FFmpeg:

    sudo make install
    
  5. 验证安装

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

    ffmpeg -version
    

1.4 macOS编译FFmpeg

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

  1. 安装依赖项

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

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

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

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

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

    git clone https://git.ffmpeg.org/ffmpeg.git
    
  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)
    
  4. 安装

    安装编译完成的FFmpeg:

    sudo make install
    
  5. 验证安装

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

    ffmpeg -version
    

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 <iostream>
    #include <string>
    extern "C"
    {#include <libavformat/avformat.h>
    }
    

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

  2. 初始化网络模块:

    avformat_network_init();
    

    这一行代码初始化了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;
    }
    

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

  4. 查找流信息:

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

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

  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;}
    }
    

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

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

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

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

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

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

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

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

    avformat_close_input(&formatContext);
    

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

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/118652.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成集云 | 多维表自动查询快递100信息 | 解决方案

源系统成集云目标系统 方案介绍 产品详情 维格表是一种新一代的团队数据协作和项目管理工具&#xff0c;它结合了可视化数据库、电子表格、实时网络协同、低代码开发技术四项功能&#xff0c;且支持API与可视化看板&#xff0c;操作简单&#xff0c;能提升中小企业的数字化生…

【USRP】调制解调系列4:BPSK、QPSK、8PSK、OQPSK、Pi/4DQPSK,基于labview的实现

PSK Phase Shift Keying – 相移键控 在某些调制解调器中用于数据传输的调制系统&#xff0c;在最简单的方式中&#xff0c;二进制调制信号产生0和1。载波相位来表示信号占和空或者二进制1和O。对于有线线路上较高的数据传输速率&#xff0c;可能发生4个或8个不同的相移&…

STM32基础知识点总结

一、基础知识点 1、课程体系介绍 单片机概述arm体系结构STM32开发环境搭建 STM32-GPIO编程-点亮世界的那盏灯 STM32-USART串口应用SPI液晶屏 STM32-中断系统 STM32-时钟系统 STM32-ADC DMA 温湿度传感器-DHT11 2.如何学习单片机课程 多听理论、多理解、有问题及时提问 自己多…

electron笔记无边框窗口、DLL调用、DLL函数返回指针

无边框 const win new BrowserWindow({width: 1290,height: 736,minHeight: 736,minWidth: 1040,maxHeight: 736,maxWidth: 1290,frame: false, // 无边框webPreferences: {// preload: process.env.WEBPACK_DEV_SERVER_URL ? __dirname /preload.js : app://./preload.js,…

进程、操作系统

文章目录 一、冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09;1. 概述2. CPU 二、操作系统&#xff08;Operating System&#xff09;三、进程(process)/任务(task) 一、冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09; 1. 概述 分类 CPU 中央处…

基于图像切割计算轨迹相似度

目录 背景思路与核心代码数值实验优缺点分析参考文献 背景 在前面2文&#xff0c;我们分别讨论了利用夹角余弦来计算轨迹相似度和利用缓冲原理来计算轨迹相似度两种方法&#xff0c;前者可以作为一个baseline提供参考&#xff0c;后者的计算更符合人们的感官和事实&#xff0c…

【ES】笔记-Promise基本使用

笔记-基本使用 一、初始Promise1. 抽象表达:2. 具体表达:为什么要用 Promise?promise的基本流程 二、fs读取文件三、AJAX请求四、Promise封装fs模块五、util.promisify方法六、Promise封装AJAX操作 一、初始Promise 1. 抽象表达: 1. Promise 是一门新的技术(ES6 规范) 2. Pr…

性能提升3-4倍!贝壳基于Flink + OceanBase的实时维表服务

作者介绍&#xff1a;肖赞&#xff0c;贝壳找房&#xff08;北京&#xff09;科技有限公司 OLAP 平台负责人&#xff0c;基础研发线大数据平台部架构师。 贝壳找房是中国最大的居住服务平台。作为居住产业数字化服务平台&#xff0c;贝壳致力于推进居住服务的产业数字化、智能…

2023-9-2 染色法判定二分图

题目链接&#xff1a;染色法判定二分图 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 100010l, M 200010;int n, m; int h[N], e[M], ne[M], idx;int color[N];void add(int a, int b) {e[idx] b, ne[id…

文本标注技术方案(NLP标注工具)

Doccano doccano 是一个面向人类的开源文本注释工具。它为文本分类、序列标记和序列到序列任务提供注释功能。您可以创建用于情感分析、命名实体识别、文本摘要等的标记数据。只需创建一个项目&#xff0c;上传数据&#xff0c;然后开始注释。您可以在数小时内构建数据集。 支持…

Leetcode19 删除链表指定节点

思路&#xff1a;用列表保存链表&#xff0c;然后分情况讨论。 class Solution:def removeNthFromEnd(self, head, n: int):node_list[head]while head.next:headhead.nextnode_list.append(head)remove_loclen(node_list)-n#要移除的位置if len(node_list)1:return Noneif re…

Unity中Transform移动相关

路程 方向 * 速度 * 时间 参数一&#xff1a;表示位移多少 路程 方向 * 速度 * 时间 参数二&#xff1a;表示 相对坐标系 默认 该参数 是相对于自己坐标系的 相对于世界坐标系的 Z轴 动 始终是朝 世界坐标系 的 Z轴正方向移动 this.transform.Translate(Vector3.forwar…

matlab绘制局部放大图

ZoomPlot是一个交互式的matlab局部绘图库&#xff0c;其github仓库地址为 https://github.com/iqiukp/ZoomPlot-MATLAB。在使用库之前需要先将库下载到本地&#xff0c;可以直接添加到matlab的库中&#xff0c;也可以放在项目文件中直接使用。 简单使用 其实使用这个库只需要…

iOS开发Swift-2-图片视图、App图标-赏月App

1.创建新项目 点击File - New - Project。 选择Single View App&#xff0c;点击Next。 填写文件信息&#xff0c;点击Next。 选择文件位置&#xff0c;点击Create。 修改App显示名称为 “赏月”。 2.设置背景色 选择Main&#xff0c;点击View界面&#xff0c;选择右边属性&…

【数学建模竞赛】Matlab逻辑规则,结构基础及函数

逻辑基础 逻辑变量 在Matlab中&#xff0c;逻辑变量是一种特殊类型的变量&#xff0c;用于表示逻辑值。逻辑变量只有两个可能的值&#xff1a;true&#xff08;真&#xff09;和false&#xff08;假&#xff09;。在Matlab中&#xff0c;我们可以使用0和1来表示逻辑变量的值。…

go语言-协程

mOS结构体 每一种操作系统不同的线程信息 g给g0栈给g0协程内存中分配的地址&#xff0c;记录函数跳转信息&#xff0c; 单线程循环 0.x版本 1.0版本 多线程循环 操作系统并不知道Goroutine的存在 操作系统线程执行一个调度循环&#xff0c;顺序执行Goroutine 调度循环非常…

linux 下安装配置nexus

一、安装包获取方式 方式一 1、直接把下载好的安装包上传到服务器中 方式二 2、通过wget安装Nexus压缩包 ①、可以使用以下命令进行安装Nexus的最新版本 wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz②、也可以点击官网复制想要下载的Nexus压缩包进行安装…

读word模板批量生成制式文件

文章目录 1、Maven依赖2、.docx或.doc格式的word模板准备3、读word模板&#xff0c;批量替换代码域&#xff0c;生成文件&#xff0c;demo4、结果展示 1、Maven依赖 <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagre…

qt creater11 翻译国际化教程教程:

先出效果图。 闲聊几句&#xff1a;qt这个翻译很方便&#xff0c;能直接导出项目里所有文字。 具体步骤如下&#xff1a; 在Qt中&#xff0c;我们可以使用QTranslator类来实现多语言切换。以下是一般步骤&#xff1a; 1. 在你的源代码中&#xff0c;所有需要翻译的字符串都…

OpenGL-入门-BMP像素图glReadPixels(1)实现读取屏幕中间的颜色和获取屏幕上鼠标点击位置的颜色

glReadPixels函数用于从帧缓冲区中读取像素数据。它可以用来获取屏幕上特定位置的像素颜色值或者获取一块区域内的像素数据。下面是该函数的基本语法&#xff1a; void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *da…