Window 下 FFmpeg 和 LibX264 的編譯和配置
博客原文地址:https://glumes.com
周末在家折騰 Windows 平臺(tái)下 FFmepg 和 LibX264 庫(kù)的編譯,長(zhǎng)期以來(lái)都是在 Mac 平臺(tái)下做開(kāi)發(fā),切換到 Windows 平臺(tái)下還是踩了不少坑。
參考了網(wǎng)上很多編譯文章,質(zhì)量也是參差不齊,版本也是五花八門,但歸根到底還是 Window 下編譯環(huán)境太坑爹了。
由于 Windows 上的命令行工具不好用,所以需要安裝 MSYS 或者 Cygwin 這樣的軟件,它們的作用就是模擬 Linux 環(huán)境,其中 MSYS 還分 1.0 和 2.0 版本,有的博客文章比較久遠(yuǎn),還使用的 1.0 版本了。
機(jī)智地沒(méi)有選擇走 Cygwin 這條路線,節(jié)省了不少時(shí)間,但還是踩了 MSYS 1.0 版本的坑。
如果你看到的文章是安裝 ?MSYS 1.0 版本,并且還需要額外安裝 MinGW 軟件,那么請(qǐng)退出來(lái),重新找個(gè) MSYS 2.0 版本的文章吧,這樣還能繞過(guò) MinGW 單獨(dú)下載太慢的問(wèn)題(別問(wèn)為什么我知道,你懂的)。
使用 MSYS 2.0 版本,就不需要額外安裝 MinGW 軟件了,它提供了 pacman 軟件管理器,通過(guò)它來(lái)安裝依賴的軟件。
官網(wǎng)地址:https://www.msys2.org/
MSYS 2.0 安裝軟件的時(shí)候,如果網(wǎng)速很慢,可以考慮更新鏡像源,使用國(guó)內(nèi)的源。
搞定軟件之后,先編譯 libx264 ,在編譯 FFmpeg 。
MinGW 和 MSVC 的作用
在實(shí)際編譯的時(shí)候,我們也是用不上 MinGW 的,看了一些文章用 MinGW 來(lái)編譯,最后編譯出來(lái)的靜態(tài)庫(kù)是個(gè) .a 的形式。
一開(kāi)始還沒(méi)反應(yīng)過(guò)來(lái),Windows 下的靜態(tài)庫(kù)不是 .lib 嘛,直接用 CMake 去鏈接 .a 庫(kù)肯定不行啊。
還看到一些文章說(shuō)先把 .a 庫(kù)轉(zhuǎn)成 .def 文件,然后再把 .def 文件轉(zhuǎn)成 .lib 文件,甚至再把 .lib 文件轉(zhuǎn)成 .dll 的動(dòng)態(tài)庫(kù),這么來(lái)回折騰一下又是大坑,還好沒(méi)跳進(jìn)去。
轉(zhuǎn)念一想,我要用 CLion 開(kāi)發(fā)工程,編輯器直接用 MSVC 就好了,也用不上 gcc 來(lái)編譯代碼,干嘛用 MinGW 去編譯個(gè) .a 庫(kù)呢,直接編譯出 .lib 不好嘛。
瞬間思路就打開(kāi)了,調(diào)整方向,谷歌直接搜索 compile ffmpeg with msvc ,很快就找到了答案(谷歌搜英文會(huì)過(guò)濾掉很多網(wǎng)上各種抄襲復(fù)制的無(wú)效文章)。
LibX264 編譯
首先下載好 LibX264 源碼。
然后在開(kāi)始菜單中找到并打開(kāi) x64 Native Tools Command Prompt for VS 2019 :

在打開(kāi)的命令行終端中,進(jìn)入到 MSYS 安裝目錄,打開(kāi) msys2_shell.cmd ,如下命令:

注意后綴有個(gè) -use-full-path 。
這時(shí)會(huì)打開(kāi) MSYS 的新窗口,先把一些匯編依賴安裝好:
pacman?-Syu
pacman?-S?make
pacman?-S?diffutils
pacman?-S?yasm
pacman?-S?nasm
然后,在該窗口中進(jìn)入到 LibX264 的源碼目錄下,把如下代碼保存成 .sh 文件并執(zhí)行:
OPTIONS="--enable-shared"
CC=cl?./configure?$OPTIONS?--enable-shared?--prefix=$BUILD_DIR/
make?-j?16
make?install
make?clean
執(zhí)行后就開(kāi)始編譯了,注意 configure 命令前綴有個(gè) CC=cl ,代表使用 MSVC 來(lái)編譯了。
編譯后內(nèi)容如下:

