1. 确定源码版本
首先,需要通过下方链接确定需要安装代码库的版本号。本教程选择的是Media SDK 20.2.1,里面对应的libva、libva-utils版本为2.8.0,Gmmlib版本为20.2.2,Driver版本为20.2.0。
https://github.com/Intel-Media-SDK/MediaSDK/releases
2. VA-API编译安装
sudo apt-get install -y dh-autoreconf pkg-config
apt-get install -y libncurses5-dev libpthread-stubs0-dev libpciaccess-dev libxvmc-dev xutils-dev libsdl2-dev libxcb-shm0-dev
git clone https://github.com/intel/libva.git
git clone https://github.com/intel/libva-utils.git
cd $WORKING_DIR/libva
git checkout <libva commit id>
./autogen.sh --prefix=/opt/intel/libva --libdir=/opt/intel/libva/lib
make -j4
sudo make install
export PKG_CONFIG_PATH=/opt/intel/libva/lib/pkgconfig
cd $WORKING_DIR/libva-utils
git checkout <libva-utils commit id>
./autogen.sh --prefix=/opt/intel/libva-utils --libdir=/opt/intel/libva-utils/lib
make -j4
sudo make install
3. Media-Driver编译安装
git clone https://github.com/intel/media-driver.git
git clone https://github.com/intel/gmmlib.git
cd $WORKING_DIR/gmmlib
git checkout <gmmlib commit id>
cd $WORKING_DIR/media-driver
git checkout <media-driver commit id>
cd $WORKING_DIR
mkdir -p build
cd $WORKING_DIR/build
cmake ../media-driver \
-DMEDIA_VERSION="2.0.0" \
-DBUILD_ALONG_WITH_CMRTLIB=1 \
-DBS_DIR_GMMLIB=`pwd`/../gmmlib/Source/GmmLib/ \
-DBS_DIR_COMMON=`pwd`/../gmmlib/Source/Common/ \
-DBS_DIR_INC=`pwd`/../gmmlib/Source/inc/ \
-DBS_DIR_MEDIA=`pwd`/../media-driver \
-DCMAKE_INSTALL_PREFIX=/opt/intel/media-driver \
-DCMAKE_INSTALL_LIBDIR=/opt/intel/media-driver/lib \
-DINSTALL_DRIVERS_SYSCONF=OFF \
-DLIBVA_DRIVERS_PATH=/opt/intel/media-driver/lib/dri
make -j8
sudo make install
测试media-driver
是否成功安装
export LIBVA_DRIVER_NAME=iHD
export LIBVA_DRIVERS_PATH=/opt/intel/media-driver/lib/dri
cd /opt/intel/libva-utils/bin
./vainfo
成功安装后将显示如下内容:
xx:/opt/intel/libva-utils/bin$ ./vainfo
libva info: VA-API version 1.15.0
libva info: User environment variable requested driver 'iHD'
libva info: Trying to open /opt/intel/media-driver/lib/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_15
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.15 (libva 2.15.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 20.2.0 ()
vainfo: Supported profile and entrypoints
VAProfileNone : VAEntrypointVideoProc
VAProfileNone : VAEntrypointStats
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Simple : VAEntrypointEncSlice
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointFEI
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointFEI
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointFEI
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointFEI
VAProfileHEVCMain : VAEntrypointEncSliceLP
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointEncSlice
VAProfileHEVCMain10 : VAEntrypointEncSliceLP
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile1 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointVLD
VAProfileVP9Profile3 : VAEntrypointVLD
VAProfileHEVCMain12 : VAEntrypointVLD
VAProfileHEVCMain12 : VAEntrypointEncSlice
VAProfileHEVCMain422_10 : VAEntrypointVLD
VAProfileHEVCMain422_10 : VAEntrypointEncSlice
VAProfileHEVCMain422_12 : VAEntrypointVLD
VAProfileHEVCMain422_12 : VAEntrypointEncSlice
VAProfileHEVCMain444 : VAEntrypointVLD
VAProfileHEVCMain444 : VAEntrypointEncSliceLP
VAProfileHEVCMain444_10 : VAEntrypointVLD
VAProfileHEVCMain444_10 : VAEntrypointEncSliceLP
VAProfileHEVCMain444_12 : VAEntrypointVLD
VAProfileHEVCSccMain : VAEntrypointVLD
VAProfileHEVCSccMain : VAEntrypointEncSliceLP
VAProfileHEVCSccMain10 : VAEntrypointVLD
VAProfileHEVCSccMain10 : VAEntrypointEncSliceLP
VAProfileHEVCSccMain444 : VAEntrypointVLD
VAProfileHEVCSccMain444 : VAEntrypointEncSliceLP
VAProfileHEVCSccMain444_10 : VAEntrypointVLD
VAProfileHEVCSccMain444_10 : VAEntrypointEncSliceLP
4. Intel Media SDK源码编译(可选)
cd $WORKING_DIR
git clone https://github.com/Intel-Media-SDK/MediaSDK.git
cd MediaSDK
mkdir build && cd build
cmake ..
make
sudo make install
export LD_LIBRARY_PATH=/opt/intel/mediasdk/lib:$LD_LIBRARY_PATH
测试MSDK是否成功安装(可选操作)
$ cd /opt/intel/mediasdk/share/mfx/samples/
/opt/intel/mediasdk/share/mfx/samples$ ./sample_encode h264 -i /home/amov/output.yuv -w 1920 -h 1080 -vaapi
File output is disabled as -o option isn't specified
libva info: VA-API version 1.15.0
libva info: User environment variable requested driver 'iHD'
libva info: Trying to open /opt/intel/media-driver/lib/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_15
libva info: va_openDriver() returns 0
Encoding Sample Version 20.2.0
Input file format YUV420
Output video AVC
Source picture:
Resolution 1920x1088
Crop X,Y,W,H 0,0,1920,1080
Destination picture:
Resolution 1920x1088
Crop X,Y,W,H 0,0,1920,1080
Frame rate 30.00
Bit rate(Kbps) 3757
Gop size 256
Ref dist 4
Ref number 3
Idr Interval 0
Target usage balanced
Memory type vaapi
Media SDK impl hw
Media SDK version 1.35
Processing started
Processing finished
5. 使用ffmpeg测试intel-VAAPI硬件编码情况
运行该步操作需要提前安装带vaapi的ffmpeg。下面是在i7-1165G7测试的情况,系统是ubuntu 20.04,操作同一个视频文件,intel软编码的CPU使用率为479%,硬编码的CPU使用率为34.3%。此外,延时也非常低。