FFmpeg開發筆記(二十四)Linux環境給FFmpeg整合AV1的編解碼器

aqi00發表於2024-05-27
AV1是一種新興的免費影片編碼標準,它由開放媒體聯盟(Alliance for Open Media,簡稱AOM)於2018年制定,融合了Google VP10、Mozilla Daala以及Cisco Thor三款開源專案的成果。據說在實際測試中,AV1標準比H.265(HEVC)的壓縮率提升了大約27%。由於AV1具有效能優勢,並且還是免費授權,因此各大流媒體平臺更傾向使用AV1而非HEVC標準。

AV1如此炙手可熱,以致它的編解碼器如雨後春筍,單單FFmpeg支援的AV1編解碼器,就有libaom、libdav1d、libsvtav1、librav1e四種。經過在Linux環境實地驗證,前三種都能在華為雲的尤拉系統上編譯整合,只有librav1e尚未成功編譯。下面就介紹如何在Linux環境給FFmpeg整合libaom、libdav1d、libsvtav1這三種AV1編解碼庫。

一、安裝libaom

libaom是谷歌提供的AV1編解碼工具,其程式碼託管在谷歌網站,國內無法訪問,開發者可透過清華大學的映象網站下載它的原始碼,下載地址是https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/pool/main/a/aom/aom_3.7.1.orig.tar.gz。
libaom的安裝步驟說明如下。
1、將下載好的壓縮包上傳到伺服器並解壓,也就是依次執行以下命令。

tar zxf aom_3.7.1.orig.tar.gz
cd aom-3.7.1

2、進入解壓後的build目錄,執行下面命令配置libaom。

cd build
cmake ..

3、執行下面命令編譯libaom。

make -j4

4、編譯完成後,執行下面命令安裝libaom。

make install

二、安裝libsvtav1

SVT-AV1專案最初由英特爾與奈飛公司合作建立,後來被AOM官方收編,它的原始碼託管頁面在https://gitlab.com/AOMediaCodec/SVT-AV1。因為《FFmpeg開發實戰:從零基礎到短影片上線》一書採用的FFmpeg版本為5.1.2,相容該版本FFmpeg的SVT-AV1最高版本為1.4.0,所以需要下載這個原始碼連結https://gitlab.com/AOMediaCodec/SVT-AV1/-/archive/v1.4.0/SVT-AV1-v1.4.0.tar.gz。注意,如果使用更高版本的SVT-AV1,會導致後面FFmpeg編譯失敗。
libsvtav1的安裝步驟說明如下。
1、將下載好的壓縮包上傳到伺服器並解壓,也就是依次執行以下命令。

tar zxvf SVT-AV1-v1.4.0.tar.gz
cd SVT-AV1-v1.4.0

2、進入解壓後的Build目錄,執行下面命令配置libsvtav1。

cd Build
cmake ..

3、執行下面命令編譯libsvtav1。

make -j4

4、編譯完成後,執行下面命令安裝libsvtav1。

make install

三、安裝libdav1d

libdav1d是一款AV1的解碼器,只負責解碼,不負責編碼。它的原始碼託管頁面在https://code.videolan.org/videolan/dav1d/,原始碼包的下載地址是https://code.videolan.org/videolan/dav1d/-/archive/1.3.0/dav1d-1.3.0.tar.gz。
libdav1d的安裝步驟說明如下。
1、安裝編譯工具meson和ninja
meson和ninja是基於Python語言的編譯工具,故需確保伺服器已經安裝了Python3。另外,由於伺服器訪問國外網站不穩定,因此可先設定國內的資源映象網站,比如移動雲。具體的映象設定與工具安裝命令如下:

pip config set global.index-url https://ecloud.10086.cn/api/query/developer/nexus/repository/python-sdk/simple
pip3 install meson
pip3 install ninja

2、將下載好的壓縮包上傳到伺服器並解壓,也就是依次執行以下命令。

tar zxvf dav1d-1.3.0.tar.gz
cd dav1d-1.3.0

3、進入解壓後的build目錄,執行下面命令配置libdav1d。

mkdir build
cd build
meson setup

4、執行下面命令編譯libdav1d。

ninja

5、編譯完成後,執行下面命令安裝libdav1d。

ninja install

四、讓FFmpeg啟用libaom、libdav1d、libsvtav1

由於FFmpeg預設未啟用libaom、libdav1d、libsvtav1,因此需要重新配置FFmpeg,標明啟用libaom、libdav1d、libsvtav1,然後重新編譯安裝FFmpeg。FFmpeg的Linux環境完整編譯過程參見《FFmpeg開發實戰:從零基礎到短影片上線》一書的“1.2.3 自行編譯與安裝FFmpeg”,詳細的啟用步驟說明如下。
1、載入環境變數PKG_CONFIG_PATH和LD_LIBRARY_PATH
因為libaom、libdav1d、libsvtav1三個庫預設安裝在/usr/local/lib64目錄,所以要將相關路徑載入到PKG_CONFIG_PATH和LD_LIBRARY_PATH。執行下面命令編輯profile檔案:

cd
vi .bash_profile

往.bash_profile的檔案末尾新增下面兩行:

export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64

儲存並退出.bash_profile之後,執行以下命令載入環境變數:

source .bash_profile

然後執行下面的環境變數檢視命令,確保環境變數PKG_CONFIG_PATH和LD_LIBRARY_PATH已經成功載入。

env | grep PKG_CONFIG_PATH
env | grep LD_LIBRARY_PATH

2、回到FFmpeg原始碼的目錄,執行以下命令重新配置FFmpeg,主要增加啟用libaom、libdav1d、libsvtav1。(增加了選項--enable-libaom --enable-libsvtav1 --enable-libdav1d)

./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc --enable-zlib --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libdavs2 --enable-libmp3lame --enable-libfreetype --enable-libass --enable-libfribidi --enable-libxml2 --enable-fontconfig --enable-sdl2 --enable-libvorbis --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 --enable-libopus --enable-libvpx --enable-openssl --enable-libaom --enable-libsvtav1 --enable-libdav1d --enable-libuavs3d --enable-iconv --enable-gpl --enable-nonfree

3、執行下面命令編譯FFmpeg。

make clean
make -j4

4、執行下面命令安裝FFmpeg。

make install

5、執行以下命令檢視FFmpeg的版本資訊。

ffmpeg -version

檢視控制檯回顯的FFmpeg版本資訊,找到“--enable-libaom --enable-libsvtav1 --enable-libdav1d”,說明FFmpeg正確啟用了AV1的三個編解碼器libaom、libdav1d、libsvtav1。

相關文章