將編譯后的 libx264.dll.lib 改成 libx264.lib,這就是靜態(tài)庫(kù)了。
FFmpeg 編譯
繼續(xù)在 MSYS 2.0 窗口中進(jìn)入到下載好 FFmpeg 的源碼目錄,將如下代碼保存成 .sh 文件并執(zhí)行:
OPTIONS="--toolchain=msvc?\
?????????--arch=x86_64?\
?????????--enable-yasm??\
?????????--enable-asm?\
?????????--enable-shared?\
?????????--disable-static?\
?????????--disable-programs?\
?????????--enable-swresample?\
?????????--enable-swscale?\
?????????--enable-libx264?\
?????????--enable-gpl?\
?????????"
X264_INCLUDE=$libx264_path/include
X264_LIB=$libx264_path/lib
CC=cl?./configure?$OPTIONS?--extra-cflags="-I$X264_INCLUDE"?--extra-ldflags="-LIBPATH:$X264_LIB"?--prefix=$BUILD_DIR/
make?-j?16
make?install
make?clean
要將代碼中的 libx264_path 路徑改成上面編譯的 libx264 路徑,F(xiàn)Fmpeg 的編譯需要依賴 libx264 的庫(kù)。
一番等待后,就編譯出了動(dòng)態(tài)庫(kù):

CMake 依賴 FFmpeg 和 LibX264
最后就是在 Clion 中使用 CMake 去依賴 FFmpeg 和 LibX264 了。
定義了兩個(gè)宏函數(shù)去鏈接頭文件和庫(kù)的目錄:
macro(link_ffmpeg)
? ? include_directories(${ffmpeg}/${platform}/${arch}/include)
? ? link_directories(${ffmpeg}/${platform}/${arch}/bin)
endmacro()
macro(link_libx264)
? ? include_directories(${libx264}/${platform}/${arch}/include)
? ? link_directories(${libx264}/${platform}/${arch}/lib)
endmacro()
注意,F(xiàn)Fmpeg 鏈接庫(kù)用的是 bin 目錄下的,libx264 用的是 lib 目錄下的。
在最后這一步反而卡主了:
target_link_libraries(demo libx264 avcodec avformat)
要么提示找不到 libx264,要么找不到 avcodec-59,這個(gè)時(shí)候還需把 ffmpeg 編譯結(jié)果的 bin 目錄添加到系統(tǒng)環(huán)境變量中,為了保險(xiǎn)起見(jiàn),把 libx264 的 bin 目錄也添加了。
加完之后,跑一段代碼測(cè)試一下:
#include?
extern?"C"{
#include?"libavformat/avformat.h"
#include?"libavcodec/avcodec.h"
#include?"x264.h"
}
int?main()?{
????x264_param_t?param;
????x264_param_default(¶m);
????auto?codec?=?avcodec_find_encoder(AV_CODEC_ID_H264);
????if?(codec){
????????std::cout?<"success!!!"?<std::endl;
????}
????return?0;
}
果然就成功了,這下可以在 Windows 上開(kāi)發(fā)學(xué)習(xí) FFmpeg 了。
參考
https://www.cnblogs.com/wswind/p/10650126.html https://blog.csdn.net/qq_18453581/article/details/120005712 https://www.roxlu.com/2016/057/compiling-x264-on-windows-with-msvc https://www.roxlu.com/2019/062/compiling-ffmpeg-with-x264-on-windows-10-using-msvc

技術(shù)交流,歡迎加我微信:ezglumes ,拉你入技術(shù)交流群。
私信領(lǐng)取相關(guān)資料
推薦閱讀:
音視頻開(kāi)發(fā)工作經(jīng)驗(yàn)分享 || 視頻版
開(kāi)通專輯 | 細(xì)數(shù)那些年寫(xiě)過(guò)的技術(shù)文章專輯
Android NDK 免費(fèi)視頻在線學(xué)習(xí)!?。?/span>
你想要的音視頻開(kāi)發(fā)資料庫(kù)來(lái)了
推薦幾個(gè)堪稱教科書(shū)級(jí)別的 Android 音視頻入門項(xiàng)目
覺(jué)得不錯(cuò),點(diǎn)個(gè)在看唄~

