官网
一、什么是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):允许应用程序向流水线请求信息(如时长或当前播放位置)。查询总是同步响应。元素也可通过查询向同级元素请求信息(如文件大小或时长)。查询在流水线中可双向使用,但上游查询更常见。