英文原文:https://gstreamer.freedesktop.org/documentation/plugin-development/introduction/basics.html
这章将介绍Gstreamer的基本概念。理解这些本概念将帮助你处理扩展Gstreamer时所涉及到的问题。关于这些基本概念的更详细介绍可查看Gstreamer应用开发手册。此部分关于Gstreamer基本概念的介绍,主要是为了帮你回顾之前的内容。
Element and Plugins
Elements是Gstreamer的核心部分。在插件开发中,一个Element是一个继承自GstElement的对象。与其它Elements连接之后,Elements提供一系列的功能:如,一个source element提供数据给流,一个filter element处理流中的数据。没有Elements,Gstreamer仅仅是一个未连接任何东西的概念上的pipeline。Gstreamer已经包含了大量的Element,不过额外的Element也可以通过编写得到。
仅仅写一个新的Element并不足够,你应该将你的Element封装进一个插件中,使得Gstreamer能够使用它。一个插件本质上是一个可承载性的代码块,通常称为一个共享对象文件,或一个动态连接库。一个单体插件可能包含一个或多个Element。为了简单起见,此教程主要讲解包含一个Element的插件。
filter是Element的一个重要类型,它能够处理流的数据。流数据的生产者和消费者分别称为Source Element和Sink Element。Bin Element包含其它的Element。其中有一种bin类型是用于同步它所包含的Element的。另外还有一种bin类型,称为autoplugger Element,能够自动添加其它的Element到bin中,并将这些Element连接起来,所以它们能够像一个过滤器一样连接任意两种流类型。
Gstreamer中到处都用到了插件机制,甚至当Gstreamer中用到的基本包也是。一些非常基础的函数在Gstreamer的核心库中实现,其它大部分都是在插件中实现的。一个插件注册表是一个用来存储插件详细信息的二进制注册文件。使用Gstreamer的程序不必加载所有的插件后再决定哪个插件是所需要的。插件只有当它们所提供的Element被用到时,才会被加载。
查看Gstreamer Library Reference,可了解GstElement和GstPlugin的实现细节。
Pads
Pads主要用于适配Gstreamer中两个Element的连接,使得数据流可以通过。Pads可以看作是一个Element的插槽或端口,用于连接其它的Element,通过Pads,数据可以从一个Element流向另一个Element。Pads拥有特殊的数据处理能力:一个Pad可以限制经过它的数据流的类型。只有当对应的两个Pad所允许的数据类型可兼容时,两个Element才能够被连接。
在这里用一个比喻会比较的形象。一个pad就像是一个物理硬件的插件或插槽。例如,一个家庭影院包含一个扩音器、一个DVD播放器以及一个视频投影仪。DVD播放器是可以被连接到扩音器上的,因为这两个硬件都有可兼容的音频插槽。视频投影仪也是可以被连接到DVD播放器上的,因为这两个硬件都有可兼容的视频插槽。而将投影仪连接到扩音器上可能是不行的,因为它们所拥有的插槽是不同类型的。Gstreamer中的Pads就如同家庭影院里的插槽。
大多数情况下,Gstreamer中的数据经由两个Element的连接流动。数据从一个Element的一个或多个source pad流出,经过一个或多个sink pad流向另一个Element。而需要注意的是,Source Element和Sink Element各自只有一个source pad和sink pad。
查看Gstreamer Library Reference,可了解Gstpad当前的实现细节。
GstMiniObject, Buffers and Events
Gstreamer中的所有流数据经由一个Element的source pad流向另一个Element的sink pad时,都会被切成几块。GstMiniObject就是用于存储各个块的数据结构。
GstMiniObject包含下面的一些重要类型:
- 一个明确指定的关于数据的类型(even, buffer, ...)
- 一个引用计数,它意味着所有对miniobject有引用的Element数量。当引用计数为0时,对应的miniobject将会被自动销毁,且其内存在某种意义上,将会被释放。(阅读下文以了解更多)
- 指向一个或多个GstMemory对象的指针。GstMemory对象是封装一块内存区域的引用计数对象
- 标记buffer内容优先显示的时间戳
- 子类型:表示所包含event的类型
- event的其它内容依赖于特殊的event类型
Buffer Allocation
Media types and Properties
The Basic Types
Media Type | Description | Property | Property Type | Property Values | Property Description |
---|---|---|---|---|---|
audio/* | All audio types | rate | integer | greater than 0 | The sample rate of the data, in samples (per channel) per second. |
channels | integer | greater than 0 | The number of channels of audio data. | ||
audio/x-raw | Unstructured and uncompressed raw integer audio data. | format | string | S8 U8 S16LE S16BE U16LE U16BE S24_32LE S24_32BE U24_32LE U24_32BE S32LE S32BE U32LE U32BE S24LE S24BE U24LE U24BE S20LE S20BE U20LE U20BE S18LE S18BE U18LE U18BE F32LE F32BE F64LE F64BE | The format of the sample data. |
audio/mpeg | Audio data compressed using the MPEG audio encoding scheme. | mpegversion | integer | 1, 2 or 4 | The MPEG-version used for encoding the data. The value 1 refers to MPEG-1, -2 and -2.5 layer 1, 2 or 3. The values 2 and 4 refer to the MPEG-AAC audio encoding schemes. |
framed | boolean | 0 or 1 | A true value indicates that each buffer contains exactly one frame. A false value indicates that frames and buffers do not necessarily match up. | ||
layer | integer | 1, 2, or 3 | The compression scheme layer used to compress the data (only if mpegversion=1). | ||
bitrate | integer | greater than 0 | The bitrate, in bits per second. For VBR (variable bitrate) MPEG data, this is the average bitrate. | ||
audio/x-vorbis | Vorbis audio data | There are currently no specific properties defined for this type. |