背景
如果你是一個FFmpeg的使用者,那么絕大部分情況下只需要在你的程序中引用FFmpeg的libav*相關的頭文件,然后在編譯階段鏈接相關的庫即可。
但是如果你想調試FFmpeg內部相關的邏輯,或者分析FFmpeg源碼,那么有一個可供單步調試FFmpeg的環境往往能使你事半功倍!
要說Windows下做C/C++開發用哪個IDE最強大,我想我的答案是Visual Studio。
要說Windows下怎么快速構建FFmpeg的VS項目,我首推ShiftMediaProject(下面都簡稱 SMP)開源項目:SMP GitHub
關於ShiftMediaProject 的更多相關信息,大家可以直接訪問其官網。
步驟
接下來我將以VS2017為例
一步步介紹怎么搭建一個可供單步調試的FFmpeg項目
※ 注:在此之前請確保你電腦的網絡環境能正常訪問GitHub.
一、安裝VS 2017
先安裝VS 2017,安裝步驟非本文重點,此處不做贅述
但是有一點需要注意的是:安裝時需勾選C++環境和Windows SDK 8.1

二、安裝 YASM 與 NASM
由於FFmpeg的源碼有部分需要匯編支持,所以需要先安裝好YASM/NASM的VS版本,這一點SMP官方團隊也很貼心地幫我們做好:
先直接下載對應如下兩個鏈接的VSYASM.zip和VSNASM.zip:
- https://github.com/ShiftMediaProject/VSNASM/releases
- https://github.com/ShiftMediaProject/VSYASM/releases
下載完成后:
👉 解壓VSYASM.zip,右鍵install_script.bat選擇以管理員身份運行,等待安裝完成:

👉 解壓VSNASM.zip,右鍵install_script.bat選擇以管理員身份運行,等待安裝完成:

🙂 TL;DR
接下來的步驟會比較煩瑣,經過多次實踐我已經寫好了一鍵部署腳本,可供大家快速部署能直接編譯成功的項目。
如果不想理這些煩瑣的細節,想直接使用一鍵部署腳本的讀者
⏭️ 可直接跳到文章最后面的 一鍵部署腳本 章節
三、創建正確的目錄層次
我剛開始用SMP項目的時候總是對它的目錄層級結構感到困惑,編譯之后都找不着輸出目錄。
經過多次踩坑實踐,再結合官方README的說明,實踐出比較好的目錄層次應該是如下:
- ffmpeg_smp_vs // 假設你的項目文件夾叫 ffmpeg_smp_vs
- source // 創建source子文件夾,用於放SMP相關源碼
- msvc // 自動生成,存放SMP編譯生成的目標文件等
Q: 為什么要建立兩層目錄結構?
A: 因為SMP項目為了不讓生成的文件落在源碼目錄下造成“污染”,把輸出目錄定在源碼目錄同層級的msvc目錄下。
如果你直接把源碼下載到ffmpeg_smp_vs目錄下,會導致最后生成的msvc目錄跑到了ffmpeg_smp_vs目錄外面去,不是很美觀。
因此,把源碼目錄和生成目錄都放在統一的ffmpeg_smp_vs目錄下是比較好的實踐。
四、下載源碼和相關依賴
假設你已經按步驟三創建好了相應的文件夾
就可以開始下載SMP源碼及其相關依賴了
注:以下操作均在Windows CMD命令行工具中執行
※ 下載SMP源碼:
cd ffmpeg_smp_vs\source
git clone https://github.com/ShiftMediaProject/FFmpeg.git
※ 運行腳本下載相關依賴庫:
cd ffmpeg_smp_vs\source\FFmpeg\SMP
project_get_dependencies.bat /Y
下載的依賴庫比較多,請耐心等待。若中途有出現錯誤或者中斷,請再次執行上面最后一句腳本直到所有依賴庫都順利下載完成。
※ 下載第三方庫的頭文件:
👉 AMF 頭文件
先獲得AMF倉庫代碼
https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git
再把 AMF\amf\public\include\ 下的所有子文件夾復制到 ffmpeg_smp_vs\msvc\include\AMF 下(目錄不存在的話請自行創建)
👉 ffnvcodec 頭文件
先獲得ffnvcodec倉庫代碼
git clone https://github.com/FFmpeg/nv-codec-headers.git
再把 nv-codec-headers\include\ffnvcodec\ 下的所有頭文件復制到 ffmpeg_smp_vs\msvc\include\ffnvcodec 下(目錄不存在的話請自行創建)
👉 OpenGL 頭文件
下載如下2個頭文件放置到ffmpeg_smp_vs\msvc\include\gl下(目錄不存在的話請自行創建)
https://www.khronos.org/registry/OpenGL/api/GL/glext.h
https://www.khronos.org/registry/OpenGL/api/GL/wglext.h
👉 EGL 頭文件
下載下面這個頭文件放置到ffmpeg_smp_vs\msvc\include\KHR下(目錄不存在的話請自行創建)
https://www.khronos.org/registry/EGL/api/KHR/khrplatform.h
五、編譯與調試
※ 編譯
進入文件夾:ffmpeg_smp_vs\source\FFmpeg\SMP
雙擊打開ffmpeg_deps.sln
右鍵整個解決方案 -> 點擊生成解決方案

編譯較耗時,請耐心地等待編譯完成 ☕ ..
若編譯失敗,請仔細檢查前面的步驟,或者給我留言
※ 調試
由於SMP默認調試目標路徑設置有誤(至少截止我寫這篇文章的時候是這樣 | 2021/12/09),所以我們需要修改一下三個可執行文件ffmpeg/ffprobe/ffplay的調試路徑,以ffmpeg為例(另外2個都是這么改):
👉 右鍵Programs目錄下的ffmpeg -> 選屬性

👉 將配置屬性->調試->命令 一行的$(TargetPath)修改為:$(OutDir)\bin\x64\$(TargetName)$(TargetExt)
👉 以調試ffmpeg為例,將ffmpeg設置為啟動項目

👉 在ffmpeg.c的main()函數入口處打好斷點,按F5開啟愉快的調試學習之旅~

關於Visual Studio的調試技巧非本文重點,請自行搜索
⏭️ 一鍵部署腳本
為方便大家快速部署一個可成功編譯的FFmpeg VS 2017項目,避免在各種配置上踩坑浪費時間,我寫了個一鍵部署的腳本供大家使用,前提是你要完成上述的步驟一和步驟二再進行這一步。
👉 先下載下面倉庫:
git clone https://github.com/Suiyek/OneKeySetupSMP.git
👉 創建你的工程目錄,如D:\Code\ffmpeg_smp_vs
👉 把init_smp_proj.bat復制到你的工程目錄下
👉 雙擊運行腳本,等待運行完成
👉 好了,接下來只需要參考步驟五即可
_ 歡迎關注我的公眾號音視頻開發札記

