Win11+?VS2022編譯?FFmpeg6.0?靜態(tài)庫的詳細過程
編譯前言
編譯作為自己持有的穩(wěn)定版本 用來練習,網(wǎng)上的編譯環(huán)境太雜太亂了,目前有個開源項目致力解決ffmpeg編譯的問題,暫時拿來用,如果這個項目不維護或者壞了,再考慮其他。
為什么項目編譯?
編譯作為自己持有的穩(wěn)定版本 用來練習
前期準備
使用github 上 開源項目的解決方案編譯
環(huán)境配置
先創(chuàng)建代碼目錄,作者建議的。
*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 克隆代碼
這里因為我已經(jīng)git 拉到本地過了,所以報錯,不影響。
ffmpeg外部庫
代碼拉取完畢后 ,如果一切順利, /vs2022/source/FFmpeg/SMP
目錄可以查看readme.txt,里面介紹了如何編譯配置整個項目,包括外部庫:x264、x264、vpx等,可以使用腳本下載,路徑 vs2022\source\FFmpeg\SMP\project_get_dependencies.bat
,感興趣可以看一下他這個bash腳本,它會按照腳本中配置的外部庫名字按順序拉取。如果萬一下載失敗 ,可以根據(jù)輸出日志跟腳本內(nèi)容排查問題,手動下載或者重新運行腳本。運行情況如下:
好了經(jīng)過漫長的下載與數(shù)次 .//project_get_dependencies.bat
,所有的庫也都下下來了。
額外的編譯選項-for渲染
根據(jù) readme.txt
先在 /vs2022/msvc/
下創(chuàng)建 include
目錄,include里創(chuàng)建 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
同樣我們查看腳本可知它會根據(jù)不同VS的大版本去做適配安裝,我們的是VS2022,vs17,如果有報錯可以往這方面去排查。執(zhí)行安裝
開始編譯
到這一步,所有的準備工作基本完成,打開工程文件 FFMpeg/SMP/ffmpeg_deps.sln
step1. 選擇編譯類型 Debug/Release Dll/lib
這里我們先選擇的Debug,因為只是練習用,需要調(diào)試什么的。接下來就是直接生成了,生成時間稍微有點長,我這里10分鐘左右,而且中間果不其然出現(xiàn)了錯誤。讓我們來分析一下:在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
的狀態(tài),說明都編進去了,本次編譯宣告成功。如需要在項目中使用到這些外部庫諸如x265之類的,在項目中加上這些庫的lib連接就可以。
結尾
如果上述方式失效了,要回到手動編譯配置的老路子,臟路子,也不用慌,相信經(jīng)過這些配置編譯的歷程,作為開發(fā)者的您也能輕松應對,處變不驚,將正確的東西放到正確的籃子里面。
最后,祝您在開發(fā)者波瀾壯闊的coding生活里一切順利~
本文原創(chuàng)https://macrocyborg.site/article/07ab4b09-2b01-42c4-8faf-6c15c70b368a
參考鏈接
到此這篇關于Win11+ VS2022編譯 FFmpeg6.0 靜態(tài)庫的文章就介紹到這了,更多相關VS2022編譯 FFmpeg6.0 靜態(tài)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++ 實現(xiàn)多數(shù)的最大公約數(shù)的實例
這篇文章主要介紹了C++ 實現(xiàn)多數(shù)的最大公約數(shù)的實例的相關資料,需要的朋友可以參考下2017-06-06C++中的std::format?如何實現(xiàn)編譯期格式檢查
C++?20?的?std::format?是一個很神奇、很實用的工具,最神奇的地方在于它能在編譯期檢查字符串的格式是否正確,而且不需要什么特殊的使用方法,只需要像使用普通函數(shù)那樣傳參即可,這篇文章主要介紹了std::format?如何實現(xiàn)編譯期格式檢查,需要的朋友可以參考下2024-04-04