Gstreamer插件教程1.2—介绍(Introduction):基础(Foundations)
来源:互联网 发布:mac百度搜索推荐 编辑:程序博客网 时间:2024/05/16 23:40
英文原文: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
- Gstreamer插件教程1.2—介绍(Introduction):基础(Foundations)
- Gstreamer插件教程1.1—介绍(Introduction):前言(Preface)
- Foundations of Machine Learning 内容整理 —— Introduction
- Gstreamer插件教程2.1—编写一个插件(Writing a Plugin):构建样板(Constructing the Boilerplate)
- Gstreamer插件教程2.2—编写一个插件(Writing a Plugin):详解pads(Specifying the pads)
- Gstreamer插件教程2.3—编写一个插件(Writing a Plugin):chain函数(The chain function)
- Gstreamer插件教程2.4—编写一个插件(Writing a Plugin):event函数(The event function)
- Gstreamer插件教程2.5—编写一个插件(Writing a Plugin):query函数(The query function)
- Gstreamer插件教程2.6—编写一个插件(Writing a Plugin):状态是什么?(What are states?)
- Gstreamer插件教程2.7—编写一个插件(Writing a Plugin):添加性质(Adding Properties)
- Gstreamer插件教程2.8—编写一个插件(Writing a Plugin):信号(Signals)
- gstreamer插件
- Gstreamer插件教程3.2—高级概念(Advanced Concepts):不同的调度模式(Different scheduling modes)
- gstreamer介绍
- gstreamer介绍
- GStreamer iOS教程1 —— GStreamer连接
- 【GStreamer开发】GStreamer播放教程02——字幕管理
- 【GStreamer开发】GStreamer播放教程04——既看式流
- Python基础III---函数式编程
- WC2017 酱油记
- @Transactional事务几点注意
- 我的前端生涯的开始
- jmeter+ant之批量运行接口用例
- Gstreamer插件教程1.2—介绍(Introduction):基础(Foundations)
- nginx用socket连接php-fpm
- golang语法学习(一):变量,常量以及数据类型
- 使用jquery提交FormData数据
- c++==与c的函数对比(4)
- [Android开发] RxJava2之路二 - 基本使用方法
- GDB程序调试从初级到高级(四)
- 线性模型(二)-- 线性回归公式推导
- Mac如何安装lein