一. 安裝並配置msys2
這個工具主要用於模擬linux端的一些命令和指令。
下載地址:
msys2-x86_64-20210725_2.exe
鏈接: https://pan.baidu.com/s/1zOzoNzAt85KrccERo_9RQg 提取碼: n64t
下載完成后雙擊exe進行安裝,安裝時間可能很長,請耐心等待安裝結束。
然后打開VS2019的命令行工具,選擇:x86 Native Tools Command Prompt for VS 2019, 右擊以管理員權限運行:
注意:最好以管理員權限運行,否則后續在執行nmake install 指令時可能會發生錯誤,切記。
點擊打開, cd 到msys2 安裝的目錄, 執行 msys2_shell.cmd -mingw32, 啟動msys2的32位運行環境:
在新啟動的msys2中執行 cl, 看是否能找到cl 編譯器,如果提示:bash: cl: 未找到命令

則說明msys 控制台系統中並沒有共享我們本地的VS2019的運行環境,因此需要將 VS2019的運行環境添加到 msys 的控制台系統當中,目的要保證能在msys的環境中要能運行VS2019的控制台。
打開剛才msys2的解壓路徑,找到:msys2_shell.cmd 文件,打開:
找到:
rem set MSYS2_PATH_TYPE=inherit
將其修改為:
set MSYS2_PATH_TYPE=inherit
允許msys 繼承外部的環境變量:

關閉msys2的控制台窗口,然后重新在 VS2019的控制台窗口中執行:msys2_shell.cmd -mingw32

打開msys的控制台窗口后,再次執行cl, 若遇到亂碼則是因為字符編碼不一致導致的,可以右擊msys2的標題欄,依次選擇“Options”-"Text", 分別修改Locale 和 Character set 為 “zh_CN” 和 “UTF-8”

修改完畢后,回到msys的控制台,再次執行cl,這樣就不會有亂碼了:

到此為止,我們就已經把msys的環境裝好了,並且已經包含了cl的命令行工具。
二. msys2 依賴環境安裝
這里我們主要使用pacman來安裝編譯依賴工具,pacman 有點類似於ubuntu下的apt, 或是centos下的yum。
安裝匯編工具,主要是在編譯x264和ffmepg時會用到,如果不安裝,在config中需要禁用匯編。
安裝 nasm
打開msys 控制台窗口,執行 pacman -S nasm , 注意 S 大寫

安裝yasm
一個匯編工具,在編譯x264 和 ffmpeg 時會用到,如果不安裝,則需要在config中去禁用匯編。

安裝 make cmake
項目編譯工具,必須要安裝,cmake 用於生成項目文件

安裝 diffutils
比較工具,ffmpeg configure 生成 makefile 時會用到。

安裝 pkg-config
庫配置工具,編譯x264, x265 時會用到

安裝 git
版本控制工具,從版本庫下載源碼時會用到

如果下載過慢,可添加清華大學開源鏡像站的源,參考鏈接:MSYS2 鏡像使用幫助, https://mirrors.tuna.tsinghua.edu.cn/help/msys2/
三. 安裝並配置cmake
為了保險起見,這里最好使用獨立的cmake 程序來執行后面的編譯。
cmake 下載地址:
鏈接: https://pan.baidu.com/s/1BjR6SY1u0eWihu2AqdpXfA 提取碼: mbty
下載完畢后將其解壓到任意目錄,並在Windows的環境變量中配置cmake 的路徑:

四. 編譯x264
首先下載x264 源碼:
鏈接: https://pan.baidu.com/s/1R8TdXirYYqah_V_i18z_5Q 提取碼: 4gpv
下載完畢后將其解壓到 msys 的home 目錄下:

回到msys 終端,cd x264當前目錄,修改編譯工具為 cl ,並將其編譯成動態鏈接庫的形式 (若不指定默認則為GCC)

使用 make -j16 命令開始編譯

等待編譯結束

