1.总体架构

1.1 顶层:应用与工具层(Multimedia Applications & Tools)
功能定位:直接面向用户或开发者的接口,提供快速调用 GStreamer 能力的工具和示例应用。
GStreamer Tools:
gst-launch:通过命令行快速构建媒体处理流水线(如gst-launch-1.0 filesrc location=test.mp3 ! decodebin ! audioconvert ! autoaudiosink)。gst-inspect:查看插件和元素的详细信息(如支持的格式、参数)。gst-editor(可能为旧版工具):图形化流水线设计工具。
Multimedia Applications
- VoIP & 视频会议:实时音视频传输(如 WebRTC 集成)。
- 流媒体服务器:支持 RTSP、HTTP 等协议的视频流分发。
- 媒体播放器/编辑器:基于 GStreamer 的解码、渲染、滤镜链实现。
1.2 中间层:核心框架(Core Framework)
- 功能定位:GStreamer 的“大脑”,负责媒体流的调度、同步、协商和扩展管理。
- 核心机制(图中蓝色部分):
- Pipeline Architecture:
- 数据流以 管道(Pipeline) 形式组织,由多个 元素(Element) 构成(如
source → decoder → converter → sink)。 - Source:负责获取原始媒体数据,可以是本地文件、硬件设备或网络流。
- Decoder:将压缩编码的数据解码为原始格式(如 PCM 音频、YUV/RGB 视频)。
- Converter:对原始数据进行格式转换、处理或添加效果,确保数据兼容下游组件。
- Sink:将处理后的数据输出到目标设备或存储。
- 数据流以 管道(Pipeline) 形式组织,由多个 元素(Element) 构成(如
- Media Agnostic:
- 支持任意媒体类型(音频、视频、字幕等),通过 Caps Negotiation 动态协商格式(如
video/x-raw, width=1920, height=1080)。
- 支持任意媒体类型(音频、视频、字幕等),通过 Caps Negotiation 动态协商格式(如
- Plugin System:
- 所有功能(编解码、协议、滤镜)均以插件形式加载,支持动态扩展。
- Message Bus & Synchronization:
- 通过消息总线传递事件(如 EOS 结束信号)、错误处理,并严格管理音画同步(PTS/DTS)。
- Pipeline Architecture:
消息总线是 GStreamer 组件间通信的全局通道,允许应用程序监听流水线状态、错误、标签(如媒体元数据)等事件,而无需直接与每个组件交互。
核心机制
消息类型:
GST_MESSAGE_STATE_CHANGED(状态变更,如 PLAYING → PAUSED)GST_MESSAGE_ERROR(错误通知,如解码失败)GST_MESSAGE_EOS(流结束信号)GST_MESSAGE_TAG(媒体元数据,如音频比特率)GST_MESSAGE_QOS(服务质量事件,如缓冲不足)工作流程:
- 组件生成消息(如
decoder解码失败时发送ERROR消息)。- 消息被发布到总线(通过
gst_element_post_message())。- 应用程序监听总线(通过
gst_bus_add_watch()或轮询)。- 处理消息(如显示错误日志或更新 UI)。
1.3 底层:插件与数据源/接收层(Plugins & Protocols/Sources/Sinks)
最下层为各种插件,实现具体的数据处理及音视频输出,应用不需要关注插件的细节,会由Core Framework层负责插件的加载及管理。主要分类为:
Protocols:负责各种协议的处理,file,http,rtsp等。
Sources:负责数据源的处理,alsa,v4l2,tcp/udp等。
Formats:负责媒体容器的处理,avi,mp4,ogg等。
Codecs:负责媒体的编解码,mp3,vorbis等。
Filters:负责媒体流的处理,converters,mixers,effects等。
Sinks:负责媒体流输出到指定设备或目的地,alsa,xvideo,tcp/udp等。
1.4 GStreamer组件
1. Element
基本概念

GStreamer 中的 Element(元素) 是最基本的构建块,用于构建媒体处理的 pipeline。每一个 element 负责特定的功能,例如读取数据、解码、编码、转换格式、显示视频等。下面将从架构、类型、生命周期、Pad 连接、事件与消息处理等多个维度详细分析 GStreamer 的 Element。
在 GStreamer 中,Element 是处理媒体数据的最小单位。每个 Element 都是一个 GObject,具备标准的对象继承机制。
-
一个 Element 可能拥有多个 Pad(输入/输出接口)。
-
元素可以通过 Pad 链接起来形成 Pipeline。
-
GStreamer 提供了丰富的内置 Element,也支持自定义 Element 开发。
Element 类型分类
GStreamer 按功能将 Element 分为以下几类:
| 类型 | 功能描述 |
|---|---|
| Source | 数据源,如 filesrc, v4l2src, udpsrc |
| Sink | 数据输出,如 autovideosink, filesink, udpsink |
| Filter | 中间处理,如 decodebin, audioconvert, videoconvert |
| Demuxer | 解复用器,如 qtdemux, tsdemux |
| Decoder | 解码器,如 avdec_h264 |
| Encoder | 编码器,如 x264enc |
| Muxer | 复用器,如 mpegtsmux, mp4mux |
| Parser | 分析器,如 h264parse |
Pad 结构与链接机制
Pad 类型
-
src pad:输出数据
-
sink pad:接收数据
Pad 分类
-
Static Pad:在创建元素时就固定存在的 pad。
-
Request Pad:需要通过 API 显式请求的 pad(如 tee)。
-
Sometimes Pad:只有在运行时(如探测到流)才动态创建。
Pad 链接
-
使用
gst_element_link()或gst_element_link_many()自动链接。 -
使用
gst_pad_link()可手动精细控制。
gst_element_link(source, filter);
2. Bin
Bin是一个容器,用于管理多个element,改变bin的状态时,bin会自动去修改所包含的element的状态,也会转发所收到的消息。如果没有bin,我们需要依次操作我们所使用的element。通过bin降低了应用的复杂度。
Pipeline继承自bin,为程序提供一个bus用于传输消息,并且对所有子element进行同步。当将pipeline的状态设置为PLAYING时,pipeline会在一个/多个新的线程中通过element处理数据。
3.Pipline
Pipeline(管道)是 GStreamer 中顶层的容器,负责管理整个多媒体处理流程的元素集合。
换句话说,Pipeline 是一种特殊的 Bin,但是它有更重要的任务:
除了像普通 Bin 一样管理子元素以外,它还控制整个数据流的生命周期(比如启动、暂停、停止)。
[ Pipeline (也是Bin) ]
|
[MyBin]
|
[Element1]--[Element2]

可以看到这个pipeline由8个element构成,每个element都实现各自的功能:
filesrc读取文件,oggdemux解析文件,分别提取audio,video数据,queue缓存数据,vorbisdec解码audio,autoaudiosink自动选择音频设备并输出,theoradec解码video,videoconvert转换video数据格式,autovideosink自动选择显示设备并输出。
不同的element拥有不同数量及类型的pad,只有src pad的element被称为source element,只有sink pad的被称为sink element。
element可以同时拥有多个相同的pad,例如oggdemux在解析文件后,会将audio,video通过不同的pad输出。
4. 示例
gst-launch-1.0 videotestsrc ! "video/x-raw,width=1280,height=720" ! autovideosink
用 GStreamer 启动一个流水线:
-
生成测试视频(
videotestsrc), -
强制设置分辨率为 1280×720,
-
然后把画面显示到屏幕上(
autovideosink)。
分模块详细拆解
1. gst-launch-1.0
-
这是 GStreamer 的命令行工具。
-
用来直接创建和运行一个 Pipeline。
-
-1.0表示用 GStreamer 1.x 版本(通常是 1.14、1.18、1.20等)。
2. videotestsrc
-
Element(元素)。
-
产生一段模拟的视频信号(比如彩条、灰阶、运动图形)。
-
通常用于测试视频链路是否正常。
-
可以调参数,比如
pattern(不同花样:彩条、棋盘格等)。
👉 默认输出是原始的 video/x-raw 数据格式。
3. !
-
连接符号。
-
把上一个元素的输出连接到下一个元素的输入。
-
在 GStreamer 中,元素通过 Pad 连接起来,
!就是链接的意思。
4. "video/x-raw,width=1280,height=720"
-
这是一个CapsFilter(能力过滤器,Capabilities Filter)。
-
用来约束数据格式,确保数据流是指定的格式。
-
"video/x-raw"表示原始未压缩视频帧。 -
width=1280,height=720指定输出分辨率是 1280×720(HD720p)。
👉 作用就是告诉 GStreamer:
“我要 1280x720 的原始视频流,中间不能自动帮我乱转。”
如果 videotestsrc 输出不是这个尺寸,GStreamer 会自动插入一个 videoconvert 或 videoscale 等内部元素来匹配。
5. autovideosink
-
Element(元素)。
-
自动选择一个合适的视频输出模块(sink)。
-
具体使用什么后端,跟你的平台/系统环境有关,比如:
-
Linux:可能是
xvimagesink、ximagesink、glimagesink。 -
Windows:可能是
d3dvideosink、directdrawsink。 -
macOS:可能是
osxvideosink。
-
1.5 Gstreamer 消息通信
在pipeline运行的过程中,各个element以及应用之间不可避免的需要进行数据消息的传输,gstreamer提供了bus系统以及多种数据类型(Buffers、Events、Messages,Queries)来达到此目的:

Bus
Bus是gstreamer内部用于将消息从内部不同的streaming线程,传递到bus线程,再由bus所在线程将消息发送到应用程序。应用程序只需要向bus注册消息处理函数,即可接收到pipline中各element所发出的消息,使用bus后,应用程序就不用关心消息是从哪一个线程发出的,避免了处理多个线程同时发出消息的复杂性。
Buffers
用于从sources到sinks的媒体数据传输。
Events
用于element之间或者应用到element之间的信息传递,比如播放时的seek操作是通过event实现的。
Messages
是由element发出的消息,通过bus,以异步的方式被应用程序处理。通常用于传递errors, tags, state changes, buffering state, redirects等消息。消息处理是线程安全的。由于大部分消息是通过异步方式处理,所以会在应用程序里存在一点延迟,如果要及时的相应消息,需要在streaming线程捕获处理。
Queries
用于应用程序向gstreamer查询总时间,当前时间,文件大小等信息。
2. 代码是实例
1.demo1
#include <gst/gst.h> // 引入 GStreamer 主头文件

最低0.47元/天 解锁文章
1831

被折叠的 条评论
为什么被折叠?



