ubuntu系统 intel显卡 为gstreamer安装vaapi硬编解插件

前言

主机已安装gstreamer1.0。
若未安装gstreamer,安装教程链接: gstreamer官方教程

参考链接:How to install Gstreamer VAAPI plugins on Ubuntu? - LifeStyleTransfer (需要)

vaapi硬件要求

硬件要求

  1. intel显卡
  2. nvidia(gstreamer+vaapi未成功,后续待尝试)
  1. 独显:独立显卡
  2. 核显:焊接在CPU上的显卡
  3. 集显:焊接在主板(或主板北桥芯片)的显卡

查看显卡

要求存在intel显卡

查看当前在用的显卡

lspci |grep VGA

0:02.0 VGA compatible controller: Intel Corporation Device 3ea9 (rev 01)

若此处输出的是NVIDIA显卡信息,则查看后续步骤

查看intel显卡信息

lspci -k

00:02.0 VGA compatible controller: Intel Corporation Device 3ea9 (rev 01)
	DeviceName:  CPU
	Subsystem: Intel Corporation Device 2074
	Kernel driver in use: i915
	Kernel modules: i915

或者:

00:02.0 Display controller: Intel Corporation UHD Graphics 630 (Desktop)
	DeviceName: Onboard - Video
	Subsystem: Lenovo UHD Graphics 630 (Desktop)
	Kernel modules: i915

上述两种输出,存在其一即可

查看CPU型号(可不查)

cat /proc/cpuinfo | grep "model name" |uniq

model name	: Intel(R) Core(TM) i3-8140U CPU @ 2.10GHz

获取可使用的驱动

ls /dev/dri

by-path  card0  renderD128

要求 renderDxxx 驱动存在,即有硬件编解码能力


VAAPI 相关库驱动安装

  1. libva: 也就是传说中的VAAPI,是一个开放源代码的提供硬件解码功能的模块;
  2. va-i965-driver: Intel显卡的VAAPI后端,负责连接Intel显示卡驱动与VAAPI。
  3. xvba-video: AMD/ATi显卡的VAAPI后端,负责连接AMD/ATi显示卡驱动与VAAPI。
  4. vdpau: NV显卡的VAAPI后端