編譯完成后,使用 make install 命令進行安裝:

打開 usr\local\lib\pkgconfig\x264.pc, 可以看到該文件已描述了編譯完成后的x264的庫文件,頭文件所在路徑,以及庫的調用方式。

至此x264 庫編譯完畢。
五. 編譯x265
首先下載x265 源碼:
鏈接: https://pan.baidu.com/s/1yLAk82uDy51dXOufMJe3rA 提取碼: qu8q
將下載完成的壓縮包解壓到 msys的 home 目錄下:

x265 源碼給出了各個環境下的編譯腳本:

PS: 這里注意不要使用 msys2 當中的cmake, 因為msys-cl 目錄下生成的make-Makefiles.sh 文件是VS調用的Makefile文件,而不是make的,並且稍候要使用nmake來進行編譯。
通過 where cmake 查看當前cmake安裝路徑
如果發現 msys的 usr/bin目錄下已經包含cmake, 則將其改名:

修改完畢后,切換到 x265的編譯目錄:

執行 ./make-Makefiles.sh 開始編譯:

等待編譯結束....

然后使用 nmake install 指令進行安裝:

可以看到編譯完成的x265庫被安裝到了C盤的Program Files目錄下,這里為了使用方便將其拷貝到 msys的 usr/local 路徑當中,與之前編譯的 x264庫保持一致。
找到x265庫的安裝路徑:

選中所有文件,將其拷貝到 msys 的 usr/local 目錄下:

由於 x265的 庫文件路徑已發生變化,所以需要對其路徑進行更新:
打開 x265的 pc文件,位於:usr/local/lib/pkgconfig 目錄

打開x265.pc 文件,將紅框內容
修改成:

這樣的話x265就編譯完了,並且路徑也配置過了。
六. 編譯fdk-aac
用於aac格式的編碼
首先下載fdk-aac的源碼:
鏈接: https://pan.baidu.com/s/13pff3Jk8-UKwlahdslcvTQ 提取碼: ug5c
下載完畢后將其解壓到 msys 的 home 目錄下:

可以看到,fdk-aac的源碼庫已經提供了VC編譯的Makefile,因此就不需要再借助msys控制台環境來編譯了,直接在VS的控制台環境下編譯即可,打開VS 的控制台,並且切換到fdk-aac的源碼目錄:
執行:nmake -f Makefile.vc 開始編譯:

編譯完畢后,執行:nmake -f Makefile.vc prefix=.\install install 將編譯完成的庫拷貝到fdk-aac的 install 目錄下:


下一步我們將整個編譯完成的所有文件全部拷貝到之前用於存放x264,x265的 usr/local 目錄下:

這樣就添加了fdk-aac的支持,不過有一個問題就是剛才編譯生成的fdk-aac 並沒有像先前編譯x264,x265一樣生成pkgconfig:

下面我們手動的為編譯好的fdk-aac 庫添加 pkgconfig:
回到 fdk-aac的源碼目錄:home/fdk-aac,

找到 fdk-aac.pc.in 文件,將其拷貝到 剛才添加的 usr/local/lib/pkgconfig 目錄下,並重命名為:fdk-aac.pc

打開fdk-aac.pc 文件,仿照 x264.pc, 將其文件內容由:

修改為:
prefix=/usr/local exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Fraunhofer FDK AAC Codec Library Description: AAC codec library Version: Libs: -L${libdir} -lfdk-aac Libs.private: Cflags: -I${includedir}

這樣的話我們就生成了一個fdk-aac 的pkgconfig的配置項。aac就全部編譯完成了。
七. 編譯ffmpeg
這里編譯的是ffmpeg4.3 版本, ffmpeg4.3 版本下載:
鏈接: https://pan.baidu.com/s/19XftM8VX8u_DioyIU7HP-Q 提取碼: bzgf
同樣,先將解壓后的ffmpeg 4.3 目錄拷貝到 msys 的home 目錄下:

