1.寫在前面
?硬件加速即利用GPU來完成圖形相關(guān)的操作,將CPU空閑出來處理其他事務(wù),特別是在CPU性能不足的情況下,此類操作就更必要了。在視頻處理上,DXVA是微軟定制的視頻加速規(guī)范,而在Linux 平臺上則是由NVIDIA和Intel分別提供的VDPAU和VAAPI加速規(guī)范。靈躍桌面云利用上述API可以有效加速視頻解碼和圖像處理,降低系統(tǒng)CPU占用,提升系統(tǒng)性能。
2.實現(xiàn)方案
?針對Intel CPU X86架構(gòu)平臺,可采用FFmpeg+VAAPI的硬解方案。其中,F(xiàn)Fmpeg用于處理各種格式的視頻解碼;VAAPI則提供對硬件加速視頻處理的訪問,處理流程圖如下。

2.1 相關(guān)環(huán)境部署
(一)安裝依賴包
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
?執(zhí)行編譯安裝:
./autogen.sh && ./configure && make && make install
?運行vainfo查看執(zhí)行結(jié)果

圖中紅框內(nèi)表示當前所支持硬解的視頻壓縮格式。
(三)安裝FFmpeg
?進入靈躍桌面云當前用戶目錄,并下載FFmpeg源碼包
cd ~
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
?進入FFmpeg文件夾中,
cd ffmpeg
?執(zhí)行編譯安裝
./configure --disable-static --enable-shared --enable-gpl --enable-version3 --disable-debug --enable-vaapi &&make && make install
?最后執(zhí)行ffmpeg查看執(zhí)行結(jié)果。

2.2 代碼實現(xiàn)
(一)視頻播放原理
?簡單來說,視頻播放器在播放本地視頻文件需要經(jīng)歷以下步驟:解封裝,解碼,音視頻幀同步,最終會把數(shù)據(jù)投遞到對應(yīng)的驅(qū)動設(shè)備,具體過程如下圖所示:

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

(三)具體實現(xiàn)
?基于VAAPI和FFmpeg的解碼流程圖如下:

?由于靈躍桌面云使用的FFmpeg的版本是3.3版本,里面集成了VAAPI中對視頻的細節(jié)處理,所以只需要在AVCodecContext的get_format回調(diào)函數(shù)中指定硬解參數(shù),解碼后的視頻數(shù)據(jù)會存儲在GPU內(nèi)存中,通過vaPutSruface函數(shù)來處理后期的合成和圖像渲染,下圖為窗口創(chuàng)建和圖像處理的過程圖:

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

4.寫在最后
?至此,靈躍桌面云基于VAAPI 的硬件加速技術(shù)介紹完畢。在實際的應(yīng)用場景中,還可進一步與視頻重定向結(jié)合,關(guān)于視頻重定向的結(jié)合應(yīng)用將在后續(xù)更新,請持續(xù)關(guān)注靈躍桌面云公眾號更新。
本文轉(zhuǎn)載于 靈躍云 : 原文鏈接