长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机视觉

  • ESP32开发

  • Linux系统移植

  • 快速开始

  • 多媒体(Mutimedia)

    • Mutimedia开发-GStreamer的介绍和原理
      • GStreamer 介绍
      • GStreamer 原理
        • 元件 (Element):
        • 衬垫 (Pads):
        • 管道 (Pipeline):
        • 通信机制 (Communication):
      • 参考文档
    • Mutimedia开发-使用GStreamer实现视频播放的多音轨切换
  • 音频开发(Audio)

  • 编程小知识

  • 技术
  • 多媒体(Mutimedia)
DC Wang
2025-08-17
目录

Mutimedia开发-GStreamer的介绍和原理

# Gstreamer的介绍和原理

# GStreamer 介绍

GStreamer 是一个开源、跨平台的多媒体框架。它提供了丰富的 API 和工具,用于构建处理音频、视频和其他多媒体流的应用程序。核心思想是将复杂的数据处理流程(如播放、录制、转码、流传输、特效等)分解成一系列简单的、可复用的组件(称为元素),然后通过管道将这些组件连接起来。

# GStreamer 原理

参考官网:GStreamer Foundations (opens new window)

GStreamer 的核心原理建立在以下关键概念之上:

# 元件 (Element):

  • 构建管道的最小功能单元。

  • 每种元件执行特定的任务。主要类型包括:

    • 源元件 (Src): 生成数据(如从文件读取 filesrc, 从摄像头捕获 v4l2src, 生成测试信号 videotestsrc/audiotestsrc)。
    • 接收器元件 (Sink): 消费/输出数据(如播放到扬声器 autoaudiosink, 显示到屏幕 autovideosink, 写入文件 filesink, 流输出 rtmpsink)。
    • 过滤器元件 (Filter): 处理流经管道的数据(如解码器 avdec_h264, 编码器 x264enc, 转换器 audioconvert/videoconvert, 缩放器 videoscale, 混合器 videomixer, 特效 gamma)。
    • 解复用器 (Demuxer): 将容器流(如 MP4)拆分成多个基础流(音频流、视频流等)。
    • 复用器 (Muxer): 将多个基础流合并成一个容器流。

# 衬垫 (Pads):

  • 元件数据进出的端口。你可以把它们想象成管道的接口或插孔。

  • 源衬垫 (Src Pad): 元件输出数据的点。

  • 接收衬垫 (Sink Pad): 元件接收数据的点。

  • 元件间通过将一个元件的源衬垫连接到另一个元件的接收衬垫来连接。

  • 媒体类型协商 (Caps Negotiation):

    • 当两个元件连接时,它们必须就它们之间传输的数据格式(Capabilities,简称 Caps)达成一致。Caps 描述了数据的精确属性,如:

      • 视频:MIME 类型(video/x-raw), 像素格式(I420, NV12, RGBA), 分辨率(640x480), 帧率(30/1)。

      • 音频:MIME 类型(audio/x-raw), 格式(S16LE, F32LE), 采样率(44100), 通道数(2)。

    • 在管道运行(PLAYING)状态之前,元件之间会进行复杂的协商过程,以确定所有连接的衬垫都支持兼容的格式,并可能需要插入自动转换器(如 audioconvert, videoconvert, capsfilter)来确保兼容性。

# 管道 (Pipeline):

  • 这是 GStreamer 应用程序的核心结构。

  • 它由一组有序连接的元件组成,构成一个数据处理的拓扑图。

    GStreamer pipeline for a simple ogg player

  • 管道管理其内部元件的状态(如播放、暂停、停止)、数据传输、同步、消息传递(如错误、警告、流结束)和总线通信。

  • 时钟 (Clock) 和同步:

    • 管道使用一个主时钟(通常是音频接收器或视频接收器提供的时钟)来协调音视频渲染的同步。

    • 时间戳信息被添加到 Buffer 中,元件(特别是接收器)使用这些时间戳和主时钟来决定何时渲染数据,以达到音画同步。

# 通信机制 (Communication):

GStreamer 提供多种机制,实现应用程序与管道之间、以及管道内部元件之间的通信和数据交换:

  • 缓冲区 (Buffers): 用于在管道内的元件间传递流数据对象。缓冲区始终从src流向sink(即下游 - Downstream)。

  • 事件 (Events): 在元件之间或从应用程序向元件传递的对象,用于传达状态信息或控制行为。事件可双向流通(上游 - Upstream 或下游 - Downstream)。下游事件可与数据流保持同步。

    • SEEK事件:请求跳转到媒体流的特定位置。

    • EOS事件:表示流的结束。

    • FLUSH事件:要求元件丢弃所有缓存数据并重置。

  • 消息 (Messages): 由元件发布到管道消息总线 (Message Bus) 的对象,供应用程序收集处理。应用程序可从发布消息的元件所在流线程中同步拦截消息,但通常更倾向于在应用程序主线程中异步处理。消息用于以线程安全的方式将信息(如错误、标签、状态变更、缓冲状态、重定向等)从元件传递给应用程序。

    • 错误 (error messages)
    • 标签 (tag messages)
    • 状态变更 (state changes)
    • 缓冲状态 (buffering state)
    • 重定向 (redirects)
    • 流结束 (EOS)
  • 查询 (Queries): 使应用程序能向管道请求信息(如时长、当前播放位置)。查询始终同步响应。元件也可使用查询向其同级元件获取信息(如文件大小或时长)。查询可在管道内双向使用,但上游查询更为常见。

GStreamer pipeline with different communication flows

# 参考文档

官方文档:

基础教程: https://gstreamer.freedesktop.org/documentation/tutorials/

插件手册:https://gstreamer.freedesktop.org/documentation/plugins_doc.html?gi-language=c

API参考:https://gstreamer.freedesktop.org/documentation/libs.html?gi-language=c

编辑 (opens new window)
#Mutimedia
Ubuntu 22.04 安装docker和docker compose
Mutimedia开发-使用GStreamer实现视频播放的多音轨切换

← Ubuntu 22.04 安装docker和docker compose Mutimedia开发-使用GStreamer实现视频播放的多音轨切换→

最近更新
01
Linux Audio开发-ALSA使用内存映射(MMAP)的录音实现(Ubuntu22)
08-17
02
Linux Audio开发-使用ALSA驱动进行录音和播放(Ubuntu22)
08-17
03
Linux Audio开发-ALSA API列表
08-17
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备21029602001058号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式