本文來詳細講解一下:如何在Mac、Windows環境下成功編譯FFmpeg。
1.目标
這裡先提前說明一下,最後希望達到的效果:
- 編譯出ffmpeg、ffprobe、ffplay三個指令行工具
- 隻産生動态庫,不産生靜态庫
- 将fdk-aac、x264、x265內建到FFmpeg中
- x264、x265會在以後講解的視訊子產品中用到
2.下載下傳源碼
下載下傳源碼ffmpeg-4.3.2.tar.xz,然後解壓。
3.Mac編譯
3.1依賴項
- brew install yasm
ffmpeg的編譯過程依賴yasm
若未安裝yasm會出現錯誤:nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
- brew install sdl2
ffplay依賴于sdl2
如果缺少sdl2,就無法編譯出ffplay
- brew install fdk-aac
不然會出現錯誤:ERROR: libfdk_aac not found
- brew install x264
不然會出現錯誤:ERROR: libx264 not found
- brew install x265
不然會出現錯誤:ERROR: libx265 not found
其實x264、x265、sdl2都在曾經執行brew install ffmpeg的時候安裝過了。
- 可以通過brew list的結果檢視是否安裝過
brew list | grep fdk
brew list | grep x26
brew list | grep -E 'fdk|x26'
- 如果已經安裝過,可以不用再執行brew install
3.2configure
首先進入源碼目錄。
然後執行源碼目錄下的configure腳本,設定一些編譯參數,做一些編譯前的準備工作。
- --prefix
用以指定編譯好的FFmpeg安裝到哪個目錄
一般放到/usr/local/ffmpeg中即可
- --enable-shared
生成動态庫
- --disable-static
不生成靜态庫
- --enable-libfdk-aac
将fdk-aac内置到FFmpeg中
- --enable-libx264
将x264内置到FFmpeg中
- --enable-libx265
将x265内置到FFmpeg中
- --enable-gpl
x264、x265要求開啟GPL License
- --enable-nonfree
fdk-aac與GPL不相容,需要通過開啟nonfree進行配置
你可以通過configure --help指令檢視每一個配置項的作用。
3.3編譯
接下來開始解析源代碼目錄中的Makefile檔案,進行編譯。-j8表示允許同時執行8個編譯任務。
對于經常在類Unix系統下接觸C/C++開發的小夥伴來說,Makefile必然是不陌生的。這裡給不了解Makefile的小夥伴簡單科普一下:
- Makefile描述了整個項目的編譯和連結等規則
比如哪些檔案需要編譯?哪些檔案不需要編譯?哪些檔案需要先編譯?哪些檔案需要後編譯?等等
- Makefile可以使項目的編譯變得自動化,不需要每次都手動輸入一堆源檔案和參數
比如原來需要這麼寫:gcc test1.c test2.c test3.c -o test
3.4安裝
将編譯好的庫安裝到指定的位置:/usr/local/ffmpeg。
安裝完畢後,/usr/local/ffmpeg的目錄結構如下所示。
3.5配置PATH
為了讓bin目錄中的ffmpeg、ffprobe、ffplay在任意位置都能夠使用,需要先将bin目錄配置到環境變量PATH中。
如果你用的是bash,而不是zsh,隻需要将上面的.zprofile換成.bash_profile。
3.6驗證
接下來,在指令行上進行驗證。
此時,你完全可以通過brew uninstall ffmpeg解除安裝以前安裝的FFmpeg。
4.Windows編譯
configure、Makefile這一套工具是用在類Unix系統上的(Linux、Mac等),預設無法直接用在Windows上。
這裡介紹其中一種可行的解決方案:
- 使用MSYS2軟體在Windows上模拟出Linux環境
- 結合使用MinGW對FFmpeg進行編譯
4.1下載下傳安裝MSYS2
進入MSYS2官網下載下傳安裝包(我這邊下載下傳的是:msys2-x86_64-20210228.exe),然後進行安裝。
安裝完畢後打開指令行工具mingw64.exe。
4.2安裝依賴
pacman(Package Manager)是一個包管理工具。
- pacman -Sl:搜尋有哪些包可以安裝
- pacman -S:安裝
- pacman -R:解除安裝
接下來,安裝各種依賴包。
關于軟體包相關的預設路徑:
- 下載下傳目錄:%MSYS2_HOME%/var/cache/pacman/pkg
- 安裝目錄:%MSYS2_HOME%/mingw64
- %MSYS2_HOME%是指MSYS2的安裝目錄
4.3configure
我的源碼是放在F:/Dev/ffmpeg-4.3.1,輸入cd /f/dev/ffmpeg-4.3.1即可進入源碼目錄。然後執行configure。
4.4編譯、安裝
FFmpeg最終會被安裝到%MSYS2_HOME%/usr/local/ffmpeg目錄中。
FFmpeg的安裝目錄
4.5bin
此時bin目錄中的ffmpeg、ffprobe、ffplay還是沒法使用的,因為缺少相關的dll,需要從%MSYS2_HOME%/mingw64/bin中拷貝,或者将%MSYS2_HOME%/mingw64/bin配置到環境變量Path中。
需要拷貝的dll有:libwinpthread-1、SDL2、zlib1.dll、liblzma-5、libbz2-1、libiconv-2、libgcc_s_seh-1、libstdc++-6、libx265、libx264-159、libfdk-aac-2。
FFmpeg的bin目錄
4.6Path
最後建議将%FFMPEG_HOME%/bin目錄配置到環境變量Path中。
在指令行輸入ffmpeg -version,一切大功告成!