IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> vs2019编译ffmpeg源码为静态库动态库【完整步骤、亲测可行】 -> 正文阅读

[开发工具]vs2019编译ffmpeg源码为静态库动态库【完整步骤、亲测可行】

??ffmpeg大概从两年前版本开始,不再提供编译好的lib,dll,需要开发者自己编译,在linux下编译ffmpeg可能相对简单,windows稍微复杂点,很多文章介绍使用msys2编译,但是绝大多数都是无法正确编译出lib, 而且也只是加上了x264, 然而ffmpeg支持的依赖库很多,用命令行,一个命令写错就编译失败了,本篇博客介绍如何使用vs2019编译最新的ffmpeg源码,可以编译为静态库、动态库,支持x64和win32版本,例如下面是我的vs2019 编译结果:
在这里插入图片描述
lib库路径
在这里插入图片描述

??我的编译方式不是网上的那种windows linux环境编译,之前我也是参照那种方式编译,结果要么编译的是.a库,vs2019链接失败, 要么就是编译成.dll, 由于项目里需要使用ffmpeg静态链接,因为用不到ffmpeg的所有API, 编译静态库后,自己再封装一个dll使用,这样安装包会小很多,相信大家在很多软件里也看到了libffmpeg.dll这种文件, 这就是自己封装的dll, 不是ffmpeg原始库。
??由于ffmpeg的依赖库太多,用msys64这种方式编译,如果少参数,可能就编译不全,大部分的fmpeg windows编译教程一大堆错误,根本无法编译,而且由于msys64的linux环境和windows visual studio环境差异大,c/c++编译器还会冲突,还需要改link.exe等文件的名字等操作,比较复杂,而且编译时还有各种乱七八糟的错误,耗时费力。
??本篇采用github的开源项目ShiftMediaProject来编译,开发环境Win11 64bit、VS2019,测试了多台电脑后,全部一次通过,没有任何错误。
??具体步骤如下:

1、ffmpeg代码clone

??在clone代码之前,创建代码目录,例如创建ffmpeg_vs2019目录,在该目录里再创建两个目录,msvc,source,为什么要这样创建,这是项目作者的建议,照着做就可以。

*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克隆代码
??项目地址:https://github.com/ShiftMediaProject/FFmpeg
??代码克隆

git clone https://github.com/ShiftMediaProject/FFmpeg.git

??clone完毕大概355M,如果网络环境不好,可能会clone failed。

2、ffmpeg依赖库下载

??ffmpeg clone结束后,在ffmpeg_vs2019\source\FFmpeg\SMP目录有个readme.txt介绍了如何编译配置整个项目,比如需要x264、265、vpx等开源,可以手动去ShiftMediaProject里clone, 或者运行脚本clone, 建议使用脚本clone,比较节省时间,方法如下:
??在路径 ffmpeg_vs2019\source\FFmpeg\SMP 里打开git bash, 执行
./project_get_dependencies.bat
??如下图
在这里插入图片描述
??如果网路不好,第一次可能clone失败,可以继续执行该命令。

3、其它文件下载

??先在ffmpeg_vs2019/msvc里创建include目录,include里创建gl、AMP这两个目录,待会儿需要存放opengl、egl、nv-codec、amp的头文件。

(1)opengl头文件

??opengl仓库 https://github.com/KhronosGroup/OpenGL-Registry
??代码克隆:

git clone https://github.com/KhronosGroup/OpenGL-Registry.git

??找到OpenGL-Registry\api\GL里的glext.h 和 wglext.h放到目录:ffmpeg_vs2019\msvc\include\gl

(2)EGL头文件

??EGL仓库 https://github.com/KhronosGroup/EGL-Registry
??代码克隆:

git clone https://github.com/KhronosGroup/EGL-Registry.git

??找到EGL-Registry\api\KHR,复制KHR目录到ffmpeg_vs2019\msvc\include

(3)nv-codec 头文件

