Win11+ VS2022编译 FFmpeg6.0 静态库的详细过程

 更新时间:2023年08月18日 09:04:31   作者:Dionysius  
这篇文章主要介绍了Win11+VS2022编译FFmpeg6.0静态库的方法,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

编译前言

编译作为自己持有的稳定版本 用来练习,网上的编译环境太杂太乱了,目前有个开源项目致力解决ffmpeg编译的问题,暂时拿来用,如果这个项目不维护或者坏了,再考虑其他。

为什么项目编译?

编译作为自己持有的稳定版本 用来练习

前期准备

使用github 上 开源项目的解决方案编译

ShiftMediaProject

环境配置

先创建代码目录,作者建议的。

*OutputDir is the "Output Directory" specified in the project properties. 
The default value of OutputDir is "..\..\msvc" relative to the FFmpeg source directory. An example of the expected 
directory structure is:
    -  msvc          (OutputDir)
    -> source
        - FFmpeg
        - ..Any other libraries source code..

进入 source 目录打开git bash 克隆代码

这里因为我已经git 拉到本地过了,所以报错,不影响。

ffmpeg外部库

代码拉取完毕后 ,如果一切顺利, /vs2022/source/FFmpeg/SMP 目录可以查看readme.txt,里面介绍了如何编译配置整个项目,包括外部库:x264、x264、vpx等,可以使用脚本下载,路径 vs2022\source\FFmpeg\SMP\project_get_dependencies.bat ,感兴趣可以看一下他这个bash脚本,它会按照脚本中配置的外部库名字按顺序拉取。如果万一下载失败 ,可以根据输出日志跟脚本内容排查问题,手动下载或者重新运行脚本。运行情况如下:

好了经过漫长的下载与数次 .//project_get_dependencies.bat ,所有的库也都下下来了。

额外的编译选项-for渲染

根据 readme.txt 先在 /vs2022/msvc/ 下创建 include 目录,include里创建 gl AMF 两个目录,用来放 opengl nv-codec AMF 的头文件。

git clone https://github.com/KhronosGroup/OpenGL-Registry.git
git clone https://github.com/KhronosGroup/EGL-Registry.git
git clone https://github.com/FFmpeg/nv-codec-headers.git
git clone https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git

opengl (需要glext)

a. OpenGL-Registry\api\GL\ 里的 glext.h wglext.h 放入 /vs2022/msvc/include/gl/

b. EGL-Registry\api\KHR 将KHR整个文件夹放入 /vs2022/msvc/include/

ffnvcodec (需要nv-codec-headers)

a. nv-codec-headers\include 里的ffnvcodec目录复制到 /vs2022/msvc/include

AMF sdk头文件

a. AMF\amf\public\include 里的两个文件夹复制到 /vs2022/msvc/include/AMF

编译工具链

配置 NASM YASM ,这两个是汇编的编译工具

nasm

git clone https://github.com/ShiftMediaProject/VSNASM/releases/download/0.9/VSNASM.zip

yasm

git clone https://github.com/ShiftMediaProject/VSYASM/releases/download/0.7/VSYASM.zip

同样我们查看脚本可知它会根据不同VS的大版本去做适配安装,我们的是VS2022,vs17,如果有报错可以往这方面去排查。执行安装

开始编译

到这一步,所有的准备工作基本完成,打开工程文件 FFMpeg/SMP/ffmpeg_deps.sln

step1. 选择编译类型 Debug/Release Dll/lib

这里我们先选择的Debug,因为只是练习用,需要调试什么的。接下来就是直接生成了,生成时间稍微有点长,我这里10分钟左右,而且中间果不其然出现了错误。让我们来分析一下:在libavcodec 编译的过程中提示找不到好几个宏 都是NV_ENC_PARAMS打头的,我们找一下他的同类型,大概是这么一个枚举类型

,这里我们替换一下ffnvcode的版本,退回到5月份的版本,跟ffmpeg6r1保持一致

重新生成就能成功了。

