深入浅出gstreamer开发

article/2025/11/8 2:18:27

Gstreamer解决什么问题?

上层接口和应用方式的 相对稳定 与底层接口、平台环境的 多样化 。例如: codec 不同种类不同实现,音视频处理不同,硬件输入、输出、采集播放不同,芯片不同,操作系统不同。
通用组件不灵活与需求的多变。色彩空间转换、缩放、编解码等组件功能是单一的。通过对这些组件进行组合,就可以满足多变的需求。要想拥有模块性、可移植性和通用的功能,通常是以极高的复杂性为代价。
计算机系统的万能解决办法: 加一层!
Gstreamer 媒体控制程序作为 中间件 ,它可以解析上层指令,并对底层进行控制。

Gstreamer基础

所有的 gstreamer 应用都是基于 gobject 的。
除了理解封装、继承、多态的模拟以外,理解 this 指针, vtable 的实现原理也很有帮助。
参照下图理解 gobject 对象。
深入浅出Gstreamer基础概念
是一个管道化多媒体框架。管道的属性 : 包含一系列不同功能的链接起来的元件以及元件之间的数据流动;管道的行为:包含一系列多媒体操作,如元件链接等。
一个元件,由时钟、衬垫、总线、状态等组成。
衬垫( pad )一个元件与外界通信的接口。
互相链接的元件构成一个箱柜 (BIN) BIN 作为一个整体,本身也可被认为是一个元件。
管道 (pipeline) 是一个特殊的 bin ,是最高级别的 bin
每一个 pipeline 都有一个默认的总线,该总线会在一个 mainloop 里去检查消息,并触发相应你的 callback ,实现与应用程序的通信。 Bus 含一个队列,每次 post 一个消息就加到队列里,然后出发 maincontext wakeup。 这样就完成了将消息路由到 maincontext 去了。因为 maincontext 等待的有这个 bus 队列。
Caps 代表一个媒体文件的能力,通常包括该文件的 mime 类型和多媒体属性。
bin 是一个装载元素集合的容器。管道是特殊的 bin 类型,允许执行其中的所有子元素。由于 bin 本身是元素子类( subclass ),通常可以像控制元素一样控制 bin ,从而简化应用程序。比如,可以通过改变 bin 本身的状态改变 bin 中所有元素的状态。 bin 还可以转发来自 bin 中的子元素的总线( bus )消息(例如错误消息,标签消息和 EOS 消息)。
管道是顶级 bin 。将它的状态设置为暂停( PAUSED )或播放( PLAYING )时,则数据流启动,媒体处理开始。启动后,管道将在一个单独的线程中运行,直到被停止或数据流结束。 数据流动是以缓冲传递来实际工作的。 Buffer 可以看成是一种容器,里边含 data events
事件是一种控制数据,能够在管道中上下流动。一般来说,上游的控制命令可能是真的在控制什么,来自下游的 events 可能大多数是些状态通知之类的
元件状态
NULL :默认状态,内部会释放单元的所有资源,其实就是初始状态。
READY :就绪状态,分配资源,打开设备。但是流不会打开,所以此时流信息都是零。如果之前打开了流,在这状态中将会被关闭,流信息都会被重设。
PAUSED :已经打开了流,但是暂时不处理它。这个时候可以去修改例如 seek 位置等流信息。时间轴停止
PLAYING :时间轴运行。设置为这个状态后,整个流程就开始启动了。内部会将消息发送从管道所在的线程转移到应用程序线程
抓住gstreamer核心

    Gstreamer Core,是gstreamer框架的骨干和核心。它提供的功能有

()提供一些组件类型的基类的实现,以及这些组件之间的通信规则;

()提供给应用程序创建媒体实例的API,以及保证实例运行的各种机API.

    Gstreamer  Core的本质是不在乎媒体文件是什么类型或什么格式的(media-agnostic),因为它不关心媒体编解码等具体细节。可以认为它是一个最高级的管理者和组织者,它提供了一个流媒体程序框架或者叫做蓝图,下属人员可以通过领会它的旨意去具体开展工作;你也可以理解它为一个服务供应商,提供了一切多媒体应用程序可能需要的元件,开发人员可以利用它来去实现自己的专属程序。Gstreamer在初始化时只注册了核心元件,包括binpipeline,用户需要以此为基础,实现自己的多样化的多媒体管道程序。多媒体应用程序的实现,需要用户自己利用好gstreamer,然后实现自己的东东。