ffmpeg 在 windows 中的編譯還是需要用到 msys2, 並且ffmpeg編譯要先生成Makefile, 接下來我們為編譯作准備,先生成 Makefile
生成Makefile 的代碼如下:
CC=cl.exe ./configure --prefix=./install --toolchain=msvc --enable-shared --disable-programs --disable-ffplay --disable-ffmpeg --disable-ffprobe --enable-libx264 --enable-gpl --enable-libfdk-aac --enable-nonfree --enable-libx265
參數說明:
參數說明:
--prefix=./install 指定輸出的目錄是在當前目錄的install目錄下
--toolchain=msvc 指定編譯工具鏈為vs
--enable-shared 編譯為動態鏈接庫
--disable-programs 不編譯工具
--disable-ffply
--disable-ffmpeg
--disable-ffprobe
--enable-libx264 支持x264
--enable-libx265 支持x265
--enable-gpl 支持h264協議,x264 x265 必備
--enable-libfdk-aac --enable-nonfree 支持aac音頻編碼 aac 必須包含-enable-nonfree
在msys的控制台窗口中切換到 ffmpeg-4.3目錄下,執行上述指令嘗試生成Makefile

點回車確認后可能需要一些時間,因為ffmpeg內部有一些測試工具,如果中途出現問題,可以打開ffmpeg的源碼目錄,找到ffbuild目錄中的config.log, 里面詳細記錄了失敗的詳細原因。

比如我現在開始執行后,控制台就返回一條錯誤消息:

提示我libfdk-aac 這個庫找不到。我們打開 config.log:

它說找不到fdk-aac/aacenc_lib.h這個頭文件。但是我們打開 usr/local/include/fdk-aac 這個目錄,發現是有 fdk-aac/aacenc_lib.h 這個頭文件的,這是為什么呢?這是因為我們先前在usr/local/lib目錄中存放的pkgconfig文件沒有被找到,為了讓msys能夠順利找到pkgconfig, 我們需要把pkgconfig 剪切到 msys64/mingw32/lib 目錄下,因為我們啟動的是mingw32的環境,所以它會到這個目錄下去找。

如果拷貝到 msys64/mingw32/lib 目錄下后,編譯仍然找不到libfdk-aac, 可以通過配置 PKG_CONFIG_PATH 環境變量來手動指明libfdk-aac的路徑:具體可參考這篇博客:轉:PKG_CONFIG_PATH 環境變量配置,比如可以在mingw32 環境下手動導出該環境變量:
root@kali:~# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
如果編譯后能找到libfdk-aac, 則我們再次回到msys的控制台窗口,再次執行剛才的指令:

這次又報了libx264沒有找到,我們打開ffbuild目錄下的 config.log,滑到末尾,發現是:

找不到libx264.lib, 無法執行鏈接,我們打開先前編譯好的libx264的 lib 目錄:

注意到沒有libx264.lib 這個文件,現在的名字叫 libx264.dll.lib, 我們將 libx264.dll.lib 重命名為 libx264.lib, 再次執行剛才的指令:

修改完畢后再次執行剛才的指令:

這次又提示 ERROR: x265 not found using pkg-config, 我們再打開 config.log:

這次的提示跟上次差不多,也是鏈接錯誤,找不到 x265.lib, 我們打開x265 的lib 目錄:

將libx265.lib 重命名成 x265.lib:

再次執行剛才的指令:

這次終於可以順利生成Makefile了。
接下來我們執行 make -j16 開始編譯:

編譯過程可能有點長,視機器配置而定,我的電腦大約用了3分鍾完成編譯:

最后我們再執行 make install , 將編譯完成的文件安裝到 當前目錄的install 目錄下。install 目錄之前已經指定過了。

等待install 結束,打開 ffmpeg 目錄下的install 目錄:

出現上述的圖示就說明 ffmpeg 庫已經全部編譯完成了。
<完>
