vs2015編譯調(diào)試ffmpg

我在網(wǎng)上找到的最好的教程,按照步驟就運(yùn)行起來了。而且教程里說到的編譯錯(cuò)誤基本也都遇到了,精準(zhǔn)解決問題點(diǎn)。
原文:https://www.cnblogs.com/BensonLaur/p/10989115.html

由于下面粘貼的圖片可能顯示不出來,所以情況上面的原文地址。

|

 ffmpeg 是音頻處理方面非常強(qiáng)大非常有名的開源項(xiàng)目了,然而如 雷神 所說,“FFMPEG 難度比較大,卻沒有一個(gè)循序漸進(jìn),由簡單到復(fù)雜的教程。現(xiàn)在網(wǎng)上的有關(guān)FFMPEG的教程多半難度比較大,不太適合剛接觸 FFMPEG 的人學(xué)習(xí);而且很多的例子程序編譯通不過,極大地打消了學(xué)習(xí)的積極性,對(duì)于平時(shí)只習(xí)慣在 Windows 下開發(fā)的初學(xué)者來說,從零開始了解相關(guān)依賴,搭建起項(xiàng)目并調(diào)試 ffmpeg 并不是件容易的事,好在另一個(gè)非官方的 開源項(xiàng)目,提供了一整套 Windows 下,用 VS 來調(diào)試 ffmpeg 的解決方案——Shift Media Project

**本文使用最新版本的 ShiftMediaProject 的代碼(20191015),展示在Windows10 下使用 VS2015 下載代碼并成功編譯的過程。在另一篇本文參考的 博文 中亦介紹了整個(gè)過程,不過由于是 **20180307 寫的,有些新的內(nèi)容沒有覆蓋到,這里可當(dāng)做是對(duì)其進(jìn)行補(bǔ)充和拓展。同時(shí)也作為個(gè)人筆記分享出來,希望能幫助到更多剛好有需求的人。****

|


| 目錄 |

  1. 工具準(zhǔn)備
  2. 下載源代碼
  3. 按項(xiàng)目指引下載相關(guān)依賴
  4. 使用VS編譯ffmpeg
  5. 編譯與運(yùn)行

|

1、工具準(zhǔn)備

本文測試使用環(huán)境:

操作系統(tǒng):Windows 10

編譯使用開發(fā)環(huán)境:Visual Studio 2015

下載源代碼工具:git 客戶端

(ffmpeg 的編譯要求編譯器對(duì) C99 標(biāo)準(zhǔn)的支持。VS 中默認(rèn)只有 VS2013 以及更新的版本對(duì) C99 標(biāo)準(zhǔn)提供了支持,所以只能使用 VS2013 之后的版本,如果要使用更前版本,那么就得自己在 VS 先添加 C99 標(biāo)準(zhǔn)的支持)

2、下載源代碼

項(xiàng)目地址:https://github.com/ShiftMediaProject/FFmpeg

需要注意的是,克隆到本地的目標(biāo)項(xiàng)目目錄 至少需要有2層,因?yàn)槠谕捻?xiàng)目的結(jié)構(gòu)是這樣子的:

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;">- msvc (OutputDir)                (該項(xiàng)目默認(rèn)的 VS 編譯輸出的目錄) - source                      (這個(gè)是需要的上一級(jí)目錄,待會(huì)下載的依賴項(xiàng)目有很多,十幾二十來個(gè)依賴項(xiàng)目都會(huì)下載到這里)- FFmpeg                    (這個(gè)是 clone 到本地的項(xiàng)目目錄)- ..Any other libraries source code.. (其他的十幾二十個(gè)依賴的項(xiàng)目)</pre>

準(zhǔn)備好文件夾后,比如這里上面的 "source" 文件夾,在這個(gè)文件夾下,克隆代碼下來

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;">git clone https://github.com/ShiftMediaProject/FFmpeg.git</pre>

3、按項(xiàng)目指引下載相關(guān)依賴

所有的 VS 項(xiàng)目相關(guān)的文件,都在 SMP 文件夾下,仔細(xì)查看該目錄下的 readme 文件內(nèi)容,按里面的說明進(jìn)行。

