本文主要是介绍GStreamer 介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1,什么是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进行解码和编码的插件
-
其他几个包
2,设计原则
2.1,干净有力
GStreamer提供了一个干净的界面:
-
想要构建媒体管道的应用程序程序员。程序员可以使用一组强大的工具来创建媒体管道,而无需编写任何代码。执行复杂的媒体操作变得非常容易。
-
插件程序员,为插件程序员提供了一个干净简单的应用编程接口来创建独立的插件。集成了广泛的调试和跟踪机制。GStreamer还附带了一组广泛的现实生活中的插件,也可以作为示例。
2.2,面向对象
GStreamer 遵循GObject
GLib 2.0
对象模型 熟悉GLib 2.0
或GTK+
将熟悉GStreamer。
GStreamer 使用信号和对象属性的机制。
可以在运行时查询所有对象的各种属性和功能。
GStreamer打算在编程方法论上类似于GTK+
。这适用于对象模型、对象所有权、引用计数等。
2.3,可扩展
所有 GStreamer 对象都可以使用 GObject
继承进行扩展方法。
所有插件都是动态加载的,可以独立扩展和升级。
2.4,允许仅二进制插件
插件是在运行时加载的共享库。由于所有的 插件的属性可以使用GObject
属性进行设置不需要(实际上也不可能)安装任何头文件 插件。
特别注意使插件完全独立。插件的所有相关方面都可以在运行时查询。
2.5,高性能
高性能是通过以下方式获得的:
-
使用GLib的
GSlice
分配器。 -
插件之间极其轻量级的链接。数据可以以最小的开销在管道中传输。插件之间的数据传递只涉及典型管道中的指针取消引用。
-
提供一种直接在目标内存上工作的机制。例如,插件可以直接写入X服务器的共享内存空间。缓冲区也可以指向任意内存,例如声卡的内部硬件缓冲区。
-
写入时重新计数和复制最大限度地减少 memcpy 的使用。子缓冲区有效地将缓冲区拆分为可管理的部分。
-
专用流线程,调度由内核处理。
-
通过使用专门的插件允许硬件加速。
-
使用带有插件规范的插件注册表,以便可以延迟插件加载,直到实际使用插件。
2.6,清理核心/插件分离
GStreamer的核心本质上与媒体无关。它只知道字节和块,只包含基本元素。GStreamer的核心甚至足以实现低级系统工具,如cp。
所有媒体处理功能都由核心外部的插件提供。这些告诉核心如何处理特定类型的媒体。
2.7,为编解码器实验提供框架
GStreamer还希望成为一个简单的框架,编解码器开发人员可以在其中 试验不同的算法,加快开发开放和免费的多媒体编解码器,如Xiph.Org基金会开发的编解码器(如Theora和Vorbis)。
3,基础概念
本章介绍了GStreamer的基本概念。理解这些概念对于阅读本指南的任何其余部分都很重要,所有这些概念都假设理解这些基本概念。
3.1,元素
元素是GStreamer中最重要的一类对象。您通常会创建一个链接在一起的元素链,并让数据流经这个元素链。一个元素有一个特定的功能,它可以是从文件中读取数据,解码这些数据或将这些数据输出到您的声卡(或其他任何东西)。通过将几个这样的元素链接在一起,您可以创建一个可以执行特定任务的管道,例如媒体播放或捕获。GStreamer默认附带大量元素集合,使得开发各种各样的媒体应用程序成为可能。如果需要,您还可以编写新元素。GStreamer插件作家指南中更详细地解释了这个主题。
3.2,Pads
Pads是元素的输入和输出,您可以在其中连接其他元素。它们用于协商之间的链接和数据流 GStreamer中的元素。Pad 可以看作是一个“插头”或“端口” 元素,其中可以与其他元素建立链接,并且通过它数据可以流入或流出这些元素。Pads 有特定的数据处理能力:pad可以限制流动的数据类型通过它。链接只允许在允许的情况下在两个pads之间两个数据类型(功能)是兼容的。数据类型是使用称为大写协商的过程在Pads之间协商。数据类型由 GstCaps 描述
。
这里打个比方可能会有所帮助。pad类似于物理设备上的插头或插孔。例如,考虑一个由音频放大器、DVD播放器和(无声)视频投影仪组成的家庭影院系统。允许将DVD播放器连接到放大器,因为两个设备都有音频插孔,允许将投影仪连接到DVD播放器,因为两个设备都有兼容的视频插孔。投影仪和放大器之间的链接可能不会建立,因为投影仪和放大器有不同类型的插孔。GStreamer中的pad与家庭影院系统中的插孔具有相同的用途。
在大多数情况下,GStreamer中的所有数据都通过一个链接单向流动元素之间。数据通过一个或多个从一个元素流出源Pads和元素通过一个或多个接收器pads。源和接收器元件只有源和接收器pad分别。数据通常意味着缓冲区(由 GstBuffer 对象)和事件(由 GstEvent 对象)。
3.3,Bin 和 管道
Bin是元素集合的容器,由于bin本身就是元素的子类,因此你可以像控制元素一样控制bin,从而为你的应用程序抽象出许多复杂性。例如,您可以更改bin中所有元素的状态 通过更改该bin本身的状态。Bins还转发总线消息来自它们包含的子级(例如错误消息、标签消息或 EOS
消息)。
一个管道是一个顶级bin。它为应用程序提供一个总线 ,并管理其子元素的同步。当您将其设置为 PAUSED
或PLAYING
状态,数据流将启动,媒体处理将进行。一旦启动,管道将在单独的线程中运行,直到您停止它们或到达数据流的末尾。
3.4,通讯
GStreamer为应用程序和管道之间的通信和数据交换提供了多种机制。
-
Buffers 是用于在管道中的元素之间传递流数据的对象。缓冲区总是从源传输到接收器(下游)。
-
Events 是在元素之间或从应用程序发送到元素的对象。事件可以上游和下游传输。下游事件可以与数据流同步。
-
messages 是由管道消息总线上的元素发布的对象,它们将被保存在那里以供应用程序收集。消息可以从发布消息的元素的流线程上下文中同步拦截,但通常由应用程序从应用程序的主线程异步处理。消息用于以线程安全的方式将错误、标签、状态更改、缓冲状态、重定向等信息从元素传输到应用程序。
-
queries 查询允许应用程序从管道请求信息,如持续时间或当前播放位置。查询总是同步回答。元素也可以使用查询从其对等元素请求信息(如文件大小或持续时间)。它们可以在管道中两种方式使用,但上游查询更常见。
这篇关于GStreamer 介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!