Windows下搭建FFmpeg開(kāi)發(fā)調(diào)試環(huán)境的詳細(xì)步驟
背景
如果你是一個(gè)FFmpeg的使用者,那么絕大部分情況下只需要在你的程序中引用FFmpeg的libav*
相關(guān)的頭文件,然后在編譯階段鏈接相關(guān)的庫(kù)即可。
但是如果你想調(diào)試FFmpeg內(nèi)部相關(guān)的邏輯,或者分析FFmpeg源碼,那么有一個(gè)可供單步調(diào)試FFmpeg的環(huán)境往往能使你事半功倍!
要說(shuō)Windows下做C/C++開(kāi)發(fā)用哪個(gè)IDE最強(qiáng)大,我想我的答案是Visual Studio。
要說(shuō)Windows下怎么快速構(gòu)建FFmpeg的VS項(xiàng)目,我首推ShiftMediaProject(下面都簡(jiǎn)稱(chēng) SMP)開(kāi)源項(xiàng)目:SMP GitHub
關(guān)于ShiftMediaProject 的更多相關(guān)信息,大家可以直接訪(fǎng)問(wèn)其官網(wǎng)。
步驟
接下來(lái)我將以VS2017為例
一步步介紹怎么搭建一個(gè)可供單步調(diào)試的FFmpeg項(xiàng)目
※ 注:在此之前請(qǐng)確保你電腦的網(wǎng)絡(luò)環(huán)境能正常訪(fǎng)問(wèn)GitHub.
一、安裝VS 2017
先安裝VS 2017,安裝步驟非本文重點(diǎn),此處不做贅述
但是有一點(diǎn)需要注意的是:安裝時(shí)需勾選C++環(huán)境和Windows SDK 8.1
二、安裝 YASM 與 NASM
由于FFmpeg的源碼有部分需要匯編支持,所以需要先安裝好YASM/NASM的VS版本,這一點(diǎn)SMP官方團(tuán)隊(duì)也很貼心地幫我們做好:
先直接下載對(duì)應(yīng)如下兩個(gè)鏈接的VSYASM.zip
和VSNASM.zip
:
https://github.com/ShiftMediaProject/VSNASM/releases
https://github.com/ShiftMediaProject/VSYASM/releases
下載完成后:
?? 解壓VSYASM.zip
,右鍵install_script.bat
選擇以管理員身份運(yùn)行,等待安裝完成:
?? 解壓VSNASM.zip
,右鍵install_script.bat
選擇以管理員身份運(yùn)行,等待安裝完成:
?? TL;DR
接下來(lái)的步驟會(huì)比較煩瑣,經(jīng)過(guò)多次實(shí)踐我已經(jīng)寫(xiě)好了一鍵部署腳本,可供大家快速部署能直接編譯成功的項(xiàng)目。
如果不想理這些煩瑣的細(xì)節(jié),想直接使用一鍵部署腳本的讀者
?? 可直接跳到文章最后面的 一鍵部署腳本 章節(jié)
三、創(chuàng)建正確的目錄層次
我剛開(kāi)始用SMP項(xiàng)目的時(shí)候總是對(duì)它的目錄層級(jí)結(jié)構(gòu)感到困惑,編譯之后都找不著輸出目錄。
經(jīng)過(guò)多次踩坑實(shí)踐,再結(jié)合官方README的說(shuō)明,實(shí)踐出比較好的目錄層次應(yīng)該是如下:
- ffmpeg_smp_vs // 假設(shè)你的項(xiàng)目文件夾叫 ffmpeg_smp_vs - source // 創(chuàng)建source子文件夾,用于放SMP相關(guān)源碼 - msvc // 自動(dòng)生成,存放SMP編譯生成的目標(biāo)文件等
Q: 為什么要建立兩層目錄結(jié)構(gòu)?
A: 因?yàn)镾MP項(xiàng)目為了不讓生成的文件落在源碼目錄下造成“污染”,把輸出目錄定在源碼目錄同層級(jí)的msvc
目錄下。
如果你直接把源碼下載到ffmpeg_smp_vs
目錄下,會(huì)導(dǎo)致最后生成的msvc
目錄跑到了ffmpeg_smp_vs
目錄外面去,不是很美觀(guān)。
因此,把源碼目錄和生成目錄都放在統(tǒng)一的ffmpeg_smp_vs
目錄下是比較好的實(shí)踐。
四、下載源碼和相關(guān)依賴(lài)
假設(shè)你已經(jīng)按步驟三創(chuàng)建好了相應(yīng)的文件夾
就可以開(kāi)始下載SMP源碼及其相關(guān)依賴(lài)了
注:以下操作均在Windows CMD命令行工具中執(zhí)行
※ 下載SMP源碼:
cd ffmpeg_smp_vs\source git clone https://github.com/ShiftMediaProject/FFmpeg.git
※ 運(yùn)行腳本下載相關(guān)依賴(lài)庫(kù):
cd ffmpeg_smp_vs\source\FFmpeg\SMP project_get_dependencies.bat /Y
下載的依賴(lài)庫(kù)比較多,請(qǐng)耐心等待。若中途有出現(xiàn)錯(cuò)誤或者中斷,請(qǐng)?jiān)俅螆?zhí)行上面最后一句腳本直到所有依賴(lài)庫(kù)都順利下載完成。
※ 下載第三方庫(kù)的頭文件:
?? AMF 頭文件
先獲得AMF倉(cāng)庫(kù)代碼
https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git
再把 AMF\amf\public\include\
下的所有子文件夾復(fù)制到 ffmpeg_smp_vs\msvc\include\AMF
下(目錄不存在的話(huà)請(qǐng)自行創(chuàng)建)
?? ffnvcodec 頭文件
先獲得ffnvcodec倉(cāng)庫(kù)代碼
git clone https://github.com/FFmpeg/nv-codec-headers.git
再把 nv-codec-headers\include\ffnvcodec\
下的所有頭文件復(fù)制到 ffmpeg_smp_vs\msvc\include\ffnvcodec
下(目錄不存在的話(huà)請(qǐng)自行創(chuàng)建)
?? OpenGL 頭文件
下載如下2個(gè)頭文件放置到ffmpeg_smp_vs\msvc\include\gl
下(目錄不存在的話(huà)請(qǐng)自行創(chuàng)建)
https://www.khronos.org/registry/OpenGL/api/GL/glext.h
https://www.khronos.org/registry/OpenGL/api/GL/wglext.h
?? EGL 頭文件
下載下面這個(gè)頭文件放置到ffmpeg_smp_vs\msvc\include\KHR
下(目錄不存在的話(huà)請(qǐng)自行創(chuàng)建)
https://www.khronos.org/registry/EGL/api/KHR/khrplatform.h
五、編譯與調(diào)試
※ 編譯
進(jìn)入文件夾:ffmpeg_smp_vs\source\FFmpeg\SMP
雙擊打開(kāi)ffmpeg_deps.sln
右鍵整個(gè)解決方案 -> 點(diǎn)擊生成解決方案
編譯較耗時(shí),請(qǐng)耐心地等待編譯完成 ? ..
若編譯失敗,請(qǐng)仔細(xì)檢查前面的步驟,或者給我留言
※ 調(diào)試
由于SMP默認(rèn)調(diào)試目標(biāo)路徑設(shè)置有誤(至少截止我寫(xiě)這篇文章的時(shí)候是這樣 | 2021/12/09),所以我們需要修改一下三個(gè)可執(zhí)行文件ffmpeg
/ffprobe
/ffplay
的調(diào)試路徑,以ffmpeg
為例(另外2個(gè)都是這么改):
?? 右鍵Programs
目錄下的ffmpeg
-> 選屬性
?? 將配置屬性->調(diào)試->命令 一行的$(TargetPath)
修改為:$(OutDir)\bin\x64\$(TargetName)$(TargetExt)
?? 以調(diào)試ffmpeg
為例,將ffmpeg
設(shè)置為啟動(dòng)項(xiàng)目
?? 在ffmpeg.c
的main()
函數(shù)入口處打好斷點(diǎn),按F5開(kāi)啟愉快的調(diào)試學(xué)習(xí)之旅~
關(guān)于Visual Studio的調(diào)試技巧非本文重點(diǎn),請(qǐng)自行搜索
?? 一鍵部署腳本
為方便大家快速部署一個(gè)可成功編譯的FFmpeg VS 2017項(xiàng)目,避免在各種配置上踩坑浪費(fèi)時(shí)間,我寫(xiě)了個(gè)一鍵部署的腳本供大家使用,前提是你要完成上述的步驟一和步驟二再進(jìn)行這一步。
?? 先下載下面?zhèn)}庫(kù):
git clone https://github.com/Suiyek/OneKeySetupSMP.git
?? 創(chuàng)建你的工程目錄,如D:\Code\ffmpeg_smp_vs
?? 把init_smp_proj.bat
復(fù)制到你的工程目錄下
?? 雙擊運(yùn)行腳本,等待運(yùn)行完成
?? 好了,接下來(lái)只需要參考步驟五即可
到此這篇關(guān)于Windows下搭建FFmpeg開(kāi)發(fā)調(diào)試環(huán)境的文章就介紹到這了,更多相關(guān)Windows FFmpeg環(huán)境搭建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++中的單例類(lèi)模板的實(shí)現(xiàn)方法詳解
這篇文章主要介紹了c++中的單例類(lèi)模板的實(shí)現(xiàn)方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03《戰(zhàn)狼》中兩軍作戰(zhàn)入侵代碼竟然是輸出星期幾的!
這篇文章主要介紹了《戰(zhàn)狼》中兩軍作戰(zhàn)入侵代碼竟然是輸出星期幾的,喜歡戰(zhàn)狼和編程的同學(xué)可以了解下。2017-11-11C語(yǔ)言實(shí)現(xiàn)輸入一個(gè)字符串后打印出該字符串中字符的所有排列
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)輸入一個(gè)字符串后打印出該字符串中字符的所有排列的方法,是數(shù)學(xué)中非常實(shí)用的排列算法,需要的朋友可以參考下2014-09-09C語(yǔ)言如何利用ASCII碼表統(tǒng)計(jì)字符串每個(gè)字符出現(xiàn)的次數(shù)
這篇文章主要介紹了C語(yǔ)言如何利用ASCII碼表統(tǒng)計(jì)字符串每個(gè)字符出現(xiàn)的次數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01C語(yǔ)言深入分析整形數(shù)據(jù)存儲(chǔ)
C語(yǔ)言中,我們經(jīng)常使用數(shù)據(jù)類(lèi)型,那么整形數(shù)據(jù)在內(nèi)存中如何存儲(chǔ)?存儲(chǔ)方式是什么?如果你對(duì)這些內(nèi)容不太了解的話(huà),相信看完這篇博客后,你會(huì)對(duì)整形數(shù)據(jù)的存儲(chǔ)有一個(gè)新的認(rèn)識(shí)。話(huà)不多說(shuō),我們進(jìn)入正題2022-08-08C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配詳解
這篇文章主要介紹了C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C++實(shí)現(xiàn)LeetCode(85.最大矩形)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(85.最大矩形),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言實(shí)現(xiàn)文件內(nèi)容的加密與解密
文件內(nèi)容需要加密與解密功能的原因主要有兩個(gè)方面:保護(hù)數(shù)據(jù)安全和確保數(shù)據(jù)完整性,所以接下來(lái)小編就給大家介紹一下如何通過(guò)C語(yǔ)言實(shí)現(xiàn)文件內(nèi)容加密與解密,需要的朋友可以參考下2023-08-08