【Gstreamer 应用程序开发手册 01】关于GSTREAMER

官网

What is GStreamer?

一、什么是GSTREAMER

GSTREAMER是用于创建流媒体应用程序的框架。基本设计来自俄勒冈研究生研究所的视频管道,以及DirectShow的一些想法。

GSTREAMER的开发框架使得编写任何类型的流媒体多媒体应用程序成为可能。 GSTREAMER FRAMERWORK旨在使编写可处理音频或视频或两者兼而有之的应用程序易于编写。它不仅限于音频和视频,而且可以处理任何类型的数据流。管道设计的开销几乎没有施加过滤器的诱导。这使GSTREAMER成为设计甚至高端音频应用程序的良好框架,这些应用程序对延迟提出了很高的要求。

GSTREAMER的最明显用途之一就是使用它来构建媒体播放器。 GSTREAMER已经包含用于构建媒体播放器的组件,该组件可以支持各种格式,包括MP3,OGG/Vorbis,MPEG-1/2,AVI,QuickTime,Mod等。但是,GSTREAMER不仅仅是另一个媒体播放器。它的主要优点是可以将可插入的组件混合并匹配到任意管道中,以便可以编写成熟的视频或音频编辑应用程序。

该框架基于将提供各种编解码器和其他功能的插件。可以将插件链接并在管道中排列。该管道定义了数据流。管道也可以使用GUI编辑器进行编辑,并保存为XML,以便可以最少的努力制作管道库。

GSTREAMER CORE功能是为插件,数据流和媒体类型处理/协商提供一个框架。它还提供了使用各种插件编写应用程序的API。

具体而言,GSTREAMER提供

  • 多媒体应用的API
  • 插件架构
  • 管道架构
  • 媒体类型处理/谈判的机制
  • 同步机制
  • 超过250个插件提供1000多个元素
  • 一组工具

GSTREAMER插件可以分为

  • 协议处理
  • 来源:音频和视频(涉及协议插件)
  • 格式:解析器、格式化器、混合器、分解器、元数据、字幕
  • 编解码器:编码器和解码器
  • 过滤器:转换器,混频器,效果,...
  • 接收器:用于音频和视频(涉及协议插件)

GStreamer被打包成

  • Gstreamer:核心包
  • Gst-plugins-base:一组基本的示例元素
  • gst-plugins-good:一组高质量的LGPL插件
  • Gst-plugins-ugly:一组可能造成发布问题的高质量插件
  • Gst-plugins-bad:一组需要更高质量的插件
  • Gst-libav:一组封装libav进行解码和编码的插件
  • 其他几个包

二、设计原则

简洁而强大

GStreamer 为以下两类开发者提供了简洁的接口:

应用程序开发者:他们希望构建媒体处理流水线。开发者可以使用一系列强大的工具,无需编写代码即可创建媒体流水线。复杂的媒体操作变得非常简单。

插件开发者:插件开发者可以通过简洁的 API 创建独立的插件。GStreamer 集成了完善的调试和追踪机制,并提供了大量实际可用的插件作为示例。

面向对象

GStreamer 遵循 GObject(GLib 2.0 的对象模型)。熟悉 GLib 2.0 或 GTK+ 的开发者会感到得心应手。

GStreamer 使用信号和对象属性的机制。

所有对象都可以在运行时查询其属性和功能。

GStreamer 在编程方法上力求与 GTK+ 类似,包括对象模型、对象所有权、引用计数等。

可扩展性

所有 GStreamer 对象都可以通过 GObject 的继承机制进行扩展。 所有插件都是动态加载的,可以独立扩展和升级。

支持仅二进制插件

插件是运行时加载的动态库。由于插件的所有属性都可以通过 GObject 属性设置,因此无需(实际上也无法)为插件安装任何头文件。

特别注重插件的完全自包含性,插件的所有相关方面都可以在运行时查询。

高性能

高性能通过以下方式实现:

使用 GLib 的 GSlice 内存分配器 插件间极轻量级的链接,数据在流水线中传输时开销极小,通常仅需指针解引用

提供直接操作目标内存的机制,例如插件可以直接写入 X 服务器的共享内存空间,缓冲区也可以指向任意内存(如声卡的硬件缓冲区)

引用计数和写时复制技术减少内存拷贝,子缓冲区高效拆分缓冲区

专用的流处理线程,由内核调度

支持通过专用插件实现硬件加速

插件注册机制延迟加载插件,直到实际使用时才加载

核心与插件的清晰分离

GStreamer 的核心本质上是与媒体无关的,仅处理字节和块,且仅包含基础元素。其核心功能甚至足以实现低级系统工具(如 cp)。

所有媒体处理功能均由核心外部的插件提供,这些插件告诉核心如何处理特定类型的媒体。

为编解码器实验提供框架

GStreamer 还希望成为一个易于使用的框架,供编解码器开发者实验不同算法,从而加速开放和自由的多媒体编解码器(如 Xiph.Org 基金会开发的 Theora 和 Vorbis)的开发。

三、基础概念

本章介绍 GStreamer 的基本概念。理解这些概念对后续内容至关重要,所有章节均假设读者已掌握这些基础知识。

元素(Elements)

元素是 GStreamer 中最重要的对象类别。通常,你会创建一系列相互链接的元素,让数据流经这些元素链。每个元素具有特定功能,例如从文件读取数据、解码数据或将数据输出到声卡(或其他设备)。通过将多个元素串联起来,可以构建一个完成特定任务(如媒体播放或采集)的流水线。GStreamer 默认提供了大量元素,支持开发多种媒体应用程序。如有需要,你也可以编写新元素,详见《GStreamer 插件开发指南》。

衬垫(Pads)

衬垫是元素的输入和输出接口,用于连接其他元素。它们在 GStreamer 中负责协商元素间的链接和数据流。衬垫可视为元素的"插孔"或"端口",通过它与其他元素建立链接,数据由此流入或流出。衬垫具有特定的数据处理能力------它能限制流经的数据类型。只有当两个衬垫允许的数据类型(能力,即 caps)兼容时,才能建立链接。数据类型通过 caps 协商 过程确定,并由 GstCaps 描述。

类比家用影音系统可能更易理解:衬垫类似于物理设备上的插孔。例如,一套家庭影院系统包含音频放大器、DVD 播放器和(无声)视频投影仪。将 DVD 播放器连接到放大器是允许的,因为两者都有音频插孔;将投影仪连接到 DVD 播放器也是允许的,因为两者具有兼容的视频接口。但投影仪与放大器之间无法连接,因为它们的插孔类型不匹配。GStreamer 中的衬垫功能与此完全相同。

在 GStreamer 中,数据通常沿元素间的链接单向流动。数据通过一个或多个 源衬垫(source pads) 流出元素,并通过一个或多个 接收衬垫(sink pads) 接收数据。源元素和接收元素分别仅包含源衬垫和接收衬垫。数据通常指 缓冲区(GstBuffer 对象) 和 事件(GstEvent 对象)。

箱柜(Bins)与流水线(Pipelines)

箱柜是元素的集合容器。由于箱柜本身是元素的子类,你可以像控制单个元素一样控制箱柜,从而为应用程序隐藏复杂性。例如,通过改变箱柜的状态,可以同时改变其内部所有元素的状态。箱柜还会转发子元素发出的总线消息(如错误消息、标签消息或流结束消息)。

流水线是顶层的箱柜。它为应用程序提供总线并管理子元素的同步。当你将其设为 PAUSED 或 PLAYING 状态时,数据流将启动,媒体处理开始执行。流水线启动后会在独立线程中运行,直到被停止或数据流结束。

通信机制

GStreamer 提供了多种机制,用于应用程序与流水线之间的通信和数据交换:

  • 缓冲区(Buffers):在流水线元素间传递流数据的对象。缓冲区始终从源元素流向接收元素(下游)。
  • 事件(Events):在元素之间或从应用程序发送到元素的对象。事件可向上游或下游传递。下游事件可与数据流同步。
  • 消息(Messages):由元素发布到流水线消息总线的对象,应用程序可从中获取。消息可以从元素流线程上下文同步拦截,但通常由应用程序在主线程中异步处理。消息用于以线程安全的方式将错误、标签、状态变更、缓冲状态、重定向等信息从元素传递到应用程序。
  • 查询(Queries):允许应用程序向流水线请求信息(如时长或当前播放位置)。查询总是同步响应。元素也可通过查询向同级元素请求信息(如文件大小或时长)。查询在流水线中可双向使用,但上游查询更常见。
相关推荐
石去皿2 小时前
轻量级 Web 应用 —— 把一堆图片按指定频率直接拼成视频,零特效、零依赖、零命令行
前端·音视频
LaoWaiHang2 小时前
Linux基础知识13:用户、用户组管理
linux
Coder个人博客3 小时前
Linux6.19-ARM64 mm init子模块深入分析
linux·安全·车载系统·系统架构·系统安全·鸿蒙系统·安全架构
济6173 小时前
ARM Linux 驱动开发篇----Linux驱动开发与裸机开发的区别---- Ubuntu20.04
linux·arm开发·驱动开发
慎思知行3 小时前
Discord中创建机器人的流程
linux·服务器·机器人
enbug3 小时前
编译安卓内核:以坚果R1、魔趣MK100(Android 10)系统为例
android·linux
玉梅小洋3 小时前
Linux命令详解 —— IP 命令及永久配置
linux·运维·tcp/ip
江畔何人初3 小时前
k8s中Role与networkpolicy区别
linux·运维·云原生
进击的小头4 小时前
FIR滤波器实战:音频信号降噪
c语言·python·算法·音视频