type
status
date
slug
summary
tags
category
icon
password
编译前言
编译作为自己持有的稳定版本 用来练习
网上有使用cygwin版本,在把ffmpeg作为静态库依赖的时候要添加iconv等其他的库,非常麻烦,有很长的打包链条,编译出来的库不能独自成军。
网上其他的编译环境也太杂太乱了,目前有个开源项目致力解决ffmpeg编译的问题,暂时拿来用,如果这个项目不维护或者坏了,再考虑其他。
为什么编译ffmpeg?
编译作为自己持有的稳定版本 用来练习ffmpeg的一些方法,音视频同步等操作。
前期准备
使用github 上 开源项目的解决方案编译
ShiftMediaProject
环境配置
先创建代码目录,作者建议的。
进入
source
目录打开git bash 克隆代码![notion image](http://img.macrocyborg.site/notion/ffmpeg_01.png)
这里因为我已经git 拉到本地过了,所以报错,不影响。
ffmpeg外部库
代码拉取完毕后 ,如果一切顺利,/vs2022/source/FFmpeg/SMP目录可以查看readme.txt,里面介绍了如何编译配置整个项目,包括外部库:x264、x264、vpx等,可以使用脚本下载,路径
vs2022\\source\\FFmpeg\\SMP\\project_get_dependencies.bat
,感兴趣可以看一下他这个bash脚本,它会按照脚本中配置的外部库名字按顺序
拉取。如果万一下载失败 ,可以根据输出日志跟脚本内容排查问题,手动下载或者重新运行脚本。运行情况如下:
![notion image](http://img.macrocyborg.site/notion/ffmpeg_02.png)
好了经过漫长的下载与数次执行
./project_get_dependencies.bat
,所有的库也都下下来了。
![notion image](http://img.macrocyborg.site/notion/webrtc_202308161606196.png)
额外的编译选项-for渲染
根据
readme.txt
先在/vs2022/msvc/
下创建include
目录,include里创建gl
、AMF
两个目录,用来放opengl
、nv-codec
、AMF
的头文件。![notion image](http://img.macrocyborg.site/notion/webrtc_202308161617777.png)
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
yasm
同样我们查看脚本可知它会根据不同VS的大版本去做适配安装,我们的是VS2022,vs17,如果有报错可以往这方面去排查。
执行安装
![notion image](http://img.macrocyborg.site/notion/ffmpeg_20230817.png)
开始编译
到这一步,所有的准备工作基本完成,打开工程文件
![notion image](https://img.macrocyborg.site/notion/ffmpeg20230817.png)
step1. 选择编译类型 Debug/Release Dll/lib
这里我们先选择的Debug,因为只是练习用,需要调试什么的。
接下来就是直接生成了,生成时间稍微有点长,我这里10分钟左右,而且中间果不其然出现了错误。
让我们来分析一下:
在libavcodec 编译的过程中提示找不到好几个宏 都是NV_ENC_PARAMS打头的,我们找一下他的同类型,大概是这么一个枚举类型
![notion image](https://img.macrocyborg.site/obsidian/ffmpeg_202308171436.png)
,这里我们替换一下ffnvcode的版本,退回到5月份的版本,跟ffmpeg6r1保持一致
![notion image](https://img.macrocyborg.site/obsidian/ffmpeg_202308171438234.png)
重新生成就能成功了。
![notion image](https://img.macrocyborg.site/obsidian/ffmpeg_202308171440847.png)
lib库在`/msvc/lib/x64下面,我们可以看到生成的各种lib库
![notion image](https://img.macrocyborg.site/obsidian/ffmpeg_202308171442765.png)
step2. 打包SDK
把上述生成的include、lib打包带走,直接放到应用的项目下就可以直接用了
![notion image](https://img.macrocyborg.site/obsidian/ffmpeg_202308171446839.png)
验证
![notion image](https://img.macrocyborg.site/obsidian/ffmpeg_202308171514273.png)
结果如下,我们在这里输出了ffmpeg的编译配置,可以看到 其他的一些基础库都是
enable
的状态,说明都编进去了,本次编译宣告成功。如需要在项目中使用到这些外部库诸如x265之类的,在项目中加上这些库的lib连接就可以。![notion image](https://img.macrocyborg.site/obsidian/ffmpeg_202308171513976.png)
结尾
如果上述方式失效了,要回到手动编译配置的老路子,脏路子,也不用慌,相信经过这些配置编译的历程,作为老手,相信诸君也能轻松应对,处变不惊,将正确的东西放到正确的篮子里面。
最后,感谢你的阅读,若能带来些许启发就更好了,与君共勉。
参考链接:
1.CSDN令狐掌门