Gstreamer插件教程1.2—介绍(Introduction):基础(Foundations)
英文原文: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
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.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. |
- java基础教程:介绍和环境(1)
- GStreamer基础教程03——动态pipeline
- cocos基础教程(5)数据结构介绍之cocos2d::Vector
- unity3d插件Daikon Forge GUI 中文教程-3-基础控件Button和Sprite的使用
- node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)
- ATOM基础教程一使用前端插件emmet(16)
- 使用SteamVR Plugins插件为基础,来介绍Vive开发的入门,重点讲解设备的激活和控制接口
- HttpClient 教程1 (基础介绍)
- Unity界面插件NGUI基础教程
- 汇编基础教程(一)——寄存器介绍
- Axure RP Pro - 翻译 - 5.5 Tutorial教程 - AXURE 101 Article 3: Introduction介绍 - Basic Interactions基本交互
- 【GStreamer开发】GStreamer基础教程11——调试工具
- PHP循环函数使用介绍之PHP基础入门教程
- GStreamer基础教程07——多线程和Pad的有效性
- PHP循环函数使用介绍之PHP基础入门教程
- HttpClient 教程1 (基础介绍)
- PS场景原画设计教程之重要基础点介绍及实战演示
- ATOM基础教程一ATOM插件推荐(4)
- Hadoop基础教程-第5章 YARN:资源调度平台(5.1 YARN介绍)(草稿)
- Unity界面插件NGUI基础教程