FFmpeg開發筆記(二十一)Windows環境給FFmpeg整合AVS3解碼器

aqi00發表於2024-05-18
AVS3是中國AVS工作組制定的第三代音影片編解碼技術標準,也是全球首個已推出的面向8K及5G產業應用的影片編碼標準。AVS工作組於2019年3月9日完成第三代AVS影片標準(AVS3)基準檔次的制訂工作,參考軟體的測試表明,AVS3基準檔次的效能比上一代標準AVS2和HEVC提升了約30%。

libuavs3d是AVS3標準的解碼器,最高可支援8K/60P影片實時解碼,支援windows/linux/arm/ios等所有常用平臺,在移動端最高支援4K/30fps影片實時解碼,解碼速度大幅領先AV1開源解碼器dav1d和aomdec。
在《FFmpeg開發實戰:從零基礎到短影片上線》一書的“8.1.2 給FFmpeg整合avs2”介紹瞭如何在Windows環境給FFmpeg整合AVS2的編解碼器,其實也能給FFmpeg整合AVS3的解碼器libuavs3d。詳細的整合步驟說明如下。

一、編譯AVS3的解碼器libuavs3d

libuavs3d的原始碼託管在https://github.com/uavs3/uavs3d,注意要下載master的主幹程式碼,不可下載2019年的1.0版本程式碼(該版本的原始碼編譯有問題)。主幹程式碼的下載地址是https://codeload.github.com/uavs3/uavs3d/zip/refs/heads/master,把該連結複製到瀏覽器地址再按Enter鍵,即可開始下載原始碼包。
libuavs3d的編譯步驟說明如下。
1、解壓下載好的壓縮包,雙擊執行uavs3d-master原始碼目錄下的version.bat,以便生成標頭檔案version.h。
2、啟動Visual Studio 2022,在歡迎頁面單擊右側的“開啟專案或解決方案”,在彈出的檔案對話方塊中選擇uavs3d-master/build/vs2017目錄下的uavs3d.sln。
3、等待Visual Studio開啟uavs3d-master工程,依次選擇頂部選單“生成”→“配置管理器”,在開啟的配置管理器介面上,找到左上角的“活動解決方案配置”下拉框,把Debug模式改為Release模式,再單擊右下角的關閉按鈕。
4、右擊介面右側解決方案列表中的common,選擇右鍵選單底部的“屬性”。在彈出的屬性視窗中,將右側常規屬性列表中的“Windows SDK 版本”這項改為“10.0(最新安裝的版本)”,將“平臺工具集”這項改為“Visual Studio 2022(v143)”,目的是把這兩項的值改為自己電腦上的版本。

5、右擊介面右側解決方案列表中的libuavs3d,選擇右鍵選單底部的“屬性”。在彈出的屬性視窗中,將右側常規屬性列表中的“Windows SDK 版本”這項改為“10.0(最新安裝的版本)”,將“平臺工具集”這項改為“Visual Studio 2022(v143)”,目的是把這兩項的值改為自己電腦上的版本。

6、單擊介面右側解決方案列表中的libuavs3d,再依次選擇頂部選單“生成”→“生成libuavs3d”(或“Build libuavs3d”)。等待生成完畢,可在uavs3d工程的uavs3d-master/bin目錄下找到uavs3d的庫檔案(包括libuavs3d.dll和libuavs3d.lib)。

二、安裝AVS3的解碼器libuavs3d

雖然Visual Studio把libuavs3d的dll庫檔案編譯了出來,但是若想讓FFmpeg識別libuavs3d,還得依照相應的目錄結構放入libuavs3d的庫檔案和標頭檔案,從而模擬Linux環境的安裝結果。詳細的安裝步驟參考《FFmpeg開發實戰:從零基礎到短影片上線》一書的第8章的“8.1.4 給FFmpeg整合freetype”。
(1)在msys64的/usr/local目錄下新建libuavs3d目錄,並在該目錄下建立lib子目錄;
(2)把uavs3d工程中uavs3d-master/bin目錄下的libuavs3d.lib和libuavs3d.dll兩個檔案複製到上面第一步建立的lib目錄;
(3)在lib目錄下建立pkgconfig子目錄,並在pkgconfig目錄下新建檔案uavs3d.pc,給該pc檔案填入以下的配置內容。

prefix=/usr/local/libuavs3d
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: uavs3d
Description: AVS3 decoder library 
Version: 1.2.0
Libs: -L${libdir} -luavs3d -lm -lpthread
Cflags: -I${includedir}

(4)在libuavs3d目錄下建立include目錄,並把uavs3d工程的uavs3d-master/source/decoder/uavs3d.h複製到include目錄下。
經過以上步驟操作後的libuavs3d目錄結構如下所示:

/usr/local/libuavs3d
 |--------------- lib
 |                 |-- libuavs3d.lib
 |                 |-- libuavs3d.dll
 |                 |-- pkgconfig
 |                        |----- uavs3d.pc
 |--------------- include

(5)接著給環境變數PKG_CONFIG_PATH新增libuavs3d的pkgconfig路徑,也就是在/etc/profile檔案末尾新增如下一行內容。

export PKG_CONFIG_PATH=/usr/local/libuavs3d/lib/pkgconfig:$PKG_CONFIG_PATH

(6)儲存並退出profile檔案後,在MSYS視窗中執行下面命令重新載入環境變數。

source /etc/profile

(7)執行下面命令檢視當前的環境變數,發現PKG_CONFIG_PATH的修改已經奏效。

env | grep PKG_CONFIG_PATH

三、讓FFmpeg啟用libuavs3d

由於FFmpeg預設未啟用libuavs3d,因此需要重新配置FFmpeg,標明啟用libuavs3d,然後重新編譯安裝FFmpeg。FFmpeg的Windows環境完整編譯過程參見《FFmpeg開發實戰:從零基礎到短影片上線》一書的“8.1 Windows環境編譯FFmpeg”,詳細的啟用步驟說明如下。
1、回到FFmpeg原始碼的目錄,執行以下命令重新配置FFmpeg,主要增加啟用libuavs3d。(增加了選項--enable-libuavs3d)

./configure  --prefix=/usr/local/ffmpeg --arch=x86_64 --enable-shared --disable-static --disable-doc --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libdavs2 --enable-libmp3lame --enable-gpl --enable-nonfree --enable-libfreetype --enable-sdl2 --enable-libvorbis --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 --enable-libopus --enable-libvpx --enable-libass --enable-libfribidi --enable-libxml2 --enable-fontconfig --enable-openssl --enable-libuavs3d --enable-iconv --enable-zlib --extra-cflags='-I/usr/local/lame/include -I/usr/local/libogg/include -I/usr/local/amr/include' --extra-ldflags='-L/usr/local/lame/lib -L/usr/local/libogg/lib -L/usr/local/amr/lib' --cross-prefix=x86_64-w64-mingw32- --target-os=mingw32

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

make clean
make -j4

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

make install
cp /usr/local/libuavs3d/lib/*.dll /usr/local/ffmpeg/bin

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

ffmpeg -version

檢視控制檯回顯的FFmpeg版本資訊,找到“--enable-libuavs3d”,說明FFmpeg正確啟用了AVS3的解碼器libuavs3d。

相關文章