image

readme

按照 readme 說明,接下來:

下載項(xiàng)目中默認(rèn)提供的其他依賴的 git 項(xiàng)目

ShiftMediaProject 使用默認(rèn)的配置生成了一些項(xiàng)目文件,這些文件可以使用 VS 打開,同時(shí)需要依賴特定的額外的項(xiàng)目,才能進(jìn)一步編譯。

依賴的項(xiàng)目包括:

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;"> bzlib iconv zlib lzma libxml2 sdl2 libmp3lame libvorbis libspeex libopus
libilbc libtheora libx264 libx265 libxvid libvpx libgme libmodplug libsoxr libfreetype
fontconfig libfribidi libass gnutls libgcrypt libssh libcdio libcdio_paranoia
libbluray opengl ffnvcodec libmfx</pre>

上面大部分的依賴項(xiàng)目都被放在了 ShiftMediaProject 用戶的 git 倉庫 了,這些都可以手動(dòng)下載,當(dāng)然強(qiáng)烈建議還是使用 FFmpeg\SMP**project_get_dependencies.bat **批處理自動(dòng)clone下載,這個(gè)腳本不僅僅可在第一次用于clone項(xiàng)目(及其本身依賴的其他git項(xiàng)目),還可以在后面任何時(shí)候執(zhí)行,用來自動(dòng)更新各自最新的版本

所以,雙擊執(zhí)行 “project_get_dependencies.bat” 批處理,等待一段 **較長的時(shí)間 **的下載,即可完成大部分依賴庫的下載

額外下載其他依賴的文件

大部分需要的依賴(及其自身的依賴)都可以在 ShiftMediaProject 下的倉庫找到,不過編譯還需要下載其他外部文件。

