在Ubuntu18.04上从源码构建Gstreamer

GST Framework

GST工作模型

Elements可以分为Source, Sink 以及中间级的Filter和Codecs,Elements之间通过传递buffer以及消息来实现具体的业务逻辑,source elements生产buffer,sink elements消费buffer.

多个Elements通过pads首尾相连,可以构成一个Bin,从外部看,Bin可以看成一个更复杂的Elements,通常情况下,多个业务联系紧密的Elements可以构成一个Bin单元,通过Bin再向上提供新的功能。

包含源组件和汇组件的Bin可以构成pipeline,基于pipeline可以构建基于Gstreamer的应用程序。

1.apt-get安装

apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio

安装过程如下:

安装结束后,gstreamer的开发环境就建好了,我们没有从源码开始编译,所以没有遇到什么问题。安装的文件包括gstreamer库以及一些可执行文件的用例,通过这些用例用户可以简单对gstreamer进行测试。

扫描二维码关注公众号,回复: 13154246 查看本文章

测试片源播放,以MKV容器格式的文件为例,用gst-play搭建播放管道:

gst-play-1.0 /media/caozilong/ntfs/[email protected]


基于gstreamer SDK做二次开发:

上面提到,通过命令行安装方式获得的gst sdk 除了包含类似于gst-play 这种开箱即用的程序之外,还包括释放了一大堆的运行库,供客户二次开发使用。

下面的命令可以查看GCC链接阶段引用的GST库有那些:

pkg-config --cflags --libs gstreamer-1.0

可以看到,客户二次开发需要引用到的和GST有关的库还真不少。

下面基于安装好的GST SDK环境开发一个简单的用户程序:

GST官网提供了教程程序,不用我们手搓代码,教程在GIT仓库中被管理,下载下来;

git clone https://gitlab.freedesktop.org/gstreamer/gst-docs

官网文档地址如下:https://gstreamer.freedesktop.org/documentation/tutorials/index.html?gi-language=c

以basic-tutorial-1.c为例,它 ./在gst-docs/examples/tutorials路径下:

执行编译命令:

gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`

运行用例:

basic-tutorial-1.c是一个简单的播放器,片源都是代码里面写死的。代码非常的精简,这也是有框架的好处:

Gstreamer软件包包括:

  1. gstreamer:核心软件包。
  2. gst-plugins-base:必须的基本元件。
  3. gst-plugins-good:在LPGL授权下的一组品质良好的元件.
  4. gst-plugins-ugly:在授权上有法律问题,但是品质良好的元件.
  5. gst-plugins-bad:质量不高,品质查的元件.
  6. gst-libav:一组包装ffmpeg以进行解码和编码的插件, gst-ffmpeg从版本v1.0之后改名为gst-libav.

从源码构建:

下载链接:https://gstreamer.freedesktop.org/src/

不知道是不是相同版本号的组件之间才可以兼容,以防万一,这里用版本号相同的组件。

解压gstreamer-1.18.4.tar.xz

tar xvf tarball/gstreamer-1.18.4.tar.xz

安装编译依赖:

sudo apt-get install build-essential dpkg-dev flex bison autotools-dev automake liborc-dev autopoint libtool gtk-doc-tools python3-pip bison flex

最新的GST不再使用老的./configure && make && make install 三板斧构建系统,而是使用meson.

安装meson

安装meson的命令是:

sudo pip3 install meson
sudo apt install ninja-build

meson安装成功后,执行meson build生成构建配置文件

meson build

过程中似乎有一些依赖没有安装,但meson并没有报告致命错误并给出了正确配置,但为了小心,我们还是把缺失的依赖给它安装上。

sudo snap install valgrind  --classic
sudo apt install valgrind
sudo apt-get install libgirepository1.0-dev libcap-dev libgtk-3-dev libunwind-dev clzip gobject-introspection libdw-dev

其中GSL和GMP库需要从源码开始编译安装,按照./configure && make && make install 三部操作即可安装。

GMP:https://gmplib.org/
GSL:http://www.gnu.org/software/gsl/

安装上面的依赖后,在重新执行meson build,会发现依赖很少有缺失了。

然后执行ninja -C build进行编译:

ninja -C build

执行安装命令

 ninja -C build install

验证:

为了验证gstreamer主框架的编译结果,我们模拟搭建一个pipeline测试一下,首先,设置环境变量,使得编译生成的本地动态库路径可以被识别到

执行命令

export LD_LIBRARY_PATH=/home/caozilong/Workspace/gstreamer/gstreamer-1.18.4/build/plugins/elements:/home/caozilong/Workspace/gstreamer/gstreamer-1.18.4/build/libs/gst/base/:$LD_LIBRARY_PATH

之后,输入测试命令,搭建从fakesrc到fakesink的数据流管道

./build/tools/gst-launch-1.0 -v fakesrc num_buffers=5 ! fakesink

输出如下信息,提示管道从输入到输出的搭建过程,表示编译正确:

编译gst-plugins-base-1.18.4

安装依赖:

sudo apt-get install libxv-dev libasound2-dev libtheora-dev libogg-dev libvorbis-dev

解压:

配置:

编译:

安装:

安装gst-plugins-good-1.18.4.tar.xz

sudo apt-get install libbz2-dev libv4l-dev libvpx-dev libjack-jackd2-dev libsoup2.4-dev libpulse-dev

解压:

编译,安装:

 ninja -C build
 ninja -C build install

安装gst-plugins-bad-1.18.4

安装依赖:

sudo apt-get install faad libfaad-dev libfaac-dev

解压:

配置build:

编译,安装:

安装gst-plugins-ugly-1.18.4

安装依赖

sudo apt-get install libx264-dev libmad0-dev

解压:

meson build 配置:

编译,安装:

安装gst-libav-1.18.4

安装依赖:

sudo apt-get install yasm

解压:

配置:

 

配置失败,是因为gst-libav之是一个符合GST插件标准的壳,真正完成编码,解码的是ffmpeg,上图的警告很明显,告诉我们需要libavfilter找不到,libavfilter是ffmpeg专门用来进行容器解封装的组件,所以下一步,我们首先安装ffmpeg.

下载ffmpeg解压:

配置,进入ffmpeg-4.3.2目录,执行:

./configure --enable-shared --prefix=/usr/local/ffmpeg

完成后,执行 make && sudo make install

ffmpeg安装完毕.

安装完毕ffmpeg之后,接着上一步配置操作,执行meson build ,发现错误依旧。

执行pkg-config --cflags --libs libavfilter测试发现,仍然无法找到libavfilter

由于pkg-config是根据.pc文件更新配置的,怀疑无法找到正确的libavfilter.pc文件,这个文件在:

索性把路径全部加进去:

export PKG_CONFIG_PATH=/home/caozilong/Workspace/gstreamer/ffmpeg/ffmpeg-4.3.2/libavfilter:/home/caozilong/Workspace/gstreamer/ffmpeg/ffmpeg-4.3.2/libavdevice:/home/caozilong/Workspace/gstreamer/ffmpeg/ffmpeg-4.3.2/libswscale:/home/caozilong/Workspace/gstreamer/ffmpeg/ffmpeg-4.3.2/libavutil:/home/caozilong/Workspace/gstreamer/ffmpeg/ffmpeg-4.3.2/libavformat:/home/caozilong/Workspace/gstreamer/ffmpeg/ffmpeg-4.3.2/libavcodec:/home/caozilong/Workspace/gstreamer/ffmpeg/ffmpeg-4.3.2/libswresample

再次执行

pkg-config --cflags --libs libavfilter

得到正确输出:

在同一个终端下再次执行meson build配置,成功:

这里我们可以得到一个结论,就是gst是一个框架,它的解码和编码实际上是由FFMPEG完成的。

编译,安装:

至此,gst所有的组件已经安装完毕,真的非常麻烦,

最后,将运行时需要的一些库路径导出到环境变量里面:

export LD_LIBRARY_PATH=/usr/local/ffmpeg/lib:$LD_LIBRARY_PATH

测试:

Gstreamer调试工具安装:

安装命令:sudo apt-get install gstreamer-tools

执行后,系统会安装好如下命令:


结束!

猜你喜欢

转载自blog.csdn.net/tugouxp/article/details/115424076