Gstreamer应用开发实战指南(二)

一、​什么是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 提供了几种用于应用程序和管道之间的通信和数据交换的机制。

        缓冲区是用于在管道中的元素之间传递流数据的对象。缓冲区始终从源传输到接收器(下游)。

        事件是在元素之间发送或从应用程序发送到元素的对象。事件可以向上游和下游传播。下游事件可以与数据流同步。

        消息是由管道的消息总线上的元素发布的对象,它们将保存在其中以供应用程序收集。可以从发布消息的元素的流式处理线程上下文中同步截获消息,但通常由应用程序从应用程序的主线程异步处理。消息用于以线程安全的方式将错误、标记、状态更改、缓冲状态、重定向等信息从元素传输到应用程序。

        查询允许应用程序从管道请求持续时间或当前播放位置等信息。查询始终以同步方式回答。元素还可以使用查询从其对等元素请求信息(如文件大小或持续时间)。它们可以在管道中以两种方式使用,但上游查询更常见。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大王算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值