基於FFmpeg+VAAPI的硬件加速渲染技術


轉載自 靈躍雲 :原文鏈接 

1. 寫在前面

         硬件加速即利用GPU來完成圖形相關的操作,將CPU空閑出來處理其他事務,特別是在CPU性能不足的情況下,此類操作就更必要了。在視頻處理上,DXVA是微軟定制的視頻加速規范,而在Linux 平台上則是由NVIDIA和Intel分別提供的VDPAU和VAAPI加速規范。靈躍桌面雲利用上述API可以有效加速視頻解碼和圖像處理,降低系統CPU占用,提升系統性能。

2. 實現方案

         針對Intel CPU X86架構平台,可采用FFmpeg+VAAPI的硬解方案。其中,FFmpeg用於處理各種格式的視頻解碼;VAAPI則提供對硬件加速視頻處理的訪問,處理流程圖如下。 

 

 

2.1 相關環境部署

 (一)安裝依賴包

# apt-get install autoconf automake debhelper ladspa-sdk libsoundio-dev libbluray-dev libbs2b-dev libcaca-dev libcdio-paranoia-dev libdvdnav-dev libdvdread-dev libegl1-mesa-dev libenca-dev libfontconfig1-dev libfreetype6-dev libfribidi-dev libgl1-mesa-dev libgbm-dev libgme-dev libgnutls28-dev libgsm1-dev libguess-dev libharfbuzz-dev libjack-jackd2-dev libjpeg-dev liblcms2-dev liblircclient-dev liblua5.3-dev libmodplug-dev libmp3lame-dev libnetcdf-dev libopenal-dev libopus-dev libopencore-amrnb-dev libopencore-amrwb-dev libpulse-dev librtmp-dev librubberband-dev libschroedinger-dev libsmbclient-dev libssh-dev libsoxr-dev libspeex-dev libtheora-dev libtool libtwolame-dev libuchardet-dev libv4l-dev libva-dev libvorbis-dev libvo-amrwbenc-dev libvpx-dev libwavpack-dev libx264-dev libx265-dev libx11-dev libxext-dev libxinerama-dev libxrandr-dev libxss-dev libxv-dev libxvidcore-dev pkg-config python python-docutils x11proto-core-dev yasm zlib1g-dev

(二)安裝libva

        進入當前用戶目錄,並下載libva源碼包:

# cd ~

#git clone https://github.com/01org/libva.git

        進入libva文件夾中,

#cd libva

        切換到1.7.3版本:

# git checkout libva-1.7.3

        執行編譯安裝:

./autogen.sh && ./configure && make && make install

        運行vainfo查看執行結果

        圖中紅框內表示當前所支持硬解的視頻壓縮格式。

(三)安裝FFmpeg

        進入靈躍桌面雲當前用戶目錄,並下載FFmpeg源碼包

# cd ~

#git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

        進入FFmpeg文件夾中,

#cd ffmpeg

        執行編譯安裝

./configure --disable-static --enable-shared --enable-gpl --enable-version3 --disable-debug --enable-vaapi &&make && make install

        最后執行ffmpeg查看執行結果。

 

2.2 代碼實現

(一)視頻播放原理

         簡單來說,視頻播放器在播放本地視頻文件需要經歷以下步驟:解封裝,解碼,音視頻幀同步,最終會把數據投遞到對應的驅動設備,具體過程如下圖所示:

 

 

(二)VAAPI解碼流程

        當程序把視頻的壓縮數據傳遞到VAAPI解碼模塊時,會根據視頻的壓縮格式(如H.264.MPEG-2等)創建對應的VADecoder,然后把數據送入VADecoder進行解碼,最后由vaPutSurface來處理視頻解碼后的合成和渲染,具體過程如下:

 

 

(三)具體實現

        基於VAAPI和FFmpeg的解碼流程圖如下:

 

 

        由於靈躍桌面雲使用的FFmpeg的版本是3.3版本,里面集成了VAAPI中對視頻的細節處理,所以只需要在AVCodecContext的get_format回調函數中指定硬解參數,解碼后的視頻數據會存儲在GPU內存中,通過vaPutSruface函數來處理后期的合成和圖像渲染,下圖為窗口創建和圖像處理的過程圖:

  

3. 測試結果

 

        本次測試為對比使用GPU硬解和CPU軟解的CPU占用率,視頻參數:分辨率1920*1080 、幀率25FPS、編碼格式H.264。靈躍桌面雲依據測試結果可以看出,使用GPU硬解能大大降低CPU使用率,同時畫面輸出更加清晰流暢。

 

解碼類型

CPU占用百分比

基於VAAPI的GPU硬解

4%

基於CPU軟解

50%

 

4. 寫在最后

         至此,靈躍桌面雲基於VAAPI 的硬件加速技術介紹完畢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM