当前位置: 首页 > news >正文

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项目集成

相关文章:

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

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。本文是音视频系…...

mapboxGL3新特性介绍

概述 8月7日&#xff0c;mapboxGL发布了3版本的更新&#xff0c;本文带大家一起来看看mapboxGL3有哪些新的特性。 新特新 如上图所示&#xff0c;是mapboxGL官网关于新版的介绍&#xff0c;大致翻译如下&#xff1a; 增强了web渲染的质量、便捷程度以及开发人员体验&#xff…...

类ChatGPT大模型LLaMA及其微调模型

1.LLaMA LLaMA的模型架构:RMSNorm/SwiGLU/RoPE/Transfor mer/1-1.4T tokens 1.1对transformer子层的输入归一化 对每个transformer子层的输入使用RMSNorm进行归一化&#xff0c;计算如下&#xff1a; 1.2使用SwiGLU替换ReLU 【Relu激活函数】Relu(x) max(0,x) 。 【GLU激…...

50个简洁的提示提高代码可读性和效率(0-10)

这篇文章整理了50个简洁的提示&#xff0c;可以提高您的代码可读性和效率。这些提示来自个人项目、彻底的代码审查和与资深开发人员的启发性讨论。 无论您是新手还是经验丰富的开发人员&#xff0c;这篇文章都应该能够帮助您学到一些东西。 这个列表包括常见的Python模式、核…...

Linux —— 进程信号

一&#xff0c;信号概念 信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断&#xff1b; 系统定义的信号 每个信号都有一个编号和一个宏定义名称&#xff08;可在signal.h查看&#xff09;&#xff1b;编号34以上的为实时信号&#xff1b; [wz192 Desktop]$ kill -…...

Android笔记 自定义控件时drawText字符串宽度的3种计算方式

String str "hello"; canvas.drawText(str, x, y, mPaint);//1. 粗略计算文字宽度&#xff1a; float width mPaint.measureText(str);//2. 计算文字的矩形&#xff0c;可以得到宽高&#xff1a; Rect rect new Rect(); mPaint.getTextBounds(str, 0, str.length(…...

ChatRWKV 学习笔记和使用指南

0x0. 前言 Receptance Weighted Key Value&#xff08;RWKV&#xff09;是pengbo提出的一个新的语言模型架构&#xff0c;它使用了线性的注意力机制&#xff0c;把Transformer的高效并行训练与RNN的高效推理相结合&#xff0c;使得模型在训练期间可以并行&#xff0c;并在推理…...

Particle Life粒子生命演化的MATLAB模拟

Particle Life粒子生命演化的MATLAB模拟 0 前言1 基本原理1.1 力影响-吸引排斥行为1.2 距离rmax影响 2 多种粒子相互作用2.1 双种粒子作用2.1 多种粒子作用 3 代码 惯例声明&#xff1a;本人没有相关的工程应用经验&#xff0c;只是纯粹对相关算法感兴趣才写此博客。所以如果有…...

golang中byte和rune的区别?

golang中byte和rune的区别&#xff1f; rune和byte在go语言中都是字符类型&#xff0c;从源码来看他们都是别名形式 // byte is an alias for uint8 and is equivalent to uint8 in all ways. It is // used, by convention, to distinguish byte values from 8-bit unsigned…...

AI图像行为分析算法 opencv

AI图像行为分析算法通过pythonopencv深度学习框架对现场操作行为进行全程实时分析&#xff0c;AI图像行为分析算法通过人工智能视觉能够准确判断出现场人员的作业行为是否符合SOP流程规定&#xff0c;并对违规操作行为进行自动抓拍告警。OpenCV是一个基于Apache2.0许可&#xf…...

MATLAB制图代码【第二版】

MATLAB制图代码【第二版】 文档描述 Code describtion: This code is version 2 used for processing the data from the simulation and experiment. Time : 2023.9.3 Author: PEZHANG 这是在第一版基础上&#xff0c;迭代出的第二版MATLAB制图代码&#xff0c;第二版的特点是…...

5.0: Dubbo服务导出源码解析

#Dubbo# 文章内容 Dubbo服务导出基本原理分析Dubbo服务注册流程源码分析Dubbo服务暴露流程源码分析服务导出的入口方法为ServiceBean.export(),此方法会调用ServiceConfig.export()方法,进行真正的服务导出。 1. 服务导出大概原理 服务导出的入口方法为ServiceBean.export…...

python自动化测试-自动化基本技术原理

1 概述 在之前的文章里面提到过&#xff1a;做自动化的首要本领就是要会 透过现象看本质 &#xff0c;落实到实际的IT工作中就是 透过界面看数据。 掌握上面的这样的本领可不是容易的事情&#xff0c;必须要有扎实的计算机理论基础&#xff0c;才能看到深层次的本质东西。 …...

lodash 之 _.isEmpty

lodash.isEmpty() 是 Lodash 库中的一个函数&#xff0c;用于检查给定值是否为空。它可以用于判断对象、数组、字符串等不同类型的值是否为空。 const _ require(lodash);console.log(_.isEmpty(null)); // 输出: trueconsole.log(_.isEmpty(undefined)); // 输出: trueconso…...

layui数据表格实现表格中嵌套表格,并且可以折叠展开

效果&#xff1a; 思路&#xff1a; 1、最外层的表格先渲染&#xff0c;在done回调中向每个tr后面插入一个用来嵌套子级表格的tr。 tr的class和table的id需要用索引 i 关联 //向每一行tr后面追加显示子table的trlet trEles $(".layui-table-view[lay-idlist] tbody tr&…...

