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进行测试。
测试片源播放,以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软件包包括:
- gstreamer:核心软件包。
- gst-plugins-base:必须的基本元件。
- gst-plugins-good:在LPGL授权下的一组品质良好的元件.
- gst-plugins-ugly:在授权上有法律问题,但是品质良好的元件.
- gst-plugins-bad:质量不高,品质查的元件.
- 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
执行后,系统会安装好如下命令: