Win11+?VS2022編譯?FFmpeg6.0?靜態(tài)庫(kù)的詳細(xì)過(guò)程
編譯前言
編譯作為自己持有的穩(wěn)定版本 用來(lái)練習(xí),網(wǎng)上的編譯環(huán)境太雜太亂了,目前有個(gè)開(kāi)源項(xiàng)目致力解決ffmpeg編譯的問(wèn)題,暫時(shí)拿來(lái)用,如果這個(gè)項(xiàng)目不維護(hù)或者壞了,再考慮其他。
為什么項(xiàng)目編譯?
編譯作為自己持有的穩(wěn)定版本 用來(lái)練習(xí)
前期準(zhǔn)備
使用github 上 開(kāi)源項(xiàng)目的解決方案編譯
環(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..
進(jìn)入 source
目錄打開(kāi)git bash 克隆代碼
這里因?yàn)槲乙呀?jīng)git 拉到本地過(guò)了,所以報(bào)錯(cuò),不影響。
ffmpeg外部庫(kù)
代碼拉取完畢后 ,如果一切順利, /vs2022/source/FFmpeg/SMP
目錄可以查看readme.txt,里面介紹了如何編譯配置整個(gè)項(xiàng)目,包括外部庫(kù):x264、x264、vpx等,可以使用腳本下載,路徑 vs2022\source\FFmpeg\SMP\project_get_dependencies.bat
,感興趣可以看一下他這個(gè)bash腳本,它會(huì)按照腳本中配置的外部庫(kù)名字按順序拉取。如果萬(wàn)一下載失敗 ,可以根據(jù)輸出日志跟腳本內(nèi)容排查問(wèn)題,手動(dòng)下載或者重新運(yùn)行腳本。運(yùn)行情況如下:
好了經(jīng)過(guò)漫長(zhǎng)的下載與數(shù)次 .//project_get_dependencies.bat
,所有的庫(kù)也都下下來(lái)了。
額外的編譯選項(xiàng)-for渲染
根據(jù) readme.txt
先在 /vs2022/msvc/
下創(chuàng)建 include
目錄,include里創(chuàng)建 gl
、 AMF
兩個(gè)目錄,用來(lái)放 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整個(gè)文件夾放入 /vs2022/msvc/include/
下
ffnvcodec (需要nv-codec-headers)
a. nv-codec-headers\include
里的ffnvcodec目錄復(fù)制到 /vs2022/msvc/include
AMF sdk頭文件
a. AMF\amf\public\include
里的兩個(gè)文件夾復(fù)制到 /vs2022/msvc/include/AMF
中
編譯工具鏈
配置 NASM
、 YASM
,這兩個(gè)是匯編的編譯工具
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
同樣我們查看腳本可知它會(huì)根據(jù)不同VS的大版本去做適配安裝,我們的是VS2022,vs17,如果有報(bào)錯(cuò)可以往這方面去排查。執(zhí)行安裝
開(kāi)始編譯
到這一步,所有的準(zhǔn)備工作基本完成,打開(kāi)工程文件 FFMpeg/SMP/ffmpeg_deps.sln
step1. 選擇編譯類(lèi)型 Debug/Release Dll/lib
這里我們先選擇的Debug,因?yàn)橹皇蔷毩?xí)用,需要調(diào)試什么的。接下來(lái)就是直接生成了,生成時(shí)間稍微有點(diǎn)長(zhǎng),我這里10分鐘左右,而且中間果不其然出現(xiàn)了錯(cuò)誤。讓我們來(lái)分析一下:在libavcodec 編譯的過(guò)程中提示找不到好幾個(gè)宏 都是NV_ENC_PARAMS打頭的,我們找一下他的同類(lèi)型,大概是這么一個(gè)枚舉類(lèi)型
,這里我們替換一下ffnvcode的版本,退回到5月份的版本,跟ffmpeg6r1保持一致
重新生成就能成功了。
lib庫(kù)在`/msvc/lib/x64下面,我們可以看到生成的各種lib庫(kù)
step2. 打包SDK
把上述生成的include、lib打包帶走,直接放到應(yīng)用的項(xiàng)目下就可以直接用了
驗(yàn)證
#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__
結(jié)果如下,我們?cè)谶@里輸出了ffmpeg的編譯配置,可以看到 其他的一些基礎(chǔ)庫(kù)都是 enable
的狀態(tài),說(shuō)明都編進(jìn)去了,本次編譯宣告成功。如需要在項(xiàng)目中使用到這些外部庫(kù)諸如x265之類(lèi)的,在項(xiàng)目中加上這些庫(kù)的lib連接就可以。
結(jié)尾
如果上述方式失效了,要回到手動(dòng)編譯配置的老路子,臟路子,也不用慌,相信經(jīng)過(guò)這些配置編譯的歷程,作為開(kāi)發(fā)者的您也能輕松應(yīng)對(duì),處變不驚,將正確的東西放到正確的籃子里面。
最后,祝您在開(kāi)發(fā)者波瀾壯闊的coding生活里一切順利~
本文原創(chuàng)https://macrocyborg.site/article/07ab4b09-2b01-42c4-8faf-6c15c70b368a
參考鏈接
到此這篇關(guān)于Win11+ VS2022編譯 FFmpeg6.0 靜態(tài)庫(kù)的文章就介紹到這了,更多相關(guān)VS2022編譯 FFmpeg6.0 靜態(tài)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 實(shí)現(xiàn)多數(shù)的最大公約數(shù)的實(shí)例
這篇文章主要介紹了C++ 實(shí)現(xiàn)多數(shù)的最大公約數(shù)的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06C++之a(chǎn)ssert推薦用法及注意事項(xiàng)
這篇文章主要給大家介紹了關(guān)于C++之a(chǎn)ssert推薦用法及注意事項(xiàng)的相關(guān)資料,assert 是一個(gè)預(yù)處理宏,用于在運(yùn)行時(shí)檢查表達(dá)式是否為真,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07C++中的std::format?如何實(shí)現(xiàn)編譯期格式檢查
C++?20?的?std::format?是一個(gè)很神奇、很實(shí)用的工具,最神奇的地方在于它能在編譯期檢查字符串的格式是否正確,而且不需要什么特殊的使用方法,只需要像使用普通函數(shù)那樣傳參即可,這篇文章主要介紹了std::format?如何實(shí)現(xiàn)編譯期格式檢查,需要的朋友可以參考下2024-04-04深入理解C++模板如何實(shí)現(xiàn)多態(tài)思想
這篇文章主要為大家詳細(xì)介紹了C++模板如何實(shí)現(xiàn)多態(tài)的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們深入了解C++有一定的幫助,感興趣的可以了解一下2023-03-03使用C語(yǔ)言實(shí)現(xiàn)字符串逆序操作案例
這篇文章主要介紹了使用C語(yǔ)言實(shí)現(xiàn)字符串逆序操作案例,本文包含使用C語(yǔ)言的兩種方法去實(shí)現(xiàn),遞歸和非遞歸,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像直方圖均衡化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10