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

轉載自 靈躍雲 :原文連接 html

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-devpython

(二)安裝libva

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

# cd ~github

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

        進入libva文件夾中,架構

#cd libvassh

        切換到1.7.3版本:xss

# 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 的硬件加速技術介紹完畢。
相關文章
相關標籤/搜索