FFmpeg開發筆記(一)搭建Linux系統的開發環境

2023-04-16 21:00:57

對於初學者來說,如何搭建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再按確認鍵,即可完成修改操作。

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函數的目標了。