我的音視頻/流媒體開源項目(github)
一、基礎環境搭建
1.1 MSYS2\MinGW
參考:1. 基于MSYS2的Mingw-w64 GCC搭建Windows下C++開發環境_msys2使用mingw64編譯
????????在Widndows系統上,使用gcc工具鏈(g++)進行C++程序開發?可以的!本文將就如何搭建這樣一個環境,展開介紹。
- Windows下C/C++程序開發的差勁開發體驗:
? ? ? ? 1、首先需要安裝≈20 GB的Visual Studio(大型團隊項目,還是需要VS的);
? ? ? ? 2、然后,很多第三方庫,需要自己去GitHub或者相應的官網上下載源碼,然后進行編譯,而編譯過程會遇到各種版本不兼容、缺少依賴、代碼錯誤、需修改makefile文件等問題……至此庫尚未編譯成功,開發人員早已經被這差勁的體驗勸退……
- MSYS2有三個優點:
? ? ? ? 1、仿Linux的終端交互環境,可以使用Linux下的終端命令和快捷方式;
? ? ? ? 2、自帶pacman軟件管理包,讓您將精力放到C++代碼的編寫上,而不是復雜的依賴環境的搭建和編譯。如:GDAL、OpenCV等第三方C/C++庫,無須再去踩各種坑、艱難地編譯而是直接一個命令就安裝到了本地;
? ? ? ? 3、復用自己在Linux下的開發經驗。使用g++進行庫的鏈接、源碼編譯等操作,可更進一步了解C++代碼的編譯過程。
????????下載MSYS2
????????https://www.msys2.org/,進入MSYS2的官網,然后找到如下圖下載鏈接,點擊即可進行下載。
????????安裝MSYS2
????????如下圖,MSYS2的整個安裝過程無須特別的設置,一路默認下一步即可,安裝位置建議不要用C盤,因為后續使用pacman安裝軟件很占用空間,我是用了D盤。
????????配置pacman鏡像源
- pacman是隨MSYS2一起安裝的軟件包管理工具
- 安裝完成MSYS2后,則可以在如下路徑找到鏡像配置文件:D:\msys64\etc\pacman.d,格式為mirrorlist.*,然后進行配置,配置前后的結果如下面兩幅圖所示。這里說的配置,其實就是將配置文件內的兩個國內的鏡像源“tsinghua(清華)”和“ustc(中科大)”,移動(剪切粘貼)到主鏡像(## Primary標識的msys2)的前面。
????????更新pacman基本軟件倉庫
????????配置完鏡像源后,需要更新pacman的基本軟件倉庫,這分兩個步驟:
????????第一步,執行如下命令,檢查更新并下載,過程中,MSYS2可能會因為安裝更新而自動關閉,此時,可再次在開始菜單中打開,然后再次執行“pacman -Syu”命令。
pacman -Syu
????????第二步,確定“pacman -Syu”命令的更新完畢,如下圖,則說明更新完畢,然后執行如下命令,以更新因執行上已更新操作,而未更新的剩余程序。
pacman -Su
????????安裝Mingw-w64 GCC編譯工具鏈
????????Mingw-w64是Windows編譯C/C++源代碼的程序集,為了安裝該軟件,須執行如下命令,即可安裝編譯C/C++程序所需的編譯工具如:gcc、g++、make等。此步驟安裝的軟件包較多,因此可能需要一定時間,取決于網絡和電腦配置,約需3-5分鐘。
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
????????把D:\msys64\mingw64\bin(替換成實際路徑)加入到環境變量中,就可以在任何位置使用gcc、g++、gdb以及mingw32-make等工具了,在cmd中和VSCode終端都可以,個人覺得使用msys2生成的MinGW64程序反而不方便。添加完環境變量之后在cmd下,輸出gcc --version 和mingw32-make --version驗證。如果不添加環境變量,就只能調用D:\msys64\mingw64.exe使用gcc/g++等工具,很不方便,我基本都是在VSCode中寫代碼并編譯。
????????自此就可以使用VSCode,甚至記事本寫C/C++程序,并使用gcc/g++編譯了。注意編譯出來的程序就是.exe結尾的(動態庫是.dll和.dll.a結尾的,.lib是給MSVC編譯器用的,也就是Visual Studio。MinGW使用的是.dll.a+.dll;MSVC是.lib+.dll,兩者是不一樣的),這里的MinGW只是模擬在Linux下的編譯過程,但是生成程序或者動態庫等還是Windows風格的。
? ? ? ? 注意:盡量不要再VSCode終端里面執行程序,因為CMD和VSCode的程序運行起來表現不一樣,尤其是在多線程環境下,編譯在CMD和VSCode終端下都是可以的。
? ? ? ? 當然,MinGW也可以不通過msys2安裝,直接在電腦上安裝MinGW也是可以的,但是因為在開發過程中,肯定還會用到其他的庫和軟件,如果每個都單獨安裝很麻煩,通過msys2就可以像Linux那樣,直接在線使用命令安裝,然后再加入Windows的環境變量中就可以了。此外如果涉及到要源碼編譯開源庫,使用msys2也很方便,msys2簡化了windows的軟件安裝和開源庫源碼編譯過程,不用msys2也是可以的,只不過不方便。
二、cmake
????????再安裝一個cmake,就可以實現大型項目的構建了,而且跨平臺(cmake不用msys2安裝,單獨安裝即可,同樣要加入到環境變量,在任何位置都可以使用)。
? ? ? ? 參考:Windows下CMake的下載與安裝詳解_cmake下載-CSDN博客
????????CMake的下載與安裝
????????CMake下載鏈接:https://cmake.org/download/。
????????下載最新穩定版即可(Latest Release):
????????下載完成后,單擊“Next”按鈕,在下圖中勾選“I accept the terms in the License Agreement”復選框接受許可協議:
????????選中“Add CMake to the system PATH for all users”單選按鈕添加系統路徑變量。也可以同時勾選“CreateCMakeDesktopIcon”復選框,以便在安裝完成后在桌面上創建CMake的快捷方式圖標。
????????點擊Install進行安裝,在CMD下使用cmake --version進行驗證。
????????自此就可以使用cmake和MinGW構建項目了,構建過程和Linux略有區別,不過cmake和gcc/g++語法都是一樣的,步驟如下:
mkdir build
cd build
cmake -G "MinGW Makefiles" ..
mingw32-make
? ? ? ? 至此,就在Windows上搭建好了代碼編譯環境,我使用的是VSCode + MinGW + Cmake,如下圖所示。
三、編譯FFmpeg
????????在Windwos使用ffmpeg有兩種方式:
????????1、在ffmpeg官網下載Windows上編譯好的庫,MinGW和MSCV都可以使用,因為.lib和.dll.a都有(為什么我不說.dll,因為無論是MinGW還是MSCV都需要.dll,.dll是exe程序運行必須有的,除非是靜態鏈接。)
? ? ? ? 2、源碼編譯,因為ffmpeg官方編譯好的庫很多功能都沒有用,比如,沒有fdk-aac,如果要用fdk-aac就只能自己源碼編譯,此外有的軟件,例如opencv只提供了.lib和.dll,沒有.dll.a,要想在MinGW中使用,就必須源碼編譯(opencv編譯坑很多,我是直接從網上下載編譯好的,這一點和Linux不同,Linux上一臺機器上編譯出來的庫很難在另外一臺Linux上使用,除非環境及版本高度相似)。在msys2上和Linux上編譯ffmpeg很相似。
? ? ? ? 依賴安裝:
????????需求,在ffmpeg中添加libx264、libx265、libfdk-aac
????????首先用msys2搜索一下x264,使用命令:
pacman -Ss x264
????????我是mingw64,所以安裝mingw-w64-x86_64-libx264,命令為:
pacman -S mingw-w64-x86_64-libx264
????????使用命令查看libx264的安裝位置,命令為:
pacman -Ql mingw-w64-x86_64-libx264
????????在msys的安裝路徑下就可以找到這些庫,知道庫和頭文件的位置,后面就可以用了。
? ? ? ? 用同樣的方式安裝libx265和fdk-aac,命令為:
pacman -S mingw-w64-x86_64-x265 #mingw-w64-x86_64-x265包含了x265可執行程序,之前安裝的mingw-w64-x86_64-libx264不包含x264可執行程序,如果安裝libx264的時候想包含x264.exe也可以安裝mingw-w64-x86_64-x264,我們只用x264和x265的庫,有沒有exe都可以,我們不用
pacman -S mingw-w64-x86_64-fdk-aac
? ? ? ?安裝匯編庫
pacman -S mingw-w64-x86_64-yasm mingw-w64-x86_64-nasm
????????ffmpeg源碼下載:
? ? ? ? 下載地址:https://ffmpeg.org/releases/
????????我下載的是4.4.5
????????此時我們打開minw64,用來編譯ffmpeg源碼。
????????查看當前所在目錄
????????當前所在目錄為/home/sunkx1,在Windows上的實際路徑就為D:\msys64\home\sunkx1,把下載的ffmpeg源碼放到D:\msys64\home\sunkx1下面,ls看一下,就可以看到ffmpeg源碼了。
????????解壓:
tar -zxvf ffmpeg-4.4.5.tar.gz
? ? ? ? 進入到源碼目錄:
cd ffmpeg-4.4.5/
????????配置:
./configure --prefix=/home/sunkx1/ff-build --enable-libx264 --enable-libx265 --enable-gpl --disable-x86asm --enable-nonfree --enable-libfdk-aac --enable-shared --extra-cflags=-I/mingw64/include --extra-ldflags=-L/mingw64/lib
????????--prefix指定安裝目錄。
????????--enable-gpl:允許使用 GPL 許可證 的組件,比如 libx264 和 libx265,如果沒有這個選項,FFmpeg 會拒絕編譯 libx264。
????????--enable-nonfree:啟用一些 非自由組件,不啟用,libfdk-aac 就無法使用。
????????--disable-x86asm:禁用 x86 匯編優化(主要影響 H.264/HEVC 編碼性能)。
????????--enable-shared:啟用共享庫(動態庫 .dll 或 .so)。
????????--extra-cflags和--extra-ldflags指定libx264、libx265、libfdk-aac的安裝路徑。
? ? ? ? 編譯安裝:
make -j
make install
????????把如下路徑添加到環境變量
D:\msys64\mingw64\bin
D:\msys64\home\sunkx1\ff-build\bin
????????第一個是x264、x265、fdk-aac的庫所在位置(.dll)
????????第二個是ffmpeg庫所在位置(.dll和exe)
? ? ? ? 配置好之后就可以在cmd中使用ffmpeg了,
? ? ? ? 在cmake中配置,就可以使用ffmpeg了
? ? ? ? 1、頭文件位置
D:\msys64\mingw64\include
D:\msys64\home\sunkx1\ff-build\include
? ? ? ? 2、鏈接庫位置
D:\msys64\mingw64\lib
D:\msys64\home\sunkx1\ff-build\lib
????????上面編譯出來的ffmpeg不包含ffplay,因為ffplay依賴sdl,所以需要安裝sdl才可以,同樣使用pacman安裝即可。