gstreamer官方网址
https://gstreamer.freedesktop.org
1.Gstreamer是什么
GStreamer是一个创建流媒体应用程序的框架。其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了DirectShow的设计思想。
GStreamer的程序开发框架使得编写任意类型的流媒体应用程序成为了可能。在编写处理音频、视频或者两者皆有的应用程序时, GStreamer可以让你的工作变得简单。GStreamer并不受限于音频和视频处理, 它能够处理任意类型的数据流。管道设计的方法对于实际应用的滤波器几乎没有负荷, 它甚至可以用来设计出对延时有很高要求的高端音频应用程序。
GStreamer框架是基于插件的, 有些插件中提供了各种各样的多媒体数字信号编解码器,也有些提供了其他的功能。所有的插件都能够被链接到任意的已经定义了的数据流管道中。GStreamer的管道能够被GUI编辑器编辑, 能够以XML文件来保存。这样的设计使得管道程序库的消耗变得非常少。
2. GStreamer 框架
其框架图如下图所示
3. Gstreamer 基本概念
元件(element)
元件(element)是GStreamer中最重要的概念。你可以通过创建一系列的元件(Elements),并把它们连接起来,从而让数据流在这个被连接的各个元件(Elements)之间传输。每个元件(Elements)都有一个特殊的函数接口,对于有些元件(Elements)的函数接口它们是用于能够读取文件的数据,解码文件数据的。而有些元件(Elements)的函数接口只是输出相应的数据到具体的设备上(例如,声卡设备)。你可以将若干个元件(Elements)连接在一起,从而创建一个管道(pipeline)来完成一个特殊的任务,例如,媒体播放或者录音。GStreamer已经默认安装了很多有用的元件(Elements),通过使用这些元件(Elements)你能够构建一个具有多种功能的应用程序。当然,如果你需要的话,你可以自己编写一个新的元件(Elements)。对于如何编写元件(Elements)的话题在GStreamer Plugin Writer's Guide中有详细的说明
Elements 根据功能可以分为以下三种:
源元件(Source elements)为管道产生数据,比如从磁盘或者声卡读取数据,源元件不接收数据,仅产生数据。仅有一个源衬垫,形象化的源元件如下图所示
过滤元件(Filter elements)包括过滤器(filters)、转换器(convertors)、分流器(demuxers)、整流器(muxers)以及编解码器(codecs)等等,同时拥有输入和输出衬垫,形象化过滤元件如下图所示
接收元件是媒体管道的末端,它接收数据但不产生任何数据。仅有一个接收衬垫,形象化接收元件如下图所示
元件状态包括以下几种:
GST_STATE_NULL: 默认状态
GST_STATE_READY: 准备状态
GST_STATE_PAUSED:暂停状态
GST_STATE_PLAYING:运行状态
衬垫(Pads)
衬垫(Pads)是元件对外的接口。数据流从一个元件的源衬垫(source pad)到另一个元件的接收衬垫(sink pad)。衬垫的功能(capabilities)决定了一个元件所能处理的媒体类型。各个元件(element)通过这个接口进行连接,这样数据流就可以在这些元件中进行传输。
Pads 的分类:
永久型(always)
随机型(sometimes)
请求型 (on request)
大部分情况下,所有在GStreame r 中流经的数据都遵循一个原则。数据从element 的一个或多个源衬垫
流出,从一个或多个sink 衬垫流入。源和sink 元件分别只有源和sink 衬垫。
箱柜(bin) 和管道(Pipeline)
箱柜(Bins)是一个可以装载元件(element)的容器。管道(pipelines)是箱柜(Bins)的一个特殊的子类型,管道(pipelines)可以操作包含在它自身内部的所有元件(element)。因为箱柜(Bins)本身又是组件(element)的子集,所以你能够象操作普通组件(element)一样的操作一个箱柜(Bins),通过这种方法可以降低你的应用程序的复杂度。你可以改变一个箱柜(Bins)的状态来改变箱柜(Bins)内部所有组件(element)的状态。箱柜(Bins)可以发送总线消息(bus messages)给它的子集组件(element)(这些消息包括:错误消息(error messages),卷标消息(tag messages),EOS消息(EOS messages))。
形象化箱柜如下图所示
功能(Cap)
Caps描述了能够通过衬垫或当前通过衬垫的数据流格式。一个衬垫能够有多个功能。功能(Caps)可以用一个包含一个或多个 GstStructures 的数组来表示。每个GstStructures由一个名字字符串(比如说 "width")和相应的值(类型可能为G_TYPE_INT或GST_TYPE_INT_RANGE)构成。
缓冲区(Buffer)
缓冲区包含了你创建的管道里的数据流。通常一个源组件会创建一个新的缓冲区,同时组件还将会把缓冲区的数据传递给下一个组件。当使用GStreamer底层构造来创建一个媒体管道的时候,你不需要自己来处理缓冲区,组件将会为你处理这些缓冲区。
一个缓冲区主要由以下一个组成:
• 指向某块内存的指针
• 内存的大小
• 缓冲区的时间戳
• 一个引用计数,指出了缓冲区所使用的组件数。没有组件可引用的时候,这个引用将用于销毁缓冲区。
事件(Events)
事件是一系列控制粒子,随着缓冲区被发送到管道的上游和下游。下游事件通知流状态相同的组件,可能的事件包括中断,flush,流的终止信号等等。在应用程序与组件之间的交互以及事件与事件之间的交互中,上游事件被用于改变管道中数据流的状态,如查找。对于应用程序来说,上游事件非常重要,下游事件则是为了说明获取更加完善的数据概念上的图像。