以上3种显卡,根据本机显卡选其一安装相应驱动即可(目前仅intel显卡驱动安装成功

intel显卡驱动

安装va-driver

主要在我们的程序与Intel 集显之间起桥梁作用。传输打包的缓存以及命令到i965驱动(开源的intel集显驱动,已集成在Linux内核中),用于硬件加速的视频编解码,着色器处理等。
sudo add-apt-repository ppa:oibaf/graphics-drivers
sudo apt update
sudo apt install va-driver-all

va-driver-all包含:

  1. i965-va-driver or i965-va-driver-shaders [amd64, i386, x32]: VAAPI driver for Intel G45 & HD Graphics family
  2. intel-media-va-driver or intel-media-va-driver-non-free [amd64, i386, x32]: VAAPI driver for the Intel GEN8+ Graphics family
  3. mesa-va-drivers: Mesa VA-API video acceleration drivers

查看drv_video:

ls /usr/lib/x86_64-linux-gnu/dri/ | grep drv_video.so

i965_drv_video.so
iHD_drv_video.so
nouveau_drv_video.so
r600_drv_video.so
radeonsi_drv_video.so

nvidia显卡驱动(仅做记录,可跳过)

问题待解决:安装gstreamer1.0-vaapi后,gst-inspect-1.0 vaapi 提示没有vaapi插件

安装vdpau-va-driver

sudo apt install vdpau-va-driver

查看drv_video:

ls /usr/lib/x86_64-linux-gnu/dri/ | grep drv_video.so

i965_drv_video.so
nouveau_drv_video.so
nvidia_drv_video.so
r600_drv_video.so
radeonsi_drv_video.so
s3g_drv_video.so
vdpau_drv_video.so

安装vainfo:

用于查看libva库调用信息

sudo apt install vainfo

将会安装相关依赖:libva-drm1,libva-wayland1,libva-x11-1,libva1

  1. drm: 启用VA/DRM API支持
  2. wayland: 启用dev-libs/wayland后端
  3. 启用VAAPI支持将引入 x11-libs/libva包,该包具有以下USE标记:x11-libs / libva的USE标志 适用于Linux的视频加速(VA)API
  • 诊断指令:vainfo
vainfo: VA-API version: 1.12 (libva 2.6.0)
vainfo: Driver version: Intel i965 driver for Intel(R) Gen Graphics - 21.2.3 (008fb3b)
vainfo: Supported profile and entrypoints
        VAProfileNone                   : VAEntrypointVideoProc
        VAProfileNone                   : VAEntrypointStats
        VAProfileMPEG2Simple            : VAEntrypointVLD
        ......
  • 配置环境变量:
  1. vim ~/.bashrc
    最后面添加
export LIBVA_DRIVER_NAME=i965
export LIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri
  1. 激活配置:
    source ~/.bashrc

注: intel显卡的LIBVA_DRIVER_NAME使用 i965_drv_video.so,尽量不使用 iHD_drv_video.so,实测gstreamer1.16版本已不支持


安装gstreamer-vaapi

第一种:apt安装(跟随系统默认gstreamer版本)

sudo apt install gstreamer1.0-vaapi

第二种:源码编译安装

查看本机gstreamer版本

/usr/bin/gst-launch-1.0 --version

GStreamer 1.16.3

下载源码

链接:gstreamer源码下载

  1. 查找对应版本,下载
  2. 解压缩,进入目录

cd gstreamer-vaapi-xxx

  1. 编译安装:

./autogen.sh --disable-gtk-doc --prefix=/usr
make -j6
sudo make install

查看vaapi插件信息

/usr/bin/gst-inspect-1.0 vaapi

Plugin Details:
  Name                     vaapi
  Description              VA-API based elements
  Filename                 /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstvaapi.so
  Version                  1.16.2
  License                  LGPL
  Source module            gstreamer-vaapi
  Source release date      2019-12-03
  Binary package           gstreamer-vaapi
  Origin URL               http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer

  vaapih264enc: VA-API H264 encoder
  vaapijpegenc: VA-API JPEG encoder
  vaapivp9enc: VA-API VP9 encoder
  ......

若最后面的element信息不存在,则安装失败。检查前面步骤是否出现报错

查看硬编

/usr/bin/gst-inspect-1.0 vaapih264enc

查看硬解

/usr/bin/gst-inspect-1.0 vaapih264dec


intel显卡查看工具

安装

sudo apt install intel-gpu-tools

查看intel gpu使用状态

sudo intel_gpu_top

intel-gpu-top -  859/ 862 MHz;   29% RC6;  3.78 Watts;     4006 irqs/s

      IMC reads:     2809 MiB/s
     IMC writes:     1912 MiB/s

          ENGINE      BUSY                                                              MI_SEMA MI_WAIT
     Render/3D/0   41.11% |████████████████████████▎                                  |      8%      0%
       Blitter/0    4.02% |██▎                                                        |      0%      0%
         Video/0   39.09% |███████████████████████                                    |      4%      0%
  VideoEnhance/0    0.00% |                                                           |      0%      0%

测试指令

硬解 vs 软解

  1. 硬解
    gst-launch-1.0 -e rtspsrc location=rtsp://{$user}:{$passwd}@{$ip}:554/Streaming/channels/101 ! rtph264depay ! h264parse ! vaapih264dec ! fakesink

  2. 软解
    gst-launch-1.0 -e rtspsrc location=rtsp://{$user}:{$passwd}@{$ip}:554/Streaming/channels/101 ! rtph264depay ! h264parse ! avdec_h264 ! fakesink

CPU占用对比:

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                           
 139992 xxx      20   0 1055452  54640  36124 S  16.6   0.7   0:04.04 gst-launch-1.0                    
 140007 xxx      20   0 1291160  62328  47588 S   2.6   0.8   0:00.73 gst-launch-1.0

硬编 vs 软编

  1. 硬编
    gst-launch-1.0 videotestsrc num-buffers=10000 ! vaapih264enc ! fakesink sync=false

  2. 软编
    gst-launch-1.0 videotestsrc num-buffers=10000 ! x264enc ! fakesink

CPU占用对比:

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                           
 140377 xxx      20   0  293604  65604   8728 S 230.2   0.8   0:07.66 gst-launch-1.0                    
 140388 xxx      20   0  274532  18944  14800 S  73.4   0.2   0:02.21 gst-launch-1.0

图像转换:vaapipostproc vs videoconvert

在cpu占用上,两者几乎没有区别

nuc实测

本指令在NUC8i3BEHS上进行测试,占用CPU 13%左右

gst-launch-1.0 rtspsrc location=rtsp://{$user}:{$passwd}@{$ip}:554/Streaming/channels/101 latency=0 ! rtph264depay ! vaapih264dec low-latency=true ! vaapipostproc width=1280 height=720 ! vaapih264enc bitrate=1024 rate-control=2 cabac=true dct8x8=true ! h264parse config-interval=-1 ! flvmux ! rtmpsink location=rtmp://{$ip}/live/{$channel} sync=false

指令目的:
拉取rtsp流,更改视频分辨率后,降低输出带宽并尽量减小推流延迟

vaapih264dec属性

low-latency开启后,推流画面不会出现闪回现象

vaapipostproc属性

修改视频分辨率等信息。可用其他元素代替,注意CPU占用

vaapih264enc属性

1. bitrate

设置码率。单位:kbps

rate-control

码率控制。使用cbr

X264显式支持的码率控制方法:ABR(CBR/VBR), CQP, CRF。

  1. ABR, 恒定平均目标码率。想要选择这种码率控制方法,必须先设置bitrate
  1. CBR: 适用于流媒体或者目标码率受限的实时应用场景
  2. VBR: 适用于有目标码率限制而又有时间可以进行二次编码的非实时应用
  1. CQP,一般不推荐使用,在一些算法验证工作中会使用这种模式
  2. CRF,恒定Rate Factor(码率系数)。适合在关注一遍编码质量而输出文件大小或码率不是太紧要的场景下使用,一般网络压片使用CRF

X264码率控制 参考链接:X264码率控制

cabac

基于上下文的自适应二进制算术编码。是H.264/AVC标准中两种熵编码中的一种。编码后的平均码长更逼近图像的信息熵,达到最佳的编码效率

dct8x8

在I帧中使用自适应8x8矩阵变换。图像视觉质量增加

keyframe-period

两个key帧间的最大距离。改小后,画面质量降低很多

你可能感兴趣的:(ubuntu,视频编解码,h.264)