# 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源碼包: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源碼包
# 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查看執行結果。
簡單來講,視頻播放器在播放本地視頻文件須要經歷如下步驟:解封裝,解碼,音視頻幀同步,最終會把數據投遞到對應的驅動設備,具體過程以下圖所示:
當程序把視頻的壓縮數據傳遞到VAAPI解碼模塊時,會根據視頻的壓縮格式(如H.264.MPEG-2等)建立對應的VADecoder,而後把數據送入VADecoder進行解碼,最後由vaPutSurface來處理視頻解碼後的合成和渲染,具體過程以下:
基於VAAPI和FFmpeg的解碼流程圖以下:
因爲靈躍桌面雲使用的FFmpeg的版本是3.3版本,裏面集成了VAAPI中對視頻的細節處理,因此只須要在AVCodecContext的get_format回調函數中指定硬解參數,解碼後的視頻數據會存儲在GPU內存中,經過vaPutSruface函數來處理後期的合成和圖像渲染,下圖爲窗口建立和圖像處理的過程圖:
本次測試爲對比使用GPU硬解和CPU軟解的CPU佔用率,視頻參數:分辨率1920*1080 、幀率25FPS、編碼格式H.264。靈躍桌面雲依據測試結果能夠看出,使用GPU硬解能大大下降CPU使用率,同時畫面輸出更加清晰流暢。
解碼類型 |
CPU佔用百分比 |
基於VAAPI的GPU硬解 |
4% |
基於CPU軟解 |
50% |