概述
GStreamer是一个基于流媒体的框架,是一个开放源代码的多媒体框架,用于创建音频和视频处理应用程序。它是一个运行在多个操作系统上的跨平台框架,支持多种不同的多媒体格式。
GStreamer框架的核心是基于插件的体系结构,插件可以用于解码、编码、过滤、音频和视频处理等各种任务,同时也包括了一些基础插件,如基本的HTTP和TCP网络协议支持以及文件系统读写等。
GStreamer框架是基于管道的,可以通过组合不同的插件来创建管道,这使得用户可以自由灵活地定义音视频处理流程。框架内还提供了许多工具箱,帮助开发人员更好地调试和测试应用程序。
除了基础设施和插件,GStreamer还提供了用于管理多种媒体流、处理时间戳和控制数据流的元素。它还可以使用多线程并发处理,因此可以同时处理多个音频或视频流,从而提高效率。
总的来说,GStreamer是一个非常强大和灵活的框架,让开发者可以轻松构建各种音频和视频应用程序,并且也可以用来构建媒体服务器、语音识别等媒体相关的应用程序。
概念
GStreamer是基于插件的框架,其中包括多个组成部分,如下所述:
Element (元件):是GStreamer中最基本的组成单元,是一种数据处理或分析器件。Element可以完成多种功能,例如从文件中读取数据、编码音视频数据、将音视频数据传输到网络等。(相关概念有源元件,目标元件,创建和使用元件,中间元件,链接和使用元件,元件状态)
Bin (箱柜):由多个Element组成的有向无环图(DAG)形式的管道。多个Element可以通过Bin合并为一个更大的单元,这个单元可以像其他的Element一样进行连接和使用。
Pad (连接口):是Element之间通过管道进行连接的接口。Pad分为输入和输出两种类型,它们定义了两个Element之间的数据流。
Caps (能力):指Element接收和生产的数据类型,例如音频或视频格式。在连接两个Element时需要匹配它们的Caps,以确保数据流的正确性。
Pipe (管道):是由不同类型的Element和Bin组成的完整的数据处理过程。Pipe通常包含了一个源(Souce)、一个或多个Filter、一个Muxer或Demuxer和一个汇(Sink)。
Tee (分流器):是一种特殊的Element,可以将一个输入数据流复制成多个输出流,分别传递给不同的子Pipe进行处理。
Muxer(混合器):是一种特殊的Element,可以将多个数据流混合成单一的数据流输出。
Demuxer(解混器):是一种特殊的Element,可以将单一的数据流拆分成多个流输出。
Filter(过滤器):是一种特殊的Element,可以对输入数据流进行过滤或转换,例如去除噪声、调整音量等。
Source(数据源):是一种特殊的Element,可以读取本地文件或网络上的数据,并作为管道的输入流。
Sink(数据汇):是一种特殊的Element,可以将处理好的数据输出到本地文件或网络上。
以上这些组件构成了GStreamer的基本框架,用户可以通过它们进行任意组合,创建完整的音视频处理应用程序。
重点概念解释
Elements
元件(element)是GStreamer中最重要的概念。
你可以通过创建一系列的元件(Elements),并把它们连接起来,从而让数据流在这个被连接的各个元件(Elements)之间传输。
每个元件(Elements)都有一个特殊的函数接口,对于有些元件(Elements)的函数接口它们是用于能够读取文件的数据,解码文件数据的。
而有些元件(Elements)的函数接口只是输出相应的数据到具体的设备上(例如,声卡设备)。
你可以将若干个元件(Elements)连接在一起,从而创建一个管道(pipeline)来完成一个特殊的任务,
例如,媒体播放或者录音。GStreamer已经默认安装了很多有用的元件(Elements),也可以自己编写一个新的元件(Elements)。
Bins &pipelines
箱柜(Bins)是一个可以装载元件(element)的容器。
管道(pipelines)是箱柜(Bins)的一个特殊的子类型,管道(pipelines)可以操作包含在它自身内部的所有元件(element)。
因为箱柜(Bins)本身又是元件(element)的子集,所以你能够象操作普通元件(element)一样的操作一个箱柜(Bins),
通过这种方法可以降低你的应用程序的复杂度。你可以改变一个箱柜(Bins)的状态来改变箱柜(Bins)内部所有元件(element)的状态。
箱柜(Bins)可以发送总线消息(bus messages)给它的 子集元件(element)(这些消息包括:错误消息(error messages),
标签消息(tag messages),EOS消息(EOS messages))。
管道(pipeline)是高级的箱柜(Bins)。当你设定管道的暂停或者播放状态的时候,数据流将开始流动,
并且媒体数据处理也开始处理。一旦开始,管道将在一个 单独的线程中运行,直到被停止或者数据流播放完毕。
Pads
衬垫(Pads)在GStreamer中被用于多个元件的链接,从而让数据流能在这样的链接中流动。
一个衬垫(Pads)可以被看作是一个元件(element)插座或者端口,元件(element)之间的链接就是依靠着衬垫(Pads)。
衬垫(Pads)有处理特殊数据的能力:一个衬垫(Pads)能够限制数据流类型的通过。链接成功的条件是:
只有在两个衬垫(Pads)允许通过的数据类型一致的时候才被建立。
数据类型的设定使用了一个叫做caps negotiation的方法。数据类型被为一个GstCaps变量所描述。
下面的这个比喻可能对你理解衬垫(Pads)有所帮助。一个衬垫(Pads)很象一个物理设备上的插头。
例如一个家庭影院系统。一个家庭影院系统由一个功放(amplifier),一个DVD机,还有一个无声的视频投影组成。
我们需要连接DVD机到功放(amplifier),因为两个设备都有音频插口;
我们还需要连接投影机到DVD机上,因为 两个设备都有视频处理插口。
但我们很难将投影机与功放(amplifier)连接起来,因为他们之间处理的是不同的 插口。
GStreamer衬垫(Pads)的作用跟家庭影院系统中的插口是一样的。
对于大部分情况,所有的数据流都是在链接好的元素之间流动。
数据向元件(element)以外流出可以通过一个或者多个 source 衬垫(Pads),
元件(element)接受数据是通过一个或者多个sink 衬垫(Pads)来完成的。
Source元件(element)和sink元件(element)分别有且仅有一个 sink 衬垫(Pads)或者source 衬垫(Pads)。
数据在这里代表的是缓冲区(buffers) (GstBuffer对象描述了数据的缓冲区(buffers)的信息)和事件(events)
(GstEvent对象描述了数据的事件(events)信息)。
工具
- gst-lunch
测试管道 - gst-inspect
探测element信息
待补充