您的位置:首页 > 其它

Gstreamer插件教程1.2—介绍(Introduction):基础(Foundations)

2017-02-09 15:00 543 查看

英文原文: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将会被自动销毁,且其内存在某种意义上,将会被释放。(阅读下文以了解更多)
对于一个数据传输,有两种类型的GstMiniObject会被定义:events(事件控制)和buffers(数据内容)。 Buffers可能包含任意类型的且两个连接pad可以识别并处理的数据。通常,一个buffer包含大量的从一个Element到另一个Element的音频或视频数据。 Buffers也包含描述buffer内容的元数据。下面是一些重要的元数据类型:
  • 指向一个或多个GstMemory对象的指针。GstMemory对象是封装一块内存区域的引用计数对象
  • 标记buffer内容优先显示的时间戳
Events包含了数据在连接的两个pads之间流动时产生的信息。只有当Element明确的支持某个Events时,它才能够被发送,不然Gstreamer的核心将会自动去处理它。Events用来指示一个媒体类型、媒体流的结尾及缓冲需要被刷新等。 Events可能包含以下几个方面:
  • 子类型:表示所包含event的类型
  • event的其它内容依赖于特殊的event类型
Events将之后的教程中被详细的讨论(教程Events: Seeking, Navigation and More),在那之前,Events只用到了EOS Events,此Events用于表示流的结束。 阅读Gstreamer Library Reference,可了解GstMiniObject, GstBuffer及GstEvent的实现细节。

Buffer Allocation

Buffers能够存储多块不同类型的内存。最常见的buffer类型,其内存是由malloc()所分配的。这种buffer虽然比较方便,但由于数据需要被拷贝至buffer中,所以速度不是非常的快。 很多专门的Element创建的buffer是指向一个特定内存的指针。例如,filesrc Element是通过将文件映射到应用程序的地址空间(用mmap()函数),然后创建指向此地址范围的buffer。这些通过filesrc element创建的buffer相比于其它类型的buffer,除了它们是只读的以外,并没有什么不同。buffer的释放代码将会自行选择正确的方式去释放底层的内存。收到这些buffer的下游的Element不需要做任何特殊的处理或对其取消引用。 通过另外一种方式,一个Element可以获得特定的buffer,那就是通过GstBufferPool或GstAllocator从下游的Element中获得。如果下游的Element能够提供这些对象,那么上游的Element就可以用它们来分配buffer。更多请参考Memory allocation. 许多sink element拥有将数据拷贝至硬件的快速方法,或能够直接访问硬件。对于这些sink element,它们也可以为上游的element创建一个GstBufferPool或GstAllocator。例如ximagesink,它可以创建包含XImages的buffer,因此,当上游的element拷贝数据到buffer中时,它会直接拷贝到XImage,使得ximagesink能够直接将图像绘制到屏幕上,而无需先将上游的数据拷贝至XImage中。 filter element经常能够直接修改buffer,或者将源buffer拷贝至目标buffer中。由于Gstreamer框架能够选择最合适快速的算法,所以filter element也是最适合用于实现算法的element。自然地,这对严格的过滤器才有意义,所谓严格的过滤器是指这些element有相同的source pad和sink pad。

Media types and Properties

Gstreamer使用类型系统来确定流经element的数据是其能够识别的。通过pad连接element时,类型系统也是很重要的,它能够确保所要求的参数是能够匹配上的。每两个element之间的连接都有一个明确的类型,且有一系列的性质。更多请参考Caps negotiation.

The Basic Types

Gstreamer已经支持许多基本的媒体类型。下面是一些Gstreamer中用于buffer的基本类型表。此表包含了名称(媒体类型)和类型描述,此类型相关的性质,及每个性质所代表的意义。Gstreamer所支持的完整类型请参考List of Defined Types. Table of Example 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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: