gstreamer教程(3)——基本概念
基础:
本指南的本章介绍了 GStreamer 的基本概念。理解这些概念对于阅读本指南的其余部分都很重要,所有这些概念都假定理解这些基本概念。
Element(元素):
元素是 GStreamer 中最重要的对象类。您通常会创建一个链接在一起的元素链,并让数据流经此元素链。元素有一个特定的功能,它可以是从文件中读取数据、解码此数据或将此数据输出到声卡(或其他任何内容)。通过将多个此类元素链接在一起,您可以创建一个可以执行特定任务的pipeline(管道),例如媒体回放或捕获。默认情况下,GStreamer 附带了大量元素,从而可以开发各种各样媒体应用程序。如果需要,您还可以编写新元素。该主题在 GStreamer Plugin Writer's Guide 中有更详细的解释。
Pad(垫)(更可以理解为插头插座):
Pad是element(元素)的输入和输出,您可以用Pad连接其他元素。它们用于协商 GStreamer 中元素之间的链接和数据流。Pad可以看作是元素与元素之间建立连接的的“插头”或“端口”。数据可以通过Pad流入或流出这些元素。Pad具有特定的数据处理功能:Pad可以限制流经它的数据类型。只有当两个 Pad允许的数据类型 (功能) 兼容时,才允许在两个 Pad之间进行连接。Pad之间用一个叫caps negotiation的方法进行数据类型的协商。数据类型用 GstCaps
类型描述。
一个类比在这里可能会有所帮助。Pad类似于物理设备上的插头或插孔。例如,考虑一个由音频放大器、DVD 播放器和(无声)视频投影仪组成的家庭影院系统。允许将 DVD 播放器连接到放大器,因为两个设备都有音频插孔,允许将投影仪链接到 DVD 播放器,因为两个设备都有兼容的视频插孔。投影机和放大器之间可能无法建立连接,因为投影机和放大器具有不同类型的插孔。GStreamer 中的Pad与家庭影院系统中的插孔具有相同的用途。
在大多数情况下,GStreamer 中的所有数据都单向流经元素之间的链接。数据从一个元素的一个或多个source Pad中流出,其他元素通过一个或多个 sink Pad接受数据。Source元素和 Sink元素分别只有 source Pad和 sink Pad。数据通常就是Buffers(缓冲区)(在 GstBuffer
对象有描述)和事件(在 GstEvent
对象有描述)。
Bin and pipeline(容器和管道):
Bin是存放一些元素集合的容器。由于 bin 本身是元素的子类,因此您大多时候都可以像控制元素一样控制 Bin,从而为您的应用程序抽象出许多复杂性。例如,你可以通过更改 Bin自身的状态来更改 Bin中所有元素的状态。Bin还转发来自他包含的元素的总线消息(例如错误消息、标签消息或 EOS
消息)。
Pipeline是顶级的Bin。它为应用程序提供总线并管理其子集之间的同步。当您将其设置为 PAUSED
或 PLAYING
状态时,数据流将启动并进行媒体处理。一旦启动,Pipeline将在单独的线程中运行,直到您停止它们或到达数据流的末尾。
Communication (通信):
GStreamer 为应用程序和Pipeline之间的通信和数据交换提供了多种机制。
- buffer(缓冲区)是用于在Pipeline中的元素之间传递流数据的对象。缓冲区始终从 source 传输到 sink (从上游流向下游)。
- event (事件)是在元素之间或从应用程序发送到元素的对象。事件向上游和下游都可以传播。向下游传播事件可以同步到数据流。
- message(消息)是由Pipeline消息总线上的元素发布的对象,它们将被保存以供应用程序收集。可以从发布消息的元素的流线程上下文中同步截获消息,但通常由应用程序从应用程序的主线程异步处理。消息用于以线程安全的方式将错误、标签、状态更改、缓冲状态、重定向等信息从元素传输到应用程序。
- query (查询)允许应用程序从Pipeline查询当前的持续时间或当前播放位置等信息。查询始终是同步响应的。元素还可以使用query从其对等元素请求信息 (例如文件大小或持续时间) 。它们可以在Pipeline中双向使用,但上游的query更为常见。