git clone https://github.com/FFmpeg/nv-codec-headers.git

??将nv-codec-headers\include里的ffnvcodec目录复制到ffmpeg_vs2019\msvc\include

(4)AMF 头文件

??AMP仓库 https://github.com/GPUOpen-LibrariesAndSDKs/AMF
??clone代码

git clone https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git

??将AMF\amf\public\include里的两个文件夹复制到ffmpeg_vs2019\msvc\include\AMF

4、配置NASM、YASM

NASM下载地址:

??https://github.com/ShiftMediaProject/VSNASM/releases/tag/0.7
??如下图
在这里插入图片描述

YASM下载地址:

??https://github.com/ShiftMediaProject/VSYASM/releases

??将下载的VSNASM和VSYASM解压后放到
ffmpeg_vs2019\msvc目录。
??找到vs2019的命令行工具,
在这里插入图片描述

右键用管理员模式运行,cd到相应的路径,执行安装脚本,如下图
在这里插入图片描述

5、开始编译ffmpeg

??做好以上步骤后,用vs2019打开SMP目录的ffmpeg_deps.sln,一个47个项目,该工程对静态库、动态库、win32、x64都做了配置,很方便,如下图:
在这里插入图片描述

??例如我想编译x64版本的lib,不要dll,选择Debug x64,F7编译,19:11开始编译,19:30编译结束,大概20分钟,这只是Debug版本,编译Release估计还要20分钟, 例如我的生成结果:
在这里插入图片描述
??lib库路径
在这里插入图片描述
??以上生成的是debug lib,该项目对debug生成的文件加了后缀d, release的没有,比较好区分,可以看到libavformatd.lib有137M大小,在使用的不需要dll, 链接lib即可。
??如何使用这些lib呢,需要头文件,头文件目录如下:
在这里插入图片描述
??可以将上面路径的lib、include直接拷贝走,当作sdk.

??生成的ffmpeg.exe在如下目录
在这里插入图片描述
??可以看到ffmpegd.exe有90多M, 这种是静态编译的结果,使用时不需要依赖dll.

6、创建项目验证ffmpeg lib

??有了include、lib,创建vs2019 c++控制台项目,配置好include、lib, 就可以写代码了,例如获取ffmpeg代码版本:

/*

ffmpeg lib 测试程序

*/

#include <iostream>

extern "C"
{
#include "libavformat/avformat.h"
}

#ifdef _DEBUG
#pragma comment(lib, "libavformatd.lib")
#pragma comment(lib, "libavutild.lib")
#else
#pragma comment(lib, "libavformat.lib")
#pragma comment(lib, "libavutil.lib")
#endif

using namespace std;

int main()
{
    cout << av_version_info() << endl;

    return 0;
}

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

??如果想调试ffmpeg代码,把pdb文件带上,放到lib所在的目录就可以跟踪到ffmpeg源码了,如下图:
在这里插入图片描述

7、哪些项目用到了ffmpeg

??除了使用lib开发,也可以用dll, 修改编译选项位DebugDLL/ReleasdDLL即可,FFmpeg是开源项目,国内大部分的软件都进入了FFmpeg耻辱柱,没办法,音视频仅此一个伟大的集大成开源项目,很多软件都是编译ffmpeg lib后,自己封装dll,例如:

??腾讯会议
在这里插入图片描述

??迅雷
在这里插入图片描述

??也不是专指这两个项目,99%的音视频项目应该都会用到ffmpeg, 例如视频客户端优酷、爱奇艺、腾讯视频,格式工厂、QQ、微信、钉钉等。

??当然在开发时,如果需要265,vpx的支持也是可以的,在开发时带上相应的lib即可,如下图:
在这里插入图片描述

8、编译问题解决

??对于vs2019 ffmpeg编译有问题的可以加qq群894097803咨询我,也不是所有的问题我都能解决,我尽力而为,给ffmpeg爱好者一个交流平台。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:30:06  更:2021-11-28 11:30:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 19:50:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码