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

基于51单片机的通讯聊天系统

通过编写51单片机通讯聊天程序,掌握51单片机的各个模块的知识点和运用C语言编写51单片机的能力。用51单片机与口袋开发板设计实现一个单片机与电脑串口助手实现通讯功能的程序。程序的主要功能如下: 1 OLED初始化显示Welcome to Bluetooth communication! 字符串。 2 程序开始时处于接收信息模式, 电脑串口助手发送信息时,将从初始化字符第一个开始显示,电脑串口助手发送信息后,蜂鸣器响铃2秒左右。 3 每次同时按下左右键时,可以轮流切换接收/发送信息模式 4 在发送信息模式时

m0_47419053的博客 3640

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

Gstreamer

zhibing_ding的博客 2417

Python对接海康威视机器视觉工业相机

工业相机只允许单条连接,也就是说MVS如果连接了相机,python代码就无法获取数据,此时必须。相机工具类(读者直接复制)HKCamera_class.py。博主这里出现了一个警告:获取不到相机参数。四、使用Pycharm打开Python代码示例文件夹。三、找到MVS示例代码(代码在MVS的安装位置)二、解压并安装MVS客户端。一、下载MVS客户端。安装一下opencv。

Good Luck 2万+

gstreamer系列 -- 获取媒体信息

gstreamer系列 -- 获取媒体信息

智能机器人产学研基地 443

量化实战:如何用Barra多因子模型给你的投资组合做一次‘风险体检’?

本文详细介绍了如何利用Barra多因子模型对投资组合进行全面的风险体检,帮助投资者识别行业和风格因子的风险暴露。通过实战案例和Python代码示例,展示了数据采集、风险归因和组合优化的完整流程,提升投资组合的风险调整收益。

weixin_27215337的博客 324

csp-j/s

CSP-J/S 是中国计算机学会(CCF)主办的 ‌‌(Certified Software Professional Junior/Senior),是信息学奥赛(NOI)体系的入门级选拔考试,也是国内最具权威性的青少年编程能力认证之一。

gxyxxrYYDS的博客 2030

【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

别让PEX和后仿真拖后腿:Calibre与Virtuoso ADE联调的那些‘坑’与最佳实践

本文深入探讨了Calibre与Virtuoso ADE在PEX寄生参数提取和后仿真联调中的常见问题与解决方案。针对DRC/LVS验证通过后出现的网表导入错误和仿真波形异常,提供了七大典型场景的实战经验,包括PEX提取模式选择、CalibreView生成细节、环境变量配置等关键环节的最佳实践,助力工程师高效完成芯片设计验证。

weixin_33695450的博客 393

【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

OPTISYSTEM实战指南:线性调频连续波激光雷达系统仿真设计

本文提供了一份基于OPTISYSTEM软件的线性调频连续波激光雷达系统仿真实战指南。文章详细阐述了从软件界面熟悉、核心参数设置,到发射端、信道模型、相干接收端完整系统搭建的全过程,并介绍了性能优化与高级仿真技巧,旨在帮助读者快速掌握利用OPTISYSTEM进行低成本、高效率激光雷达系统设计与验证的方法。

weixin_29288313的博客 297

深入理解 ABAP 中的 Fast Data Access:从 @itab 到 FOR ALL ENTRIES 的性能关键路径

ABAP性能优化的关键在于理解Fast Data Access(FDA)机制,它连接了应用服务器的内表与数据库运算。FDA允许将内表数据推送到数据库进行筛选、聚合等操作,是SELECT...FROM@itab语法的基础。开发者需注意:1)该语法可能在内置引擎或数据库执行;2)仅当SQL能力超出ABAP范围时才建议使用;3)需通过CL_ABAP_DBFEATURES检查数据库支持情况。合理使用FDA可优化批量数据处理,但滥用可能导致性能下降。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1270

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

GStreamer系列-基础概念

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

嵌入式Hacker 1525

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

linux下gstreamer一键安装指令

qq_27897937的博客 3846

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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、付费专栏及课程。

余额充值