插件如何管理
 
把握core/plugin的重要联系
 
Core/ plugin 是不同的模块。他们的存在都是为特定的多媒体控制程序服务的。特定的 Plugin 主要由媒体控制开发者提供,而 core 是所有基于 gstreamer 程序的共同体。
Core 里用到的每个 element 实际就是一个插件,在 gst 中得到组装成一个 pipeline ,数据从源单元流向目的单元,完成整个流程。单元间是可以链接起来的(必须得链接起来以组成 pipeline .
应用程序通过 core 使用 factory_make gst_object_unref 函数来创建及释放元件。 make 需要两个参数,一个是工厂名,一个是单元名。工厂名实际就是插件名,所以需要先加载插件上来,才能创建对应的元件。作为工厂(插件),其功能还不仅限于创建元件,一个工厂有属性,它知道自己能创建怎样的元件。
 
Gstreamer核心类图
Gstreamer插件相关类图分析(可参考我上一篇文章)
Pipeline工作时序图
 
 
 

Smith先生版权所有,如需转载,请注明出处:http://blog.csdn.net/acs713/article/details/7777946

否者,保留追究其法律责任的权利

http://chatgpt.dhexx.cn/article/a9R1y5x6.shtml

相关文章

【GStreamer 】3-1 gstreamer插件之 videotestsrc 介绍

目录 ​编辑 1、简介 2、videotestsrc 3、videotestsrc 不同pattern参数测试罗列 3.1 (0): smpte - SMPTE 100% color bars 3.2 (1): snow - Random (television snow) 3.3 (2): black - 100% Black ​编辑 3.4 checkers 方块 ​编辑 3.5 几何图形 4、videotestsrc…

Gstreamer概述

1、什么是GStreamer GStreamer 是用来构建流媒体应用的开源多媒体框架(framework),其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了DirectShow的设计思想。其目标是要简化音/视频应用程序的开发,已经能够被用来处理像 M…

gstreamer简介

常用 gchar * caps_string gst_caps_to_string (new_selected_caps); g_free (caps_string); 需要弄懂的问题 tunnel tee queue 最后列一下Gstreamer中常见的时间宏,注意Gstreamer中的时间单位是:纳秒 #define G_USEC_PER_SEC 1000000 #define GST_S…

Gstreamer基础知识介绍

由于deepstream是基于gstreamer的,所以要想在deepstream上做拓展,需要对gstreamer有一定的认识。以下主要介绍Gstreamer整体框架和Gstreamer基础概念。 一、Gstreamer整体框架 gstreamer是一个用于开发流式多媒体应用的开源框架。本身这个框架是为了更…

【GStreamer 】1-扫盲介绍

从历史的角度来看,Linux 在多媒体方面已经远远落后于其它的操作系统。微软的Windows和苹果的MacOS它们对多媒体设备、多媒体创作、播放和实时处理等方面已经有了很好的支持。另一方面,Linux对多媒体应用的综合贡献比较少,这也使得Linux很难在…

详细的GStreamer开发教程

详细的GStreamer开发教程 文章目录 详细的GStreamer开发教程1. 什么是GStreamer?2. GStreamer架构2.1 Media Applications2.2 Core Framework2.3 Plugins 3. GStreamer组件3.1 Element创建一个 GstElement 3.2 箱柜(bin)元件的状态 3.3 衬垫&…

gstreamer(一)入门和概述

一.概述 在音视频领域接触最多实现的方案通常是通过ffmpeg(PC和sever端居多)或者硬件厂家的的SDK实现特定硬件的编解码功能(机顶盒,电视等嵌入式设备)。这里我们介绍一个在国内不太常用的解决方案----gstr…

二、什么是GStreamer

GStreamer是一个用于创建流媒体应用程序的框架。基本的设计来自俄勒冈研究生院的视频管道,还有一些来自DirectShow的想法。 GStreamer的开发框架使编写任何类型的流媒体应用程序成为可能。GStreamer框架旨在使编写处理音频或视频或两者同时处理的应用程序变得容易。…

Gstreamer 应用开发:1-基础介绍

我们之前的系列,正式的介绍了Gstreamer,并且围绕如何使用USB相机推流实现RTSP服务器来做了介绍,并在Jeston TX1 平台上做了优化急速的一些探索。 今天我们开始围绕如何用命令实现一个音视频混合,或者单独的音频,和单独…

【gstreamer】入门介绍

概述 GStreamer是一个基于流媒体的框架,是一个开放源代码的多媒体框架,用于创建音频和视频处理应用程序。它是一个运行在多个操作系统上的跨平台框架,支持多种不同的多媒体格式。 GStreamer框架的核心是基于插件的体系结构,插件…

Gstreamer基础讲解

Gstreamer讲解 文章目录 Gstreamer讲解基础背景小结 元件(Element)衬垫(Pads)Gstreamer的面向对象Gstreamer的多线程 实用工具Gstreamer常用插件介绍gstreamer工程记录关于YUV的补充知识 基础 背景 ​ 从历史的角度来看,Linux在多媒体方面已…

Gstreamer 简介

转载自:John.Leng - 博客园http://www.cnblogs.com/xleng/ 什么是Gstreamer? Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline&#xff0…

微博视频怎么下载?微博视频下载和保存工具

本文转载自:怎么下载微博视频 ​​​微博视频怎么下载?当你刷微博看到自己特别喜欢的视频时,除了转发该视频到自己的微博外,你可能还想把这个微博视频保存到自己电脑或者手机中,那应该怎么实现weibo视频的下载呢&#…

GitHub 标星 120K+!这些神器仅需一行代码即可下载全网视频!

大家好,我是 JackTian。 今天这篇文章的内容对于经常浏览各大视频网站的同学来说,是一大神器工具。当你看到自己目前所需的视频时想尽各种办法保存至本地,方便后期再次回看。恰巧有些视频可能需要会员才能够下载,有些第三方的视频…

那些你可能不知道的视频下载奇技淫巧

之前已经写过好几篇的奇技淫巧系列了,今天说说怎么快速下载视频。 我平常经常看视频的网站就是爱奇艺,b站,微博,知乎,网易这些。 这里以微博为例,下载周杰伦的《晴天》,微博地址是 https://w…

部分主流视频网站下载方法

如果在微博或其他视频网站上看到非常喜欢的视频,想下载下来,但是又苦于不知如何下载。 这里我推荐一个网站,支持主流的86视频网站(发表博客时)的视频下载。 主流视频网站(16): 搜狐视频 乐视网 酷6网 56…

快手火山抖音视频怎么快速去重消重和去水印秒拍视频批量采集下载怎么快速去重消重去水印视频批量采...

快手火山抖音视频怎么快速去重消重和去水印 秒拍视频批量采集下载 怎么快速去重消重去水印 视频批量采集下载软件,怎么找到视频批量采集下载软件 趣头条今日头条等自媒体视频批量采集下载软件有哪些? 大鱼号视频批量采集下载去重消重去水印软件 视频怎么…

硕鼠——前些年很好用的视频下载神器

前言 首先解释一下为什么要说是前几年。因为它太好用,知道的人越来越多,导致引起了视频平台的注意,以版权为由禁止自己的视频从硕鼠下载。这里推荐小众软件Annie,在我的另一篇中有介绍,传送门。 官方网站 http://w…

网页保存视频最有效的几种方法

最近朋友问我了这样的问题: 如何才能把网络上的视频下载下来当做课堂资料播放呢? 的确,这个问题也困过我: 想要下载视频作为课件素材播放: 在微博收藏了许多有关「技能学习」的视频,但等到想看的时候发…

性能比肩美拍秒拍的Android视频录制编辑特效解决方案

前言 众所周知,Android平台开发分为Java层和C层,即Android SDK和Android NDK。常规产品功能只需要涉及到Java层即可,除非特殊需要是不需要引入NDK的。但如果是进行音视频开发呢? Android系统Java层API对音视频的支持在MediaCode…