lib库在`/msvc/lib/x64下面,我们可以看到生成的各种lib库

step2. 打包SDK

把上述生成的include、lib打包带走,直接放到应用的项目下就可以直接用了

验证

#ifndef __FFPLAYER_H__
#define __FFPLAYER_H__
#include <iostream> 
extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libswresample/swresample.h"
#include "libavutil/avassert.h"
#include "libavutil/error.h"
#include "libavutil/avutil.h"
#include "libavutil/ffversion.h"
#include "libavutil/imgutils.h"
#include "libavutil/channel_layout.h"
#include "libavutil/opt.h"
#include "libavutil/mathematics.h"
#include "libavutil/timestamp.h"
}
#include <Windows.h>
#include <string.h>
#include <math.h>
#ifdef _DEBUG
#pragma comment(lib, "libavformatd.lib")
#pragma comment(lib, "libavutild.lib"
#pragma comment(lib, "libavcodecd.lib")
#pragma comment(lib, "libavdeviced.lib")
#pragma comment(lib, "libavfilterd.lib")
#pragma comment(lib, "libswscaled.lib")
#pragma comment(lib, "libswresampled.lib")
#else
#pragma comment(lib, "libavformat.lib")
#pragma comment(lib, "libavutil.lib")
#endif
...
...
...
#endif  //__FFPLAYER_H__

结果如下,我们在这里输出了ffmpeg的编译配置,可以看到 其他的一些基础库都是 enable 的状态,说明都编进去了,本次编译宣告成功。如需要在项目中使用到这些外部库诸如x265之类的,在项目中加上这些库的lib连接就可以。

结尾

如果上述方式失效了,要回到手动编译配置的老路子,脏路子,也不用慌,相信经过这些配置编译的历程,作为开发者的您也能轻松应对,处变不惊,将正确的东西放到正确的篮子里面。

最后,祝您在开发者波澜壮阔的coding生活里一切顺利~

本文原创https://macrocyborg.site/article/07ab4b09-2b01-42c4-8faf-6c15c70b368a

参考链接

1.CSDN令狐掌门

2.Shift Media Project

3.FFMPEG官方git仓库

到此这篇关于Win11+ VS2022编译 FFmpeg6.0 静态库的文章就介绍到这了,更多相关VS2022编译 FFmpeg6.0 静态库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 实现多数的最大公约数的实例

    C++ 实现多数的最大公约数的实例

    这篇文章主要介绍了C++ 实现多数的最大公约数的实例的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++之assert推荐用法及注意事项

    C++之assert推荐用法及注意事项

    这篇文章主要给大家介绍了关于C++之assert推荐用法及注意事项的相关资料,assert 是一个预处理宏,用于在运行时检查表达式是否为真,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • C++ pthread入门指南

    C++ pthread入门指南

    pthread是C++98接口且只支持Linux,使用时需要包含头文件#include <pthread.h>,编译时需要链接pthread库,其中p是POSIX的缩写,而POSIX是Portable Operating System Interface的缩写,这篇文章主要介绍了C++ pthread简介,需要的朋友可以参考下
    2024-05-05
  • 使用Inotify 监控目录与文件的方法详解

    使用Inotify 监控目录与文件的方法详解

    本篇文章是对使用Inotify 监控目录与文件的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++中的std::format 如何实现编译期格式检查

    C++中的std::format 如何实现编译期格式检查

    C++ 20 的 std::format 是一个很神奇、很实用的工具,最神奇的地方在于它能在编译期检查字符串的格式是否正确,而且不需要什么特殊的使用方法,只需要像使用普通函数那样传参即可,这篇文章主要介绍了std::format 如何实现编译期格式检查,需要的朋友可以参考下
    2024-04-04
  • C语言中函数返回字符串的方法汇总

    C语言中函数返回字符串的方法汇总

    C语言返回字符串函数共有四种方式,分别如下:使用堆空间,返回申请的堆地址,注意释放、函数参数传递指针,返回该指针、返回函数内定义的静态变量(共享)、返回全局变量
    2017-05-05
  • 深入理解C++模板如何实现多态思想

    深入理解C++模板如何实现多态思想

    这篇文章主要为大家详细介绍了C++模板如何实现多态的相关资料,文中的示例代码讲解详细,对我们深入了解C++有一定的帮助,感兴趣的可以了解一下
    2023-03-03
  • 使用C语言实现字符串逆序操作案例

    使用C语言实现字符串逆序操作案例

    这篇文章主要介绍了使用C语言实现字符串逆序操作案例,本文包含使用C语言的两种方法去实现,递归和非递归,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言实现BMP图像处理(直方图均衡化)

    C语言实现BMP图像处理(直方图均衡化)

    这篇文章主要为大家详细介绍了C语言实现BMP图像直方图均衡化处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C语言goto的应用举例以及详解

    C语言goto的应用举例以及详解

    goto的用法就是改变程序执行的顺序,从某个地方跳转到你标志的地方,下面这篇文章主要给大家介绍了关于C语言goto的应用举例及详解的相关资料,需要的朋友可以参考下
    2022-11-11

最新评论