Gstreamer (imx8+MAX9286+MAX96705)学习笔记

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​​:将处理后的数据输出到目标设备或存储​​。
    • ​Media Agnostic​​:
      • 支持任意媒体类型(音频、视频、字幕等),通过 ​​Caps Negotiation​​ 动态协商格式(如 video/x-raw, width=1920, height=1080)。
    • ​Plugin System​​:
      • 所有功能(编解码、协议、滤镜)均以插件形式加载,支持动态扩展。
    • ​Message Bus & Synchronization​​:
      • 通过消息总线传递事件(如 EOS 结束信号)、错误处理,并严格管理音画同步(PTS/DTS)。

消息总线是 ​GStreamer 组件间通信的全局通道​​,允许应用程序监听流水线状态、错误、标签(如媒体元数据)等事件,而无需直接与每个组件交互。

核心机制​
  • ​消息类型​​:

    • GST_MESSAGE_STATE_CHANGED(状态变更,如 PLAYING → PAUSED)
    • GST_MESSAGE_ERROR(错误通知,如解码失败)
    • GST_MESSAGE_EOS(流结束信号)
    • GST_MESSAGE_TAG(媒体元数据,如音频比特率)
    • GST_MESSAGE_QOS(服务质量事件,如缓冲不足)
  • ​工作流程​​:

    1. ​组件生成消息​​(如 decoder 解码失败时发送 ERROR 消息)。
    2. ​消息被发布到总线​​(通过 gst_element_post_message())。
    3. ​应用程序监听总线​​(通过 gst_bus_add_watch() 或轮询)。
    4. ​处理消息​​(如显示错误日志或更新 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 会自动插入一个 videoconvertvideoscale 等内部元素来匹配。


5. autovideosink

  • Element(元素)

  • 自动选择一个合适的视频输出模块(sink)。

  • 具体使用什么后端,跟你的平台/系统环境有关,比如:

    • Linux:可能是 xvimagesinkximagesinkglimagesink

    • Windows:可能是 d3dvideosinkdirectdrawsink

    • 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 主头文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值