下面列出了需要額外下載的文件,以及對(duì)應(yīng)需要下載到的目標(biāo)目錄

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;"> 1) opengl (requires glext)
a) Download glext.h and wglext.h from opengl.org.        
b) Save the header files into "OutputDir/include/gl/".
c) Download khrplatform.h from khronos.org
d) Save the header file into "
OutputDir/include/KHR/".
2) ffnvcodec (requires nv-codec-headers)
a) Download the nv-codec-headers repository from https://github.com/FFmpeg/nv-codec-headers
b) Save the contents of the nv-codec-headers repositories "include" folder into "
OutputDir/include/".
3) AMF (requires Advanced Media Framework (AMF) SDK headers)
a) Download the AMF repository from https://github.com/GPUOpen-LibrariesAndSDKs/AMF
b) Save the contents of the AMF repositories "
amf/public/include
" into "OutputDir/include/AMF/**".</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

1、下載 opengl 的 glext.hwglext.h 到 " *OutputDir/include/gl/ **"          ?。ㄏ螺d點(diǎn) 這里

2、下載 opengl 的 **khrplatform.h **到 " *OutputDir/include/KHR/ **"            ?。ㄏ螺d點(diǎn) 這里

3、下載 nv-codec-headers 項(xiàng)目的 **"include" **文件夾下的內(nèi)容到 " *OutputDir/include/ **"  ?。╣it 項(xiàng)目點(diǎn) 這里

4、下載 AMF 項(xiàng)目的 "amf/public/include" 文件夾下的內(nèi)容到 " *OutputDir/include/AMF/ **" (git 項(xiàng)目點(diǎn) 這里)

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;">OutputDir 是在項(xiàng)目屬性里指定了的 “輸出目錄 ”
默認(rèn)的項(xiàng)目輸出目錄是相對(duì)于 FFmpeg 源代碼目錄的 “....\msvc

一個(gè)預(yù)期的目錄結(jié)構(gòu)如下,(這個(gè)也是前面 2、下載源代碼 步驟中提到的文件結(jié)構(gòu)) </pre>

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;">- msvc (OutputDir)                (該項(xiàng)目默認(rèn)的 VS 編譯輸出的目錄)

  • source                      (這個(gè)是需要的上一級(jí)目錄,待會(huì)下載的依賴項(xiàng)目有很多,十幾二十來個(gè)依賴項(xiàng)目都會(huì)下載到這里)
      - FFmpeg                    (這個(gè)是 clone 到本地的項(xiàng)目目錄)
      - ..Any other libraries source code.. (其他的十幾二十個(gè)依賴的項(xiàng)目)</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

所以,如上創(chuàng)建 msvc 目錄,按步驟創(chuàng)建文件夾并下載對(duì)應(yīng)文件(想偷懶的可以直接點(diǎn)擊我下載后打包的 msvc.zip

image

4、使用 VS 編譯 ffmpeg

下載完了項(xiàng)目依賴的其他 git 項(xiàng)目 和 頭文件之后,就可以使用 VS 打開** FFmpeg\SMP\ffmpeg_deps.sln **項(xiàng)目文件了

初次打開項(xiàng)目,如果缺少 Win10 SDK 相關(guān)組件,會(huì)有類似下圖提示

image

點(diǎn)擊 “安裝” ,關(guān)閉VS后,等待其安裝完畢。

image
image

實(shí)際上,如上 “安裝的缺少的功能” 后,重新用 VS 打開項(xiàng)目,還是會(huì)提示一些項(xiàng)目 (不可用) 或 (加載失敗),還是無法 “重新加載項(xiàng)目

image

因?yàn)槭褂?msvc 來編譯 ffmpeg 還需要 安裝 NASM 才能編譯所有的匯編文件。ShiftMediaProject 為編譯 ffmpeg 提供的自定義構(gòu)建項(xiàng)【nasm / yasm】默認(rèn) VS是沒有支持的,所以最后一步就是為 VS 添加自定構(gòu)建項(xiàng)

為 VS添加自定構(gòu)建項(xiàng) NASM

ShiftMediaProject 提供了自動(dòng)下載和安裝 NASM 的安裝腳本,下載地址為: https://github.com/ShiftMediaProject/VSNASM/releases/latest

下載完后,注意最好 不要 直接運(yùn)行 install_script.bat

image

最好是先 以管理員身份,在預(yù)設(shè)好 VS 相關(guān)變量的腳本環(huán)境中 (開發(fā)者命令行 / dev command line),運(yùn)行該 install_script.bat 腳本

image

若執(zhí)行成功,沒有任何失敗提示,便算是安裝完成了

如果直接運(yùn)行,由于執(zhí)行腳本環(huán)境沒有先預(yù)設(shè) VCINSTALLDIR 等變量,可能會(huì)出現(xiàn)如下錯(cuò)誤(一開始我直接運(yùn)行遇到的,后來經(jīng) BesLyric 項(xiàng)目 的一個(gè)合作開發(fā)的伙伴提醒才意識(shí)到先運(yùn)行VS開發(fā)者命令行)。

出錯(cuò)與解決 (一般在開發(fā)者命令行執(zhí)行則不會(huì)有以下問題,這里保留記錄以供參考)

這一步出現(xiàn)的2個(gè)錯(cuò)誤是:

(1)無法下載 vswhere.exe 到當(dāng)前目錄

image

(2) 在構(gòu)建 .......\VC\bin\amd64\vcvars64.bat 文件的路徑時(shí), 構(gòu)建出一個(gè)不存在的路徑,導(dǎo)致腳本嘗試執(zhí)行 vcvars64.bat 時(shí)出錯(cuò)

image

第一個(gè)錯(cuò)誤還好解決,直接手動(dòng)復(fù)制鏈接到瀏覽器下載 https://github.com/Microsoft/vswhere/releases/download/2.5.9/vswhere.exe ,然后放在 **install_script.bat **同一目錄即可

第二個(gè)錯(cuò)誤就需要手動(dòng)改 **install_script.bat **文件了

經(jīng)過調(diào)試發(fā)現(xiàn),在如下 批處理中:

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;">REM Call the required vcvars file in order to setup up build locations if "%MSVC_VER%"=="16" (
set VCVARS=%VSINSTANCEDIR%\VC\Auxiliary\Build\vcvars%SYSARCH%.bat
) else if "%MSVC_VER%"=="15" (
set VCVARS=%VSINSTANCEDIR%\VC\Auxiliary\Build\vcvars%SYSARCH%.bat
) else if "%MSVC_VER%"=="14" (
set VCVARS=%VSINSTANCEDIR%\VC\bin%MSVCVARSDIR%\vcvars%SYSARCH%.bat
) else if "%MSVC_VER%"=="12" (
set VCVARS=%VSINSTANCEDIR%\VC\bin%MSVCVARSDIR%\vcvars%SYSARCH%.bat
) else ( echo Error: Invalid MSVC version! goto Terminate
)</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

構(gòu)建的變量 %VCVARS% 沒有達(dá)到預(yù)期值,通過打印相關(guān)變量(使用 echo 指令),打印出該變量的結(jié)果是:

image

而經(jīng)過查找,我VS環(huán)境中的 vcvars64.bat 實(shí)際路徑為: "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat", 可能是之前安裝VS沒有按默認(rèn)路徑安裝導(dǎo)致(?)

于是針對(duì)我個(gè)人的環(huán)境情況,根據(jù)自己的 vcvars64.bat 腳本的位置,根據(jù)我只需要成功為 VS2015 安裝這個(gè)自定義構(gòu)建項(xiàng)的需要,我做了如下修改:

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;">//由于VS2015會(huì)經(jīng)過 "%MSVC_VER%"=="14" 的分支,所以我將原先構(gòu)建的邏輯注釋掉(使用 REM),然后直接指定我VS2015 對(duì)應(yīng)的 vcvars64.bat 文件的路徑</pre>

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;"> REM Call the required vcvars file in order to setup up build locations
if "%MSVC_VER%"=="16" (
set VCVARS=%VSINSTANCEDIR%\VC\Auxiliary\Build\vcvars%SYSARCH%.bat
) else if "%MSVC_VER%"=="15" (
set VCVARS=%VSINSTANCEDIR%\VC\Auxiliary\Build\vcvars%SYSARCH%.bat
) else if "%MSVC_VER%"=="14" ( echo [%VSINSTANCEDIR%\VC\bin%MSVCVARSDIR%\vcvars%SYSARCH%.bat]
REM set VCVARS****=%VSINSTANCEDIR%\VC\bin%MSVCVARSDIR%\vcvars%SYSARCH%****.bat
set VCVARS****="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat" ) else if "%MSVC_VER%"=="12" (
set VCVARS=%VSINSTANCEDIR%\VC\bin%MSVCVARSDIR%\vcvars%SYSARCH%.bat
) else (
echo Error: Invalid MSVC version!
goto Terminate
)</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

重新執(zhí)行,腳本的執(zhí)行便沒有其他錯(cuò)誤了。

為 VS添加自定構(gòu)建項(xiàng) YASM

重新使用 VS 打開 ffmpeg_deps.sln ,還是提示報(bào)錯(cuò)(部分項(xiàng)目未能正確加載),還是沒能 “ 重新加載項(xiàng)目

image

經(jīng)過一番探索,發(fā)現(xiàn)還需要 再安裝 另一個(gè) 自定義構(gòu)建項(xiàng) YASM,這一點(diǎn)是在 ShiftMediaProject 下其他 ffmpeg 的某些依賴項(xiàng)目下說明的,如 https://github.com/ShiftMediaProject/libvpx/tree/master/SMP 項(xiàng)目下的 readme 中:

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;">*** Building with YASM *** In order to build libvpx using msvc you must first download and install YASM.
YASM is required to compile all assembly files. 1) Visual Studio YASM integration can be downloaded from https://github.com/ShiftMediaProject/VSYASM/releases/latest

  1. Once downloaded simply follow the install instructions included in the download.</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

關(guān)于為什么不將 自定義構(gòu)建項(xiàng) **YASM **的下載說明放到 FFmpeg/SMP/readme.txt 下,項(xiàng)目維護(hù)者表示 ffmpeg 本身編譯直接依賴的項(xiàng)目只需要 NASM, 只是某些依賴本身編譯需要 YASM,想分開來在各自的依賴項(xiàng)目中說明

項(xiàng)目作者具體回復(fù)可查看:https://github.com/ShiftMediaProject/FFmpeg/pull/51

ShiftMediaProject 提供了自動(dòng)下載和安裝 yasm 的安裝腳本,下載地址為: https://github.com/ShiftMediaProject/VSYASM/releases

安裝方法 以及 可能遇到的問題 同上一節(jié) 為 VS添加自定構(gòu)建項(xiàng) NASM 完全一致

其他可能問題

1、找不到文件 '..\gnulib\lib*'

image

這種情況為依賴項(xiàng)目的子項(xiàng)目沒有自動(dòng)下載導(dǎo)致,這里截圖對(duì)應(yīng)的項(xiàng)目為 gnutls 的 git子模塊 gnulib 沒有自動(dòng)下載導(dǎo)致。

解決方案:手動(dòng)下載 gnulib 到 gnutls/gnulib 文件夾下,這里可以使用 git submodule 指令同步下載如下,

image

如圖,如果沒有成功下載,可以嘗試手動(dòng)下載,下載地址為 :

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;">https://gitlab.com/libidn/gnulib-mirror.git</pre>

或者

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;">git://git.sv.gnu.org/gnulib.git</pre>

可使用 git clone 下載代碼,然后放置到 gnutls/gnulib 文件夾下即可

2、error LNK2038: 檢測到 “RuntimeLibrary” 的不匹配項(xiàng): 值 “MDd_DynamicDebug” 不匹配值 “MTd_StaticDebug”

可能原因:

解決方案下不同項(xiàng)目設(shè)置不一樣 (該問題由評(píng)論區(qū)網(wǎng)友 天空自由 遇到,其使用的的 VS 版本為 VS2019)

參考解決方案:

項(xiàng)目屬性 -> 配置屬性 -> C/C++ -> 代碼生成 -> 運(yùn)行庫
都設(shè)置一樣就行了: 多線程調(diào)試(/MTd)

5、編譯與運(yùn)行

到此,編譯需要的所有事都完成了,重新打開VS,顯示(不可用)的項(xiàng)目是還沒重新加載, “ 重新加載項(xiàng)目 ”項(xiàng)目即可

image

接下來,指定一個(gè)啟動(dòng)程序來調(diào)試,這里設(shè)置 ffmpeg.exe 為啟動(dòng)項(xiàng),“設(shè)為啟動(dòng)項(xiàng)目” 后,開始構(gòu)建編譯“生成

image

編譯過程中,若提示如下,是正常的(可能是因?yàn)殪o態(tài)編譯模式下 [使用的 lib文件] 在編譯生成lib文件后,VS沒有及時(shí)引用到臨時(shí)導(dǎo)致的?)

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important; white-space: pre-wrap;">錯(cuò)誤 LNK1181 無法打開輸入文件“l(fā)ibgmpd.lib”   libnettle   E:\openSourceGit\ffmpeg-vs\nettle\SMP\LINK 1
錯(cuò)誤 LNK1181 無法打開輸入文件“l(fā)ibnettled.lib” libhogweed   E:\openSourceGit\ffmpeg-vs\nettle\SMP\LINK 1</pre>

image

靜靜等待其編譯結(jié)束后,再點(diǎn)構(gòu)建 “生成” 或是 “運(yùn)行” 就沒報(bào)編譯上的錯(cuò)誤了。

最后的最后,編譯完運(yùn)行 “本地 Windows 調(diào)試器”,大概會(huì)彈出錯(cuò)誤如下:

image

這是因?yàn)椤?strong>調(diào)試”->“命令”使用的文件路徑,和 實(shí)際在“鏈接器”->“常規(guī)”中設(shè)置的“輸出文件”路徑不一致導(dǎo)致,將前者設(shè)置和后者一致即可。

好了,你可以用 vs 調(diào)試 ffmpeg 了 !

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容