Ubuntu20.04 编译 gstreamer 支持gpu硬编解 opencv-python同支持gst

  • Post author:
  • Post category:python

什么是Gstreamer?

Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。

下图是对基于Gstreamer框架的应用的简单分层:
在这里插入图片描述
参考

新版编解码

gstreamer 自1.17.1开始,便抛弃了老版本的gpu硬编解方案,采取了新方案,新方案对环境要求放松,意味着更好编译,更稳定:在这里插入图片描述
老版方案装一些预环境还比较麻烦,所以建议抛弃老版本,用新版本。
另外 ubuntu20.04的默认支持gst1.16.3 所有一些诸如桌面之类依赖会有gst相关的库,在编译时容易链接错误,预计用ubutnu22.04及其以上,配合新版本1.21.3以上,应该会好很多。由于目前需要使用ubutnu20.04,故以下以此记录。

编译安装步骤

预备环境

Ubuntu20.04 python3.8系统自带
测试过如果是anaconda的python,需要把anaconda带的gst给卸载了:
conda uninstall gstreamer gst-plugins-base

编译环境依赖安装

sudo apt-get install build-essential dpkg-dev flex bison autotools-dev automake liborc-dev autopoint libtool gtk-doc-tools python3-pip libmount-dev python3-pip meson bison flex ninja-build  libglib2.0-dev nasm
sudo apt-get install valgrind libgirepository1.0-dev libcap-dev libgtk-3-dev libunwind-dev clzip gobject-introspection libdw-dev
sudo apt-get install libxv-dev libasound2-dev libtheora-dev libogg-dev libvorbis-dev
sudo apt-get install libbz2-dev libv4l-dev libvpx-dev libjack-jackd2-dev libsoup2.4-dev libpulse-dev
sudo apt-get install faad libfaad-dev libfaac-dev libx264-dev libmad0-dev

sudo apt install build-essential cmake git python3-dev python3-numpy \
libavcodec-dev libavformat-dev libswscale-dev libgtk-3-dev libgtk2.0-dev libcanberra-gtk-module \
libpng-dev libjpeg-dev libopenexr-dev libtiff-dev libwebp-dev \
libopencv-dev x264 libx264-dev libssl-dev ffmpeg

编译安装gst

安装1.18版本,对于Ubuntu20.04是合适的选择,对于meson的和ninja可以用系统默认版本,更高版本的gst,要对应升级meson和ninja
默认编译安装位置prefix 是/usr/local,由于ubuntu20.04桌面版本默认安装了gst-1.16.3,所以安装路径不要是/usr,虽然可解决很多编译链接问题。
若装在/usr下,可以不用设置下边的环境变量,但谨慎,若是桌面版本ubutnu20.04,依赖gst的桌面可能出问题,包括但不限于系统设置打不开,依赖qt的一些软件可能打开异常……可用docker装无桌面环境,或者直接就是无桌面的系统规避这个问题。

以下以ubuntu20.04桌面版本,设置prefix的路径安装在gst-build下的install文件夹下,编译后在设置合适的环境变量,即可正确找到动态库

git clone -b 1.18 https://github.com/GStreamer/gst-build.git
meson setup --prefix=/home/lenovo/compiled_project/gst-build/install build -Dbad=enabled -Dgst-plugins-bad:nvcodec=enabled

#设置环境变量 可以编译安装之后设置,也可以现在按照下方的路径规律,替换掉安装的根目录,主要是不是一步步的编译方式,所有这个过程不太严谨
gedit ~/.bashrc
 
#在末尾添加 
export LD_LIBRARY_PATH=/home/lenovo/compiled_project/gst-build/install/lib:/home/lenovo/compiled_project/gst-build/install/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/home/lenovo/compiled_project/gst-build/install/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH
export GST_PLUGIN_PATH=/home/lenovo/compiled_project/gst-build/install/lib/x86_64-linux-gnu/gstreamer-1.0
#激活环境变量
source ~/.bashrc

#编译安装
sudo ninja -C build install

gst-inspect-1.0  --version #查看是否安装成功
gst-inspect-1.0 -a | grep nvh264

#测试代码 若无报错可跑基本没啥问题
gst-launch-1.0 rtspsrc location=rtsp://xxx:xxx@192.168.0.2:554/h264/ch1/main/av_stream ! rtph264depay ! h264parse ! nvh264dec ! videoconvert ! videoscale ! video/x-raw,width=640,height=480 ! nvh264enc ! h264parse ! filesink location=vid2.mp4

#类似报错 即下载出错,自己用浏览器下载后解压到subprojects下并修改为对应名称,请注意版本,可以去对应名字的.wrap文件下去看,对于gst-plugins-base、gst-plugins-good,gst-plugins-bad,gst-plugins-ugly,去https://gitlab.freedesktop.org/gstreamer提前下载放subprojects下,版本对应1.18

subprocess.CalledProcessError: Command '['/bin/git', '-C', '/home/argo/compiled_project/gst-build-1.18/subprojects', 'clone', 'https://gitlab.gnome.org/gnome/libsoup.git', 'libsoup']' returned non-zero exit status 128.

opencv-python支持gst

opencv-python 支持此时的gst,也就同样可以用硬编解
即重新编译安装opencv-python即可
参考

一些记录

参考官网安装,以及dpkg查看gstreamer安装,
dpkg -l | grep libgstreamer
conda list | grep gst
ubuntu 桌面依赖于gst的,所有有相关的动态库等的安装 sudo apt show ubuntu-desktop | grep gstreamer
版本可见是1.16,所以如果不正确配置,会链接错误

参考网址:

https://mesonbuild.com/Tutorial.html
https://gstreamer.freedesktop.org/documentation/installing/index.html?gi-language=c
https://gitlab.freedesktop.org/gstreamer/gst-build
https://github.com/GStreamer/gst-build
编译步骤参考:
https://blog.csdn.net/cdnight/article/details/112093636


版权声明:本文为weixin_44359953原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。