本章介绍GStreamer的基本概念。理解这些概念对于阅读本指南的其他任何内容都是很重要的,它们都假定理解了这些基本概念。
元素
元素是GStreamer中最重要的一类对象。你通常会创建一个链接在一起的元素链,并让数据在这个元素链中流动。元素有一个特定的功能,可以是从文件中读取数据、解码数据或将数据输出到声卡(或其他东西)。通过将几个这样的元素链接在一起,您可以创建一个可以执行特定任务的管道,例如媒体播放或捕获。GStreamer默认提供了大量元素集合,使得开发各种媒体应用程序成为可能。如果需要,还可以编写新元素。这个主题在GStreamer插件编写指南中有大量解释。
Pads
pad是元素的输入和输出,可以连接其他元素。它们用于在GStreamer中协商元素之间的链接和数据流。pad可以被视为元素上的“plug”或“port”,可以与其他元素建立链接,数据可以通过它流向或从这些元素流出。Pads具有特定的数据处理能力:Pads可以限制流经它的数据类型。只有当两个Pads允许的数据类型兼容时,两个板之间才允许有链路。在pad之间通过caps协商过程协商数据类型。数据类型用GstCaps描述。
在这里打个比方可能会有帮助。pad类似于物理设备上的插头或插孔。例如,考虑一个由放大器、DVD播放机和(无声的)视频放映机组成的家庭影院系统。允许将DVD播放机连接到放大器,因为两种设备都有音频插孔,允许将投影机连接到DVD播放机,因为两种设备都有兼容的视频插孔。投影仪和放大器之间的连接可能不会进行,因为投影仪和放大器有不同类型的插孔。GStreamer中的Pads与家庭影院系统中的插孔具有相同的作用。
大多数情况下,GStreamer中的所有数据都是通过元素之间的链接单向流动的。数据通过一个或多个src pad从一个元素流出,元素通过一个或多个sink pad接受传入的数据。source和sink元素分别只有src pad和sink pad。数据通常指buffers(由GstBuffer对象描述)和事件(由GstEvent对象描述)。
Bins和pipelines
bin是存放一组元素的容器。由于箱子是元素本身的子类,你可以像控制元素一样控制bin,从而为你的应用程序抽象出很多复杂性。例如,你可以通过改变bin本身的状态来改变箱子中所有元素的状态。bin还转发来自其包含的子节点的总线消息(如错误消息、标记消息或EOS消息)。
管道是顶层的bin。它为应用程序提供了一个总线,并为其子程序管理同步。当你将其设置为暂停或播放状态时,数据流将开始并进行媒体处理。一旦启动,管道将在单独的线程中运行,直到您停止它们或到达数据流的终点。
Communication
GStreamer为应用程序和管道之间的通信和数据交换提供了几种机制。
-
buffer是用于在管道中的元素之间传递流数据的对象。buffer总是从source到sink(downstrean)。
-
event是在元素之间或应用程序给元素之间发送的对象。事件可以upstream和downstream之间传播。downstream事件可以与数据流同步。
-
messages消息是由管道消息总线上的元素发布消息的对象,它们将被应用程序保存在那里进行收集。消息可以从发送消息的元素的流线程上下文同步地截获,但通常由应用程序从应用程序的主线程异步处理。消息用于以线程安全的方式将错误、标签、状态更改、缓冲状态、重定向( errors, tags, state changes, buffering state, redirects)等信息从元素传输到应用程序。
-
查询允许应用程序从管道请求诸如持续时间或当前播放位置等信息。查询总是同步回答。元素还可以使用查询从同级元素请求信息(例如文件大小或持续时间)。它们可以在管道中以两种方式使用,但上游查询更常见。
注意看箭头方向和颜色,表示不同元素、bus、应用程序之间的交流方式