云端笔记系统-自动化测试

文章目录 1. 思维导图编写 Web 自动化测试用例2. 创建测试项目3. 根据思维导图设计【云端笔记】自动化测试用例3.1. 准备工具类3.2. 测试注册页面3.3. 测试登陆页面3.4. 测试添加博客页3.5. 测试我的博客列表页3.6. 测试修改博客页3.7. 测试博客列表页3.8. 测试博客详情页3.9. …...

将帅要避免五个方面的弱点:蛮干、怕死、好名、冲动、溺爱民众

将帅要避免五个方面的弱点&#xff1a;蛮干、怕死、好名、冲动、溺爱民众 【安志强趣讲《孙子兵法》第28讲】 【原文】 是故屈诸侯者以害&#xff0c;役诸侯者以业&#xff0c;趋诸侯者以利。 【注释】 趋&#xff1a;归附、依附。 【趣讲白话】 所以&#xff0c;用祸患威逼诸侯…...

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书成都理工大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书成都理工大学图书馆...

vue的第3篇 第一个vue程序

一 vue的mvvm实践者 1.1 介绍 Model&#xff1a;模型层&#xff0c; 在这里表示JavaScript对象 View&#xff1a;视图层&#xff0c; 在这里表示DOM(HTML操作的元素) ViewModel&#xff1a;连接视图和数据的中间件&#xff0c; Vue.js就是MVVM中的View Model层的实现者 在M…...

线性求逆元

先暴力求出 1 n ! \frac 1 {n!} n!1​往回推出 1 i ! \frac 1 {i!} i!1​ 1 i ( i − 1 ) ! i ! \Large \frac 1 i\frac{(i-1)!}{i!} i1​i!(i−1)!​...

第一章 USB应用笔记之USB初步了解

USB应用笔记之USB初步了解 文章目录 USB应用笔记之USB初步了解前言USB的优点&#xff1a;USB版本发展USB速度以及电气接口USB传输过程USB开发抓包工具&#xff1a;USB传输方式1.控制传输特点:2.中断传输的特点3. 批量传输的特点4.实时传输&#xff08;同步传输&#xff09;的特…...

小白入门python

建议用vscode进行代码学习 vscode下载地址:Download Visual Studio Code - Mac, Linux, Windows 左侧点击扩展安装python,右下角选择python版本&#xff0c;记得配置系统环境变量&#xff0c;python在系统(cmd)的版本由环境变量优先级决定,在编程软件中由自己选择解释器...

《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.17集群(多主多从)》

一、架构图 如下图所示: 二、环境信息 1、部署规划主机名K8S版本系统版本内核版本IP地址备注k8s-master-631.24.17Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63master节点 + etcd节点k8s-master-641.24.17Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.64master节点 + …...

Adobe Illustrator 2023 for mac安装教程,可用。

Adobe Illustrator 是行业标准的矢量图形应用程序&#xff0c;可以为印刷、网络、视频和移动设备创建logos、图标、绘图、排版和插图。数以百万计的设计师和艺术家使用Illustrator CC创作&#xff0c;从网页图标和产品包装到书籍插图和广告牌。此版本是2023版本&#xff0c;适配…...

ElasticSearch(一)数据类型

ElasticSearch&#xff08;一&#xff09;数据类型 1.简述 Es数据类型分为基础数据类型和复杂类型数据&#xff0c;掌握ES数据类型才能进一步使用ES检索数据内容。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…...

Spark-Core核心算子

文章目录 一、数据源获取1、从集合中获取2、从外部存储系统创建3、从其它RDD中创建4、分区规则—load数据时 二、转换算子(Transformation)1、Value类型1.1 map()_1.2 mapPartitions()1.3 mapPartitionsWithIndex(不常用)1.4 filterMap()_扁平化&#xff08;合并流&#xff09;…...

Linux和Windows下防火墙、端口和进程相关命令

&#x1f680;1 防火墙 1.1 firewall systemctl stop firewalld.service # 关闭防火墙 systemctl start firewalld.service # 开启防火墙 systemctl restart firewalld.service # 重启防火墙 systemctl status firewalld.service # 防火墙状态 firewall-cmd --reload # 重…...

2021年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:双端队列 定义一个双端队列,进队操作与普通队列一样,从队尾进入。出队操作既可以从队头,也可以从队尾。编程实现这个数据结构。 时间限制:1000 内存限制:65535 输入 第一行输入一个整数t,代表测试数据的组数。 每组数据的第一…...

【算法】滑动窗口

滑动窗口应用场景 关键词&#xff1a; 满足xxx条件&#xff08;计算结果&#xff0c;出现次数&#xff0c;同时包含&#xff09; 最长/最短 子串/子数组/子序列 例如&#xff1a;长度最小的子数组 滑动窗使用思路&#xff08;寻找最长&#xff09; 核心&#xff1a;左右双指…...

JS获取Beego渲染模板Temple时传递的数据

如果纯粹的JS调用接口&#xff0c;获取后端数据很直接坦率&#xff0c;JSON解析也就可以了。 如果需要JS获取HTML页面加载时&#xff0c;后端传回来的一些数据&#xff0c;我们也可以通过以下的方式进行获取。范例如下&#xff1a; //通过person_name字段传递参数到html页面中…...