Gstreamer入门系列教程0:介绍

概述

GStreamer 是用来构建流媒体应用的开源多媒体框架(framework),其目标是要简化音/视频应用程序的开发,已经能够被用来处理像 MP3、Ogg、MPEG1、MPEG2、AVI、Quicktime 等多种格式的多媒体数据。

其跨平台设计,使其能够在Linux(包括x86,PowerPC和ARM架构),Solaris(Intel和SPARC)以及OpenSolaris,FreeBSD,OpenBSD,NetBSD,Mac OS X,Microsoft Windows和OS/400上运行。GStreame也有针对其他语言的绑定如Python,Vala,C++,Perl,GNU Guile和Ruby。GStreamer依据GNU宽通用公共许可证授权。

技术概述

gstreamer跟ffmpeg一样,也是一个媒体框架,可以实现采集,编码,解码,渲染,滤镜等一条龙的媒体解决方案。

  • 跟ffmpeg一样,也是有命令行工具进行测试验证。同时还可以通过代码框架直接封装命令来做工程开发,这一点ffmpeg是不具备的,ffmpeg需要学习API才能做工程开发,就算你会ffplay.exe或ffmpeg.exe验证某些需求,但要集成到代码,需要学习API来实现。而gstreamer只要知道的命令行实现方式,就可以马上命令行集成到代码中进行使用,当然你想代码优雅一点或者你是熟手也可以使用API来实现。
  • Gstreamer是glib实现的,跨平台的实现,windows,linux,androd,ios,macos官方原生支持,而且官方发布了windows,linux,androd,ios包,如果没有特别需求,可以直接拿发布包集成使用。而ffmpeg想支持android,ios,就需要自己做交叉编译了。
  • Gstreamer采用插件实现方式,根据业务需要可以灵活裁剪插件,可以将发布包做的非常小,特别适合在嵌入式和移动端等应用领域,而ffmpeg比较大,在嵌入领域需要自己做代码级裁剪。
  • Gstreamer 采用glib实现,用C语言来实现面向对象思维,完全不是标准C那一套逻辑,由于要跨平台,原生的系统API都是适配封装了一套,甚至自己实现队列,MAP,容器,协程,线程,异步操作,不熟悉glib 的API话,代码理解比较困难,用惯了C,STL,boost,感觉得这是gstream最让人反感的一点,不合主流,搞的我又要学一套API。
  • Gstreamer采用插件管理各个模块,软件框架比较复杂,采用了异步,协程编程模型,进一步增加了理解难度。

一言蔽之,与ffmpeg相比,gstreamer用起来简单,但二次开发难度大,因为框架,异步,协程等没有像ffmpeg 代码用起来那么直接和简单。而ffmpeg要理解API才能使用,用起来比较费劲,好在代码理解比较容易,不过容易和简单只是相对的,用久了深入了就容易了。

GStreamer的程序通过连接数字媒体处理的元素注入管道(pipeline)。每个元素是由一个插件提供 。 元素可组合为箱(bins),箱可以进一步聚合,从而形成架构图。

元素沟通是透过垫(pads)。来源垫(source pad)上一个元素可以被连接到一个接收垫(sink pad)在另一个。当管道是在播放状态,数据缓冲流(data buffers flow)从来源垫(source pad)流向接收垫(sink pad)。

可以体现出如何使用GStreamer播放MP3文件。该文件的源读取 MP3文件从一台计算机的硬盘驱动程序,并将其发送到MP3解码器。解码器解码该MP3数据,并转换成PCM,然后传递到ALSA声音驱动。ALSA的声卡驱动程序发送 PCM声音样本,最后从计算机的扬声器播放。

Plug-ins

GStreamer采用基于插件(plugin)和管道(pipeline)的体系结构,框架中的所有的功能模块都被实现成可以插拔的组件(component),能够很方便地安装到任意管道上。GStreamer使用插件架构并造就了大量的GStreamer的共享库。GStreamer基本功能包括登录与加载,新的组件可以透过基类来获取这些属性。Gstreamer的基类之一是GObject。以Gobject的实现思想而言,可通过2个struct,一个相当于C++ 数据成员,一个相当C++中的成员函数。GStreamer框架中的大部分函数都会涉及到对GstElement对象的操作,GstElement又被区分成Source Element、Filter Element、Sink Element。写gstreamer element的时候,不能使用全局变量,要把这些变量全部放到该element的class中。

Plug-ins 如果有需要的话, 可以半自动的加载。GStreamer并没有严格规定输入端和输出端的数目,事实上它们都可以是一个或者多个。所有的组件都从NULL状态开始,依次经历NULL、READY、PAUSED、PLAYING等状态间的转换。正处于播放状态的管道能够随时切换到PAUSED状态。

0.9版以后的插件可被区分成三种类 (来自电影黄金三镖客"The Good, the Bad and the Ugly"的名字)

插件集合的名称描述
Good此一类的GStreamer插件来自于“优秀”组,具有高品质的LGPL认证,或依照GStreamer的 "contains a set of well-supported plug-ins under our preferred license"认证。
BadGStreamer所谓的“不良”插件是指未经 up-to-par 的处理。这类插件已经很接近高品质,但还缺乏一些认证事谊:代码审核、需要文件说明、大量测试、真正的维修人员,或大量的使用群。
UglyGStreamer所谓的“丑恶”插件可能是品质良好,但是出现布署(distribution)上的问题。

特点

GStreamer是一个创建流媒体应用程序的框架。其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了DirectShow的设计思想。

GStreamer的程序开发框架使得编写任意类型的流媒体应用程序成为了可能。在编写处理音频、视频或者两者皆有的应用程序时, GStreamer可以让你的工作变得简单。GStreamer并不受限于音频和视频处理, 它能够处理任意类型的数据流。管道设计的方法对于实际应用的滤波器几乎没有负荷, 它甚至可以用来设计出对延时有很高要求的高端音频应用程序。

GStreamer最显著的用途是在构建一个播放器上。GStreamer已经支持很多格式的文件了, 包括: MP3、Ogg/Vorbis、MPEG-1/2、AVI、Quicktime、 mod等等。从这个角度看,GStreamer更象是一个播放器。但是它主要的优点却是在于: 它的可插入组件能够很方便的接入到任意的管道当中。这个优点使得利用GStreamer编写一个万能的可编辑音视频应用程序成为可能。

GStreamer框架是基于插件的, 有些插件中提供了各种各样的多媒体数字信号编解码器,也有些提供了其他的功能。所有的插件都能够被链接到任意的已经定义了的数据流管道中。GStreamer的管道能够被GUI编辑器编辑, 能够以XML文件来保存。这样的设计使得管道程序库的消耗变得非常少。

GStreamer核心库函数是一个处理插件、数据流和媒体操作的框架。 GStreamer核心库还提供了一个API, 这个API是开放给程序员使用的—当程序员需要使用其他的插件来编写他所需要的应用程序的时候可以使用它。