主机已安装gstreamer1.0。
若未安装gstreamer,安装教程链接: gstreamer官方教程
参考链接:How to install Gstreamer VAAPI plugins on Ubuntu? - LifeStyleTransfer (需要)
- 独显:独立显卡
- 核显:焊接在CPU上的显卡
- 集显:焊接在主板(或主板北桥芯片)的显卡
要求存在intel显卡
lspci |grep VGA
0:02.0 VGA compatible controller: Intel Corporation Device 3ea9 (rev 01)
若此处输出的是NVIDIA显卡信息,则查看后续步骤
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
上述两种输出,存在其一即可
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 驱动存在,即有硬件编解码能力
以上3种显卡,根据本机显卡选其一安装相应驱动即可(目前仅intel显卡驱动安装成功)
主要在我们的程序与Intel 集显之间起桥梁作用。传输打包的缓存以及命令到i965驱动(开源的intel集显驱动,已集成在Linux内核中),用于硬件加速的视频编解码,着色器处理等。
sudo add-apt-repository ppa:oibaf/graphics-drivers
sudo apt update
sudo apt install va-driver-all
va-driver-all包含:
- i965-va-driver or i965-va-driver-shaders [amd64, i386, x32]: VAAPI driver for Intel G45 & HD Graphics family
- intel-media-va-driver or intel-media-va-driver-non-free [amd64, i386, x32]: VAAPI driver for the Intel GEN8+ Graphics family
- mesa-va-drivers: Mesa VA-API video acceleration drivers
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
问题待解决:安装gstreamer1.0-vaapi后,gst-inspect-1.0 vaapi 提示没有vaapi插件
sudo apt install vdpau-va-driver
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
用于查看libva库调用信息
sudo apt install vainfo
将会安装相关依赖:libva-drm1,libva-wayland1,libva-x11-1,libva1
- drm: 启用VA/DRM API支持
- wayland: 启用dev-libs/wayland后端
- 启用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
......
vim ~/.bashrc
export LIBVA_DRIVER_NAME=i965
export LIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri
source ~/.bashrc
注: intel显卡的LIBVA_DRIVER_NAME使用 i965_drv_video.so,尽量不使用 iHD_drv_video.so,实测gstreamer1.16版本已不支持
sudo apt install gstreamer1.0-vaapi
/usr/bin/gst-launch-1.0 --version
GStreamer 1.16.3
链接:gstreamer源码下载
cd gstreamer-vaapi-xxx
./autogen.sh --disable-gtk-doc --prefix=/usr
make -j6
sudo make install
/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
sudo apt install intel-gpu-tools
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%
硬解
gst-launch-1.0 -e rtspsrc location=rtsp://{$user}:{$passwd}@{$ip}:554/Streaming/channels/101 ! rtph264depay ! h264parse ! vaapih264dec ! fakesink
软解
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
硬编
gst-launch-1.0 videotestsrc num-buffers=10000 ! vaapih264enc ! fakesink sync=false
软编
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
在cpu占用上,两者几乎没有区别
本指令在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流,更改视频分辨率后,降低输出带宽并尽量减小推流延迟
low-latency开启后,推流画面不会出现闪回现象
修改视频分辨率等信息。可用其他元素代替,注意CPU占用
设置码率。单位:kbps
码率控制。使用cbr
X264显式支持的码率控制方法:ABR(CBR/VBR), CQP, CRF。
- ABR, 恒定平均目标码率。想要选择这种码率控制方法,必须先设置bitrate
- CBR: 适用于流媒体或者目标码率受限的实时应用场景
- VBR: 适用于有目标码率限制而又有时间可以进行二次编码的非实时应用
- CQP,一般不推荐使用,在一些算法验证工作中会使用这种模式
- CRF,恒定Rate Factor(码率系数)。适合在关注一遍编码质量而输出文件大小或码率不是太紧要的场景下使用,一般网络压片使用CRF
X264码率控制 参考链接:X264码率控制
基于上下文的自适应二进制算术编码。是H.264/AVC标准中两种熵编码中的一种。编码后的平均码长更逼近图像的信息熵,达到最佳的编码效率
在I帧中使用自适应8x8矩阵变换。图像视觉质量增加
两个key帧间的最大距离。改小后,画面质量降低很多