GStreamer系列 - 基本介绍

使用 gst-plugins-bad 里面的 gst-element-maker 工具创建gstreamer 插件 本文主要介绍如何使用gst-plugins-bad 里面的 gst-element-maker 工具创建新的gstreamer插件,这是目前创建gstreamer插件最新的方法。软硬件环境:gst-element-maker 工具是一个shell 脚本, 由一系列的命令组成, 包括参考插件模块生成新的插件代码,以及编译新的插件代码生成对应的.so 文件;gst-element-maker 工具是通过同目录下的插件模板来创建新的插件的,支持的插件模板种类是有限的; 阅读详情

什么是Gstreamer?

Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。

下图是对基于Gstreamer框架的应用的简单分层:

![在这里插入图片描述](https://img-blog.csdnimg.cn/b597541edbcc43b99b737187beac972f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc2hsaWFuZzMxMA==,size_17,color_FFFFFF,t_70,g_se,x_16#pic_center)

 

Media Applications

最上面一层为应用,比如gstreamer自带的一些工具(gst-launch,gst-inspect等),以及基于gstreamer封装的库(gst-player,gst-rtsp-server,gst-editing-services等)根据不同场景实现的应用。

Core Framework

中间一层为Core Framework,主要提供:

  • 上层应用所需接口
  • Plugin的框架
  • Pipline的框架
  • 数据在各个Element间的传输及处理机制
  • 多个媒体流(Streaming)间的同步(比如音视频同步)
  • 其他各种所需的工具库

Plugins

最下层为各种插件,实现具体的数据处理及音视频输出,应用不需要关注插件的细节,会由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等。

Gstreamer框架根据各个模块的成熟度以及所使用的开源协议,将core及plugins置于不同的源码包中:

  • gstreamer: 包含core framework及core elements。
  • gst-plugins-base: gstreamer应用所需的必要插件。
  • gst-plugins-good: 高质量的采用LGPL授权的插件。
  • gst-plugins-ugly: 高质量,但使用了GPL等其他授权方式的库的插件,比如使用GPL的x264,x265。
  • gst-plugins-bad: 质量有待提高的插件,成熟后可以移到good插件列表中。
  • gst-libav: 对libav封装,使其能在gstreamer框架中使用。

 

Gstreamer基础概念

在进一步学习Gstreamer前,我们需要掌握一些gstreamer的基础概念。

Element

Element是Gstreamer中最重要的对象类型之一。一个element实现一个功能(读取文件,解码,输出等),程序需要创建多个element,并按顺序将其串连起来,构成一个完整的pipeline。

Pad

Pad是一个element的输入/输出接口,分为src pad(生产数据)和sink pad(消费数据)两种。
两个element必须通过pad才能连接起来,pad拥有当前element能处理数据类型的能力(capabilities),会在连接时通过比较src pad和sink pad中所支持的能力,来选择最恰当的数据类型用于传输,如果element不支持,程序会直接退出。在element通过pad连接成功后,数据会从上一个element的src pad传到下一个element的sink pad然后进行处理。
当element支持多种数据处理能力时,我们可以通过Cap来指定数据类型.
例如,下面的命令通过Cap指定了视频的宽高,videotestsrc会根据指定的宽高产生相应数据:

gst-launch-1.0 videotestsrc ! "video/x-raw,width=1280,height=720" ! autovideosink

Bin和Pipeline

Bin是一个容器,用于管理多个element,改变bin的状态时,bin会自动去修改所包含的element的状态,也会转发所收到的消息。如果没有bin,我们需要依次操作我们所使用的element。通过bin降低了应用的复杂度。
Pipeline继承自bin,为程序提供一个bus用于传输消息,并且对所有子element进行同步。当将pipeline的状态设置为PLAYING时,pipeline会在一个/多个新的线程中通过element处理数据。

下面我们通过一个文件播放的例子来熟悉上述提及的概念:测试文件 sintel_trailer-480p.ogv

gst-launch-1.0 filesrc location=sintel_trailer-480p.ogv ! oggdemux name=demux ! queue ! vorbisdec ! autoaudiosink demux. ! queue ! theoradec ! videoconvert ! autovideosink

通过上面的命令播放文件时,会创建如下pipeline:

可以看到这个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输出。

 

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查询总时间,当前时间,文件大小等信息。

 

gstreamer tools

Gstreamer自带了gst-inspect-1.0和gst-launch-1.0等其他命令行工具,我们可以使用这些工具完成常见的处理任务。
gst-inspect-1.0
查看gstreamer的plugin、element的信息。直接将plugin/element的类型作为参数,会列出其详细信息。如果不跟任何参数,会列出当前系统gstreamer所能查找到的所有插件。

$ gst-inspect-1.0 playbin

gst-launch-1.0
用于创建及执行一个Pipline,因此通常使用gst-launch先验证相关功能,然后再编写相应应用。
通过上面ogg视频播放的例子,我们已经看到,一个pipeline的多个element之间通过 “!" 分隔,同时可以设置element及Cap的属性。例如:
播放音视频

gst-launch-1.0 playbin file:///home/root/test.mp4

转码

gst-launch-1.0 filesrc location=/videos/sintel_trailer-480p.ogv ! decodebin name=decode ! \
videoscale ! "video/x-raw,width=320,height=240" ! x264enc ! queue ! \
mp4mux name=mux ! filesink location=320x240.mp4 decode. ! audioconvert ! \
avenc_aac ! queue ! mux.

Streaming

#Server
gst-launch-1.0 -v videotestsrc ! "video/x-raw,framerate=30/1" ! x264enc key-int-max=30 ! rtph264pay ! udpsink host=127.0.0.1 port=1234

#Client
gst-launch-1.0 udpsrc port=1234 ! “application/x-rtp, payload=96” ! rtph264depay ! decodebin ! autovideosink sync=false

 

引用

https://gstreamer.freedesktop.org/documentation/application-development/introduction/gstreamer.html
https://gstreamer.freedesktop.org/documentation/application-development/introduction/basics.html
https://gstreamer.freedesktop.org/documentation/tools/gst-launch.html

 

作者: John.Leng
本文版权归作者所有,欢迎转载。商业转载请联系作者获得授权,非商业转载请在文章页面明显位置给出原文连接.

转载于:https://www.cnblogs.com/xleng/p/10948838.html

Gstreamer 应用开发:1-基础介绍 介绍开始围绕如何用命令实现一个音视频混合,或者单独的音频,和单独的视频文件如何实现播放,并逐步开始使用C语言程序来实现之前我们用命令行来实现的功能 阅读详情

相关推荐

gstreamer框架与 NVIDIA Jetson 系列GStreamer工具

(用于访问 NVIDIA 摄像头模块,如 Jetson Nano 上的 CSI 摄像头),以及针对视频处理(如视频编码/解码、缩放、转换等)优化的插件。:使用 NVIDIA 提供的源元素(source element)来捕获视频,sensor_id=0 指定使用第一个摄像头(如果有多个)。也是一个常用的工具,因为 NVIDIA 提供了对 GStreamer 的良好支持和优化,特别是在处理视频和图像方面。:设置视频流的格式(这里使用 NVIDIA 内存管理(NVMM)),分辨率和帧率。

qq_43298381的博客 1381

【亲测免费】 GStreamer 插件项目 `gst-plugins-bad` 使用教程

GStreamer 插件项目 gst-plugins-bad 使用教程 1. 项目目录结构及介绍 gst-plugins-bad 项目是 GStreamer 框架的一部分,主要包含一些质量尚未达到标准的插件。以下是该项目的目录结构及其介绍: gst-plugins-bad/ ├── AUTHORS ├── COPYING ├── ChangeLog ├── MAINTAINERS ├── NEWS...

gitblog_00273的博客 1383

GStreamer系列之ubuntu18上安装使用

正文 参考文档 官方: https://gstreamer.freedesktop.org/documentation/installing/on-linux.html?gi-language=c 系列教程:https://www.cnblogs.com/xleng/p/10948838.html 安装前置 sudo apt update sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreame

kkae8643150的专栏 1万+

gst-plugins-bad 交叉编译找不到文件

gst-plugins-bad 编译

hand123的专栏 559

Gstreamer之gst-plugin-bad交叉编译集成x265(二十二)

注意:Gsteamer版本为1.16.2 0.下载arm交叉编译环境(自行配置) 1.下载x265 code # git clone https://github.com/videolan/x265.git 2.编译x265源码 # cd x265-master/build/arm-linux <1>.修改emacs crosscompile.cmake # modified begin # specify the cross compiler set(CMAKE_C_COMPILER .

Android系统攻城狮 1327

Vue项目实战:用DataV的dv-scroll-board打造高颜值滚动表格(附完整代码)

本文详细介绍了如何在Vue项目中使用DataV的dv-scroll-board组件打造高颜值滚动表格。从基础集成到高级配置,包括动态数据处理、深度样式定制、性能优化策略以及交互增强方案,帮助开发者快速实现企业级数据展示需求。特别针对样式优化和滚动表格的常见问题提供了实用解决方案。

weixin_30892037的博客 499

Jetson 系列--嵌入式Linux下Gstreamer编程

Gstreamer

zhibing_ding的博客 2417

Cesium实战:如何在前端直接渲染TIFF影像(附完整代码与避坑指南)

本文详细介绍了如何在前端利用Cesium直接加载和渲染TIFF影像的完整技术方案。针对TIFF格式的地理影像数据,文章提供了从文件解析、坐标转换到像素处理与Cesium集成的全流程代码实现,并分享了性能优化与常见问题的避坑指南,帮助开发者高效实现三维地理可视化。

weixin_29290947的博客 316

gstreamer系列 -- 获取媒体信息

gstreamer系列 -- 获取媒体信息

智能机器人产学研基地 443

【origin】负载牵引的Smith圆图

export导出为txt,得到的是幅相值,复制到excel如下图,有多根类似格式的线,只需要复制DE列到origin中。回到sheet,发现新增了选中的一组值,就是解释过后的值。笔者没找到把所有线一起画出的方法,只能蠢一点,一组一组画。而且,箭头所指的位置都变成了Y轴(应该要为X轴)以此类推,把之后的曲线都画完,可以汇总到一个图中。显示以下界面,点击右上圆图,选择解释。会生成新的graph,再重新解释一次。选择第二组线,同样画smith圆图。选中第一组线,选smith圆图。复制到origin,如下图。

乾巽的博客 2922

RapidScada在windows下的安装(详细)

1.下载地址:RapidScada官网 2.版本说明 有Linux版本和Windows版本,看自己的需求下载,推荐下载最新稳定版本。 3.系统要求 4.安装前的准备(windows10) 首先打开Windows功能: 先关闭 Microsoft .NET Framework3.5的 Windows Communication Foundation 子组件。如下图: Microsoft .NET Framework配置按下图勾选: iis安装的功能: 5.安装 解压..

m0_51275803的博客 4264

【Gstreamer 系列 3】windows QT+Gstreamer 环境搭建

1.下载Gstreamer库 目前最新版本为1.17.90 官网下载地址https://gstreamer.freedesktop.org/pkg/ 选择下载windows平台的库 这里选择为 mingw32位 1.16.20 版本 进行开发需下载 2个版本 2.Gstreamer库安装 选择自定义路径安装 选择路径分别安装下载的2个库 3.QT工程配置 新建一个mingw32 工程 找到安装好的gstreamer-devel-mingw-x86-1.16.2库 将整个库...

weixin_42549534的博客 4954

《AgentScope-Java 深入浅出教程》第2章 环境搭建与第一个智能体

创建// 【导入说明】/*** 时间相关工具类* 工具类是普通的 Java 类,通过注解声明为工具。* 智能体可以根据用户需求自动调用这些工具。*/// 【工具定义】获取当前时间@Tool(name = "get_current_time", // 工具名称:LLM 看到的名称description = "获取指定时区的当前时间" // 工具描述:帮助 LLM 理解何时使用// 【参数定义】// @ToolParam 的 name 属性是必需的!

步子哥的博客 417

【Gstreamer 系列 4】构建ubuntu下的Gstreamer工程

1.将编译好的库放到工程内 2.编写简单的cmake cmake_minimum_required(VERSION 2.8) project(GstCameraAPI) SET(SRC_LIST GstCameraAPI.c TOOLS/videotools.c DRIVER/usbcamera.c ) # add (.h) address include_directories(${PROJECT_SOURCE_DIR}/CONFIG ..

weixin_42549534的博客 3111

基于 Simulink 的单相 PWM 整流器(四象限变流器)在高铁辅助电源系统中的建模与仿真实战教程

这是一份基于 Simulink 的实战教程。在高铁牵引供电与辅助电源系统中,单相 PWM 整流器(又称四象限变流器,4QC)是极其核心的“绿色电源”枢纽。传统的二极管整流器虽然结构简单,但会导致严重的输入电流畸变和低功率因数,对电网造成极大的谐波污染。而 PWM 整流器通过高频主动控制,不仅能将单相交流电转换为平稳的直流电,还能实现输入电流正弦化、单位功率因数(PF=1)运行,并支持能量双向流动(如列车再生制动时的能量回馈)。本教程将带你从数学模型出发,搭建一套高性能的电压电流双闭环控制系统。

amy_mhd的博客 47

爆肝整理:微信公众号文章HTML编写完整规范,运营必备手册

微信公众号文章排版总是出错?📱 这份完整的HTML编写规范文档帮你彻底解决!文档包含所有支持的标签、CSS属性、实用代码模板和注意事项 📋,让你快速掌握微信文章的HTML编写技巧,告别第三方编辑器依赖 ✅

XiaoqiangClub的博客 2313

GStreamer官方教程系列——Basic tutorial 2: GStreamer concepts

GStreamer官方教程系列 Basic tutorial 2: GStreamer concepts 原文:https://gstreamer.freedesktop.org/documentation/tutorials/basic/concepts.html?gi-language=c 目标   上一个教程展示了如何自动构建一个管道。而本教程我们将会手动构建管道,实例化每个元件并且将它们链接在一起。在这个过程中,我们会学习到: 什么是GStreamer元件以及如何创建它。 怎么链接元件。 怎么自定

SaberZXL520的博客 324

从养虾到退坑:OpenClaw 卸载不留残留,一步到位

文章摘要: 本文提供OpenClaw软件的完整卸载指南,适用于Windows、macOS和Linux系统。内容包含卸载前的数据备份步骤(配置文件、日志、插件列表),以及详细的卸载脚本。Windows版通过批处理文件删除程序文件、注册表项和环境变量;macOS/Linux版则提供shell脚本,涵盖服务停止、软件包卸载、配置清理等步骤。特别强调要删除所有用户数据(包括多用户环境),确保系统无残留。文末建议重启计算机以使更改生效,实现"一步到位"的彻底卸载。

一键难忘的博客 298

GStreamer系列-基础概念

目录:一、什么是 GStreamer 二、GStreamer 架构 1. app 层 2. core framework层 3. plugin 层 三...

嵌入式Hacker 1525

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Gstreamer系列(1):linux平台下的gstreamer安装

linux下gstreamer一键安装指令

qq_27897937的博客 3846

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

GStreamer官方教程系列——Pipeline manipulation

GStreamer官方教程系列 Pipeline manipulation 原文:https://gstreamer.freedesktop.org/documentation/application-development/advanced/pipeline-manipulation.html?gi-language=c#using-probes   本节展示了诸多可以用来操纵你的应用中的管道(pipeline)的方法。主要有以下主题: 怎么将一个应用中的数据插入到管道中。 怎么从一个管道中读取数据。

SaberZXL520的博客 2001

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

GStreamer系列-Hello World

目录:一、目标 二、代码分析 1. 初始化 GStreamer 2. 创建 Pipeline 3. 什么是 playbin ? 4. 设置 pipeline 的状态为 P...

嵌入式Hacker 386

【Gstreamer 系列 2】Linux Gstreamer 视频处理命令

1.mp4转yuv gst-launch-1.0 filesrc location=/home/source.mp4 ! qtdemux ! h264parse ! omxh264dec ! filesinklocation=/home/result.yuv 2.yuv转mp4 gst-launch-1.0 filesrc location=/home/source.yuv ! videoparse format=nv12 width=2592 height=2048 framerate=30/1.

weixin_42549534的博客 1349

Gstreamer系列(7):在CMake和Qt工程中链接Gstreamer库

本文介绍了如何CMake和Qt工程中链接Gstreamer库,可直接复制粘贴使用,减少链接库找不到的烦恼。

qq_27897937的博客 1546
上一篇: ARM AArch64 GUN交叉编译工具下载官网
下一篇: ubuntu18 buildroot make xconfig make gconfig faile
shliang310
博客等级 码龄10年 10粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值