對於初學者來說,如何搭建FFmpeg的開發環境是個不小的攔路虎,因為FFmpeg用到了許多第三方開發包,所以要先編譯這些第三方原始碼,之後才能給FFmpeg整合編譯好的第三方庫。
不過考慮到剛開始僅僅呼叫FFmpeg的API,不會馬上去改FFmpeg的原始碼,因此只要給系統安裝編譯好的FFmpeg動態庫,即可著手編寫簡單的FFmpeg程式。比如這個網站https://github.com/BtbN/FFmpeg-Builds/releases提供了已經編譯透過的FFmpeg開發包,囊括Linux、Windows等系統環境的開發版本。對該網站提供的Linux版FFmpeg安裝包而言,需要事先安裝不低於2.22版本的glibc庫,否則編譯FFmpeg程式會報錯“undefined reference to `_ZGVdN4vv_pow@GLIBC_2.22'”。下面介紹在Linux系統安裝已編譯的FFmpeg詳細步驟。
一、安裝glibc
1、到這個網址下載2.23版本的glibc原始碼包http://ftp.gnu.org/gnu/glibc/。注意:雖然要求glibc版本不低於2.22,但是不宜安裝過高版本的glibc,因為較高版本的glibc依賴於python,去整python環境又得費一番功夫,所以弄個比2.22稍高一點的2.23版就夠了,也就是下載這個壓縮包http://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.gz。
2、先解壓glibc原始碼包,再進入glibc原始碼目錄,然後建立build目錄並進入該目錄,也就是依次執行以下命令:
tar zxvf glibc-2.23.tar.gz cd glibc-2.23 mkdir build cd build
3、在build目錄下依次執行以下命令配置、編譯與安裝glibc:
../configure --prefix=/usr make make install
安裝成功後,會在/usr/lib64目錄下找到最新的libc.so(還有libc.so.6和libc-2.23.so)和libmvec.so(還有libmvec.so.1和libmvec-2.23.so)等庫檔案。
二、安裝FFmpeg
1、到這個網址下載Linux環境編譯好的FFmpeg安裝包https://github.com/BtbN/FFmpeg-Builds/releases,比如ffmpeg-master-latest-linux64-gpl-shared.tar.xz。
2、把下載好的FFmpeg安裝包解壓到/usr/local/ffmpeg目錄,也就是依次執行以下命令:
cd /usr/local tar xvf ffmpeg-master-latest-linux64-gpl-shared.tar.xz mv ffmpeg-master-latest-linux64-gpl-shared ffmpeg
3、輸入cd命令回到當前使用者的初始目錄,使用vi開啟該目錄下的.bash_profile,也就是依次執行以下命令:
cd vi .bash_profile
4、把游標移動到檔案末尾,按下a鍵進入編輯模式,然後在檔案末尾新增下面四行環境變數配置:
PATH=$PATH:/usr/local/ffmpeg/bin export PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ffmpeg/lib export LD_LIBRARY_PATH
接著儲存並退出檔案,也就是先按下Esc鍵退出編輯模式,再按下冒號鍵,接著輸入wq再按Enter鍵,即可完成修改操作。
5、執行以下命令載入最新的環境變數:
source .bash_profile
接著執行下面的環境變數檢視命令:
env | grep PATH
發現控制檯回顯的PATH串包含/usr/local/ffmpeg/bin,同時LD_LIBRARY_PATH串包含/usr/local/ffmpeg/lib,說明FFmpeg的bin目錄和lib目錄都載入進了環境變數。
三、編寫測試程式
1、建立C程式碼檔名叫hello.c,填入下面的程式碼內容:
#include <libavutil/avutil.h> int main(int argc, char* argv[]) { av_log(NULL, AV_LOG_INFO, "hello world\n"); }
2、儲存並退出該檔案,執行以下命令編譯hello.c:
gcc hello.c -o hello -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lpostproc -lm
3、執行編譯好的hello程式,也就是執行以下命令:
./hello
發現控制檯回顯日誌資訊“hello world”,表示測試程式執行正常,說明FFmpeg開發環境已經成功搭建。
4、剛才的測試程式hello.c採用C語言編寫,並且使用gcc編譯。若要採用C++程式設計的話,則需改成下面的hello.cpp程式碼:
#include <iostream> // 因為FFmpeg原始碼使用C語言編寫,所以在C++程式碼中呼叫FFmpeg的話,要使用標記“extern "C"{……}”把FFmpeg的標頭檔案包含進來 extern "C" { #include <libavutil/avutil.h> } int main(int argc, char* argv[]) { av_log(NULL, AV_LOG_INFO, "hello world\n"); }
鑑於C++程式碼採用g++編譯,於是hello.cpp的編譯命令變成下面這樣:
g++ hello.cpp -o hello -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/bin -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lpostproc -lm
編譯完畢,同樣生成名叫hello的可執行程式,如此就實現了C++程式碼整合FFmpeg函式的目標了。