一、什么是GStreamer?
GStreamer 是一个用于创建流媒体应用程序的框架。基本设计来自俄勒冈研究生院的视频管道,以及DirectShow的一些想法。
GStreamer的开发框架可以编写任何类型的流媒体多媒体应用程序。GStreamer 框架旨在使编写处理音频或视频或两者的应用程序变得容易。它不仅限于音频和视频,并且可以处理任何类型的数据流。管道设计使得比所施加的过滤器引起的开销要小。这使得GStreamer成为设计对延迟有很高要求的高端音频应用程序的良好框架。
GStreamer最明显的用途之一是使用它来构建媒体播放器。GStreamer已经包含用于构建媒体播放器的组件,该组件可以支持非常广泛的格式,包括MP3,Ogg / Vorbis,MPEG-1 / 2,AVI,Quicktime,mod等。然而,GStreamer不仅仅是另一个媒体播放器。它的主要优点是可插拔组件可以混合并匹配到任意管道中,以便可以编写成熟的视频或音频编辑应用程序。
该框架基于将提供各种编解码器和其他功能的插件。插件可以在管道中链接和排列。此管道定义数据流。还可以使用 GUI 编辑器编辑管道并将其另存为 XML,以便可以毫不费力地创建管道库。
GStreamer的核心功能是为插件,数据流和媒体类型处理/协商提供框架。它还提供了一个API,用于使用各种插件编写应用程序。
具体来说,GStreamer提供:
- 用于多媒体应用程序的 API
- 插件架构
- 管道体系结构
- 媒体类型处理/协商的机制
- 同步机制
- 超过 250 个插件,提供 1000 多种元素
- 一套工具
GStreamer插件可以分为:
- 协议处理
- 来源:用于音频和视频(涉及协议插件)
- 格式: 解析器, 格式化程序, 复用器, 解耦合器, 元数据, 字幕
- 编解码器:编码器和解码器
- 滤镜:转换器、混音器、效果器等
- 接收器:用于音频和视频(涉及协议插件)
GStreamer 被打包成:
- gstreamer:核心封装
- gst-plugins-base:一组必不可少的示例性元素
- gst-plugins-good:LGPL下的一组高质量的插件
- gst-plugins-ugly:一组高质量的插件,可能会带来分发问题
- gst-plugins-bad:一组需要更高质量的插件
- gst-libav:一组插件,用于包装 libav 以进行解码和编码
- 其他一些软件包
二、GStreamerd的设计原则
1、干净而强大
GStreamer 为以下各项提供了一个干净的接口:
- 想要构建媒体管道的应用程序。程序员可以使用一组广泛的强大工具来创建媒体管道,而无需编写任何代码。执行复杂的媒体操作变得非常容易。
- 插件化设计。插件化设计使得程序员可以获得一个干净简单的API来创建自包含的插件。集成了广泛的调试和跟踪机制。GStreamer还附带了一组广泛的现实生活中的插件,这些插件也可以作为示例。
2、面向对象
GStreamer 遵循 对象模型。熟悉或将熟悉GStreamer的程序员,GObjectGLib 2.0GLib 。2.0GTK+
GStreamer 使用信号和对象属性的机制。
可以在运行时查询所有对象的各种属性和功能。
GStreamer打算在编程方法上与 相似。这适用于对象模型、对象所有权、引用计数等。GTK+
3、可扩展
所有 GStreamer 对象都可以使用继承方法进行扩展。GObject所有插件都是动态加载的,可以独立扩展和升级。
4、只允许二进制插件
插件是在运行时加载的共享库。由于插件的所有属性都可以使用这些属性进行设置,因此不需要(实际上也没有办法)为插件安装任何头文件。GObject特别注意使插件完全独立。插件的所有相关方面都可以在运行时查询。
5、高性能
通过以下方式获得高性能:
- 使用 GLib 的分配器GSlice
- 插件之间的链接非常轻。数据可以以最小的开销在管道中传输。插件之间的数据传递仅涉及典型管道中的指针取消引用。
- 提供一种直接在目标内存上工作的机制。例如,插件可以直接写入X服务器的共享内存空间。缓冲区也可以指向任意内存,例如声卡的内部硬件缓冲区。
- 引用计数和写入时复制最小化memcpy的使用。子缓冲区可有效地将缓冲区拆分为可管理的片段。
- 专用的流线程,调度由内核处理。
- 允许使用专用插件进行硬件加速。
- 使用具有插件规范的插件注册表,以便插件加载可以延迟,直到实际使用插件。
6、干净的内核/插件分离
GStreamer的核心本质上是与媒体无关的。它只知道字节和块,只包含基本元素。GStreamer的核心甚至足以实现低级系统工具,如cp。
所有媒体处理功能均由内核外部的插件提供。这些告诉核心如何处理特定类型的媒体。
7、为编解码器试验提供框架
GStreamer还希望成为一个简单的框架,编解码器开发人员可以在其中试验不同的算法,从而加快开放和免费多媒体编解码器的开发,例如 Xiph.Org 基金会开发的编解码器(如Theora和Vorbis)。
三、GStreamer的基本构成对象
1、元素
元素是 GStreamer 中最重要的一类对象。通常,您将创建一个链接在一起的元素链,并让数据流经此元素链。元素有一个特定的功能,可以是从文件中读取数据,解码此数据或将此数据输出到声卡(或其他任何内容)。通过将多个此类元素链接在一起,可以创建可以执行特定任务(例如媒体播放或捕获)的管道。默认情况下,GStreamer附带了大量元素,因此可以开发各种媒体应用程序。如果需要,还可以编写新元素。该主题在GStreamer插件编写者指南中有更详细的解释。
2、垫
焊盘是元素的输入和输出,您可以在其中连接其他元素。它们用于协商 GStreamer 中元素之间的链接和数据流。pad可以看作是元素上的“插头”或“端口”,其中可以与其他元素建立链接,并且数据可以通过它流入或流出这些元素。焊盘具有特定的数据处理功能:焊盘可以限制流经它的数据类型。仅当两个焊盘允许的数据类型(功能)兼容时,才允许在两个焊盘之间链接。数据类型是使用称为上限协商的过程在焊盘之间协商的。数据类型由 描述。GstCaps在这里打个比方可能会有所帮助。焊盘类似于物理设备上的插头或插孔。例如,考虑一个由音频放大器、DVD 播放器和(静音)视频投影仪组成的家庭影院系统。允许将 DVD 播放器链接到放大器,因为两个设备都有音频插孔,并且允许将投影仪链接到 DVD 播放器,因为这两个设备都有兼容的视频插孔。投影仪和放大器之间的链接可能无法建立,因为投影仪和放大器具有不同类型的插孔。GStreamer中的焊盘与家庭影院系统中的插孔具有相同的用途。
在大多数情况下,GStreamer 中的所有数据都通过元素之间的链接单向流动。数据通过一个或多个源焊盘从一个元素流出,元素通过一个或多个接收器焊盘接受传入数据。源和汇元件分别只有拉电流垫和汇焊盘。数据通常表示缓冲区(由 GstBuffer 对象描述)和事件(由 GstEvent 对象描述)。
3、箱子和管道
条柱是元素集合的容器。由于 bin 是元素本身的子类,因此您主要可以像控制元素一样控制 bin,从而为应用程序抽象出很多复杂性。例如,您可以通过更改条柱本身的状态来更改该条柱中所有元素的状态。数据桶还转发来自其包含的子级的总线消息(例如错误消息、标记消息或消息)。EOS
管道是顶级条柱。它为应用程序提供总线并管理其子级的同步。将其设置为 或状态时,将启动数据流并进行媒体处理。启动后,管道将在单独的线程中运行,直到您停止它们或到达数据流的末尾。PAUSEDPLAYING
4、通信
GStreamer 提供了几种用于应用程序和管道之间的通信和数据交换的机制。
缓冲区是用于在管道中的元素之间传递流数据的对象。缓冲区始终从源传输到接收器(下游)。
事件是在元素之间发送或从应用程序发送到元素的对象。事件可以向上游和下游传播。下游事件可以与数据流同步。
消息是由管道的消息总线上的元素发布的对象,它们将保存在其中以供应用程序收集。可以从发布消息的元素的流式处理线程上下文中同步截获消息,但通常由应用程序从应用程序的主线程异步处理。消息用于以线程安全的方式将错误、标记、状态更改、缓冲状态、重定向等信息从元素传输到应用程序。
查询允许应用程序从管道请求持续时间或当前播放位置等信息。查询始终以同步方式回答。元素还可以使用查询从其对等元素请求信息(如文件大小或持续时间)。它们可以在管道中以两种方式使用,但上游查询更常见。