
gstreamer
文章平均质量分 58
gstreamer
SleepyPat
化整为零
有的放矢,心无旁骛
展开
-
[GStreamer] gstbasesink 的 chain 函数
chain函数是上一个element到当前element的入口,chain函数处理完毕后,上一个函数的push_buffer 就得以返回。因此通常情况下 parent element 的核心逻辑都在 chain 函数里,再通过再 chain 函数里调用虚函数让 child element 的虚函数实现能够在 parent element 的 chain 函数里表现定制化的功能。原创 2024-12-07 16:57:48 · 201 阅读 · 0 评论 -
[GStreamer] gstappsrc
gstappsrc 可以用作作为多种数据类型的src element,包括音视频直播点播流。原创 2024-11-28 17:18:20 · 263 阅读 · 0 评论 -
[GStreamer] multiqueue
gstreamer 提供了 multiqueue 用来同步多路数据。element 包含多个 queue,每个 queue 都可以自定义容量和阈值等一系列信息,通过这些信息,multiqueue 可以实现对每个 queue 的单独控制,这种控制包括但不限于 是否从上游拉数据,是否把数据推给下游 等等。在多媒体领域里,常常用在 demuxer 之后,用来确保送给 audio 和 video decoder 的数据不会存在过大的 pts 时间差,变相提供一种偏软的音画同步机制。原创 2024-11-27 10:20:23 · 237 阅读 · 0 评论 -
[Gstreamer] 消息处理handler的设置
Gstreamer 提供以 GstMessage 和 GstBus 为基础的消息传递机制,所有GstMessage 发送的时候都需要指定 GstBus 用来明确当前 message 将在哪条 Bus 上流转。所有的 GstMessage 最终都会进入一个handler,这个handler函数可以通过两种方式设置 gst_bus_set_sync_handler 和 gst_bus_add_watch。如果没有设置 handler 函数,那么GstMessage将永远不会被处理,从而造成内存泄漏。原创 2024-06-27 17:24:08 · 339 阅读 · 0 评论 -
[Gstreamer] gstbasesink 里的 jitter
这个值表示当前到达 gstbasesink chain 函数(push mode) 的 GstBuffer 的系统事件 与 这个 buffer 被期望到达的系统时间的差值。jitter 除了被用在配合处理 同步问题外,还被用来处理 qos 问题,比如 qos 的 throttle event type 就需要结合 jitter 的值来进行综合判断。,则表示 GstBuffer 到晚了,当前 GstBuffer 或多或少属于 late了,可能存在被 drop的可能,还需要根据 segment 来做综合判断。原创 2024-06-26 16:12:02 · 279 阅读 · 0 评论 -
[Gstreamer] gstbasesink 的 QOS 机制
gstreamer里很多element都提供 QOS 机制,src,filter 和 sink 都有。Sink element 的 QOS 机制由 gstbasesink 统一提供。原创 2024-06-26 09:54:05 · 307 阅读 · 0 评论 -
[GStreamer] gst_element_link 及 pad 在继承体系中如何存在
pad 是每个 element实例都有的,是 elemenet 之间沟通的代理人,没有 pad 的 element 没法于其他element交流。考虑到gstreamer存在继承体系,那么如果继承类element不在init函数里创建pad,那么在gst_element_link的时候是否可以使用父类element实例的pad呢?下面从源码来找答案。在gstutils.c找到的实现。直接调用同样在gstutils.c,入参为上有element和下游element。实现同样在。原创 2024-05-24 11:49:14 · 843 阅读 · 0 评论 -
[Gstreamer] GstElement
GstElement 是 Gstreamer 的最基础类,几乎所有的 Gstreamer 类都继承于此,它包装了GObject 同时提供了通用能力。原创 2023-11-10 17:45:18 · 154 阅读 · 0 评论 -
[Gstreamer] GstBaseSink 同步逻辑
GstBaseSink 继承自 GstElement , 提供了 preroll,时钟同步,state change 处理,query 和 pad 模式激活流程 等功能,子类只需要再理解GstBaseSink属性使用的基础上实现一些虚函数(共18个)。原创 2023-11-03 16:41:20 · 460 阅读 · 0 评论 -
[GStreamer] 定义并使用多参数信号
***/定义一个信号,叫做cache-info,这个信号传递两个参数,都是 G_TYPE_UINT64 类型。这里的信号处理函数是4个参数,第一个是信号所属的element的实例,最后一个是g_signal_connect时指定传递给信号处理函数的额外入参,中间的参数就是信号的参数,参数个数在定义信号时有指定。原创 2023-10-19 14:26:46 · 222 阅读 · 0 评论 -
[Gstreamer] Linux 下安装(库和源码)
1. 打开 /etc/apt/sources.list , 把所有 deb-src 的条目都放开,即解出注释状态。比如: sudo apt source libgstreamer1.0-0。3. sudo apt source [packagename] 来下载代码到当前目录。2. 使用 sudo apt update 更新仓库。原创 2023-07-05 15:39:36 · 702 阅读 · 0 评论 -
[GStreamer] GObject 和 QObject 相通的地方
GObject 和 QObject 都使用到了 metadata ,所谓的 metadata 就是一个类的 “元属性” ,直白点说就是 “描述这个类的相关属性”,这些属性是本类的固有特性,不因为类实例的不同的改变,从编程的角度来看,类似于 “类的static属性”,不同的地方在于,metadata基本上都是固定不变的一些值,而 static属性大多是可以变化的。GObject是如何实现的?描述一个 GObject类 需要两个 struct ,一个叫 类结构体,一个叫 对象结构体,类结构体内存放原创 2021-11-23 14:42:28 · 294 阅读 · 0 评论 -
[GStreamer] 使用 gst-build 编译 GStreamer 和 plugins
Files · 1.18 · GStreamer / gst-build · GitLabhttps://gitlab.freedesktop.org/gstreamer/gst-build/-/tree/1.18meson --debug --prefix=/ __BUILD_DEBUGninja -C __BUILD_DEBUGmeson install -C __BUILD_DEBUG原创 2022-01-12 17:36:52 · 800 阅读 · 0 评论 -
[GStreamer] Ghost pads
pad是要依附于某个element的,如果两个element分属于不同的Bin,那么这两个element是没办法直接link的。如果希望两个不同Bin里的element能够link,那么需要创建一个Ghost pad,这个pad依附于Bin element,同样地,在另外一个Bin里也创建一个外联的Ghost pad,以此实现两个不同Bin里的element进行link。可以把Ghost pad想象为unix系统的软链接。原创 2021-11-23 15:58:26 · 437 阅读 · 0 评论 -
[GStreamer] Bin Pipeline
Bin 是容器,用来对包含的所有 element 进行生命周期管理状态切换调度Bus message 分发 等。当把 element add 到Bin里时,Bin 就会对其增加以此引用计数,把element 从Bin里移除时也会触发引用计数减少。原创 2021-11-23 14:00:45 · 167 阅读 · 0 评论 -
[GStreamer] State of Element
GST_STATE_NULL: this is the default state. No resources are allocated in this state, so, transitioning to it will free all resources. The element must be in this state when its refcount reaches 0 and it is freed. GST_STATE_READY: in the ready state,..原创 2021-11-23 13:44:55 · 224 阅读 · 0 评论 -
[GStreamer] 插件编写 filter element
源码:ObtFilter.h#pragma once#include <gst/gst.h>#define VERSION "1.0"#define PACKAGE "obtplugin" //mandatary for gst_plugin_descG_BEGIN_DECLS/* property id list*/enum{ PROP_0, PROP_SILENT, PROP_CNT};/* instance struct*/typede原创 2021-12-24 17:26:46 · 1056 阅读 · 0 评论 -
[GStreamer] pipeline中动态替换element
Pipeline manipulationhttps://gstreamer.freedesktop.org/documentation/application-development/advanced/pipeline-manipulation.html?gi-language=c#原创 2021-12-30 18:38:48 · 535 阅读 · 0 评论 -
[GStreamer] GstStructure的用法
GstStructure 是一个键值对结构,每一个GstStructure 都只有一个 key 和一个 value , key 是 GQuark 类型,value 是 GType 类型。/****/};原创 2022-12-14 11:38:53 · 291 阅读 · 0 评论 -
[GStreamer] 插件测试程序
main.c。原创 2021-12-24 17:31:35 · 1779 阅读 · 0 评论 -
[GStreamer] 时钟 和 数据同步
GStreamer提供如下同步服务:非直播的音/视频播放,这种情况下,数据录入速度显著快于播放消耗的速度,这种情况下GStreamer会协调好音频、视频、字幕的同步情况。 录像录音场景下,GStreamer会协调视频录制和音频录制的同步。 流媒体场景下数据源的录入速度慢于播放速度,GStreamer会提供buffering服务。 直播场景下,GStreamer提供一个可配置的延迟服务,这样可以保证直播的流畅,比如采集直播视频流并添加一些后期效果,再推送给播放端。 音视频后期同步,比如实现录制好了原创 2021-11-23 16:31:01 · 2435 阅读 · 0 评论 -
[GStreamer] undefined symbol: gst_push_src_get_type
编写source element的时候发现提示 “undefined symbol: gst_push_src_get_type” , 表面上看就是符号表找不到,那么一定是相应的库没有链接进来,那么就需要知道 gst push src 在哪个包里,通过查询可知 gst_push_src 在 base plugin 里,因此找到 dev 文件。可见如果需要使用 base plugin ,则需要 -lgstbase-1.0 , 因此在我们的cmake里面添加这一个链接选项即可。...原创 2022-08-05 20:13:39 · 645 阅读 · 0 评论 -
[GStreamer] Element的状态
State Description NULL the NULL state or initial state of an element. READY the element is ready to go to PAUSED. PAUSED the element is PAUSED, it is ready to accept and process ...原创 2021-11-24 11:37:24 · 314 阅读 · 0 评论 -
[GStreamer] GLib 中的 GQuark
GQuark 就是一个 uint32 的整型,每一个整形值的背后都有一个字符串,也就是说每个GQuark 和 唯一 一个 字符串对应,这个对应关系和唯一性保障由GLib来负责。为什么要用GQuark?主要是为了弥补枚举类型的不可扩展,和字符串的比较不便利。因此推出一个 “用整形来一 一映射字符串” 的方案。原创 2022-12-14 11:24:21 · 237 阅读 · 0 评论 -
[Glib] GObject 的 dispose 和 finalize 成员函数的各自作用
GObject学习教程---第十一章:GObject 子类对象的析构过程_knowledgebao的博客-优快云博客索引:https://blog.youkuaiyun.com/knowledgebao/article/details/84633798本文是学习学习他人的博客的心得(具体详见“楼主见解”),如果源网站可访问的话,建议直接访问源网站:楼主见解:主要讲解析构为什么需要2个函数来实现。讲解了dispose和finalize的使用场景。析构函数末尾必须调用基类的对应析构函数。James Henstr...ht原创 2021-11-26 15:45:38 · 592 阅读 · 0 评论 -
[GStreamer] 关于segment
gstreamer中的segment是什么?_泰勒朗斯的博客-优快云博客原创 2022-12-07 15:45:43 · 183 阅读 · 0 评论 -
[GStreamer] Bus && Message
Bus 里的 message 有两种被消费的方法:同步轮训,回调通知。原创 2021-11-23 14:28:31 · 613 阅读 · 0 评论 -
[GStreamer] 内存管理
GstMemory:管理一小块实际的虚拟内存 GstBuffer:一个对象,是element、plugin、application互相信息交互的最小数据单位,内部包含GstMemory、时间信息和一些其他信息。 GstMeta:附加在GstBuffer上,用来提供一些描述内存的额外信息。 GstBufferPool:buffer池,但是只能分配尺寸固定的buffer。GstMemory:/** * GstMemory: * @mini_object: parent structure原创 2021-11-25 16:21:01 · 2220 阅读 · 0 评论 -
[GStreamer] 使用meson编译GStreamer(gstreamer core)
refs:meson使用:Command-line commandshttps://mesonbuild.com/Commands.html步骤:1)下载源码 && 解压wget https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.18/gstreamer-1.18.tar.gztar -xvf gstreamer-1.18.tar.gz2)创建构建路径cd gstreamer-原创 2022-01-12 15:34:51 · 1185 阅读 · 0 评论 -
[GStreamer] 插件的名字要和GST_PLUGIN_DEFINE匹配
注意,如果插件的名字时libgst开头的,那么就会从libgst后面的第一个字符开始摘取字符串,然后拼接成gst_plugin_xxx_get_desc函数名称,而这个函数名称的定义是在宏GST_PLUGIN_DEFINE中进行的。另外,如果插件文件时libmyplugin.so,那么GST_PLUGIN_DEFINE的第三个参数就必须是myplugin,因为代码中发现没有libgst开头,而是lib开头,则会从lib后的第一位开始算。...原创 2022-07-28 18:00:19 · 440 阅读 · 0 评论 -
[GStreamer] Element factory metadata for ‘gstmyessrc‘ has no valid long-name field
注意,这里必须转化成 element 类才能使用gst_element_class_set_static_metadata。原创 2022-08-05 20:19:38 · 313 阅读 · 0 评论 -
[GStreamer] 插件编写 source element
Reference :https://gstreamer.freedesktop.org/documentation/plugin-development/advanced/negotiation.html#caps-negotiation-use-caseshttps://gstreamer.freedesktop.org/documentation/plugin-development/advanced/negotiation.html#caps-negotiation-use-casesDi.原创 2021-12-24 17:41:37 · 848 阅读 · 0 评论 -
[GStreamer] 使用meson编译GStreamer(gst-plugin-base)
前言:GStreamer由 gstreamer core 和 plugin 组成,前面已经介绍了如何编译 gstreamer core,本文章介绍编译 gst-plugin-base 插件。方法和步骤和之前类似,参考:[GStreamer] 使用meson编译GStreamer(gstreamer core)_ykun089的博客-优快云博客refs:meson使用:Command-line commandshttps://mesonbuild.com/Commands.html步骤:1)下载源码 &原创 2022-01-12 16:24:16 · 1142 阅读 · 0 评论 -
[GStreamer] GstPad
GstPad:函数指针类型 设置函数 关联的模板函数 描述 GstPadActivateFunction gst_pad_set_activatemode_function gst_pad_set_activatemode_function_full xxx_active() 当前pad从Ready转换到Paused状态时,这个函数被调用。如果不为此函数指定新函数,则会使用默认流程,原创 2021-11-30 16:00:14 · 1556 阅读 · 0 评论 -
[GLib][GStreamer] Glib 对象模型中的 instance struct 和 class struct
每一个 GType 都有两个结构体 :instance struct 和 class struct ,二者的生命周期、实例个数 和 司职都有区别。实例个数:class struct 是所有具备相同 GType 的 GObject 所共享的,只有一个实例,而 instance struct 是每一个 GObject 独享的,有很多实例。生命周期:每个 GObject 的销毁都伴随这一个 instance struct 的销毁,当且仅当所有具备相同 GType 的 GObject 都被销毁时,相原创 2021-12-24 11:10:11 · 490 阅读 · 0 评论 -
[GLib][GStreamer] GType的创建
参考:GObject – 2.0https://docs.gtk.org/gobject/?q=G_DEFINE_TYPEG_DEFINE_TYPE 做了什么?以 G_DEFINE_TYPE(GstMyFilter, gst_my_filter, GST_TYPE_ELEMENT); 为例1.声明了如下几个static函数static void gst_my_filter_init (GstMyFilter *self);sta...原创 2021-12-21 16:16:08 · 488 阅读 · 0 评论 -
[GStreamer] pad 的模式
GSreamer不要求。原创 2021-12-08 09:26:46 · 124 阅读 · 0 评论 -
[Linux使用] Linux下定位GStreamer插件及element的方法
使用 rpm -qf 可以根据so文件查找所属的rpm包,当知道GStreamer的plugin文件时,可以用此命令反向查找rpm包。 使用 rpm -ql 可以查看rpm包中包含哪些文件,当知道GStreamer的插件安装包时,可以用次命令查看rpm包中有哪些插件so。 如果知道任意一个so文件名,可先使用 rpm -qf 找到 所属rpm包,再使用rpm -ql 找到所有so文件名。 使用 gst-inspect-1.0 --plugin xxx.so 可罗列所有 element...原创 2021-11-17 11:24:34 · 1393 阅读 · 0 评论 -
[gstreamer] 关于GstBuffer的refcount
2)由于 gst_buffer_new_xxx 系列函数返回的是指针,因此当指针离开作用域时不会导致底层的 GstBuffer 被销毁,仅仅是指针被销毁,所以真正的 GstBuffer 实例不会受影响, 这一点非常重要。3)gst_buffer_ref 会增加一个计数,gst_buffer_unref 会减少一个计数,一般情况下,在一个函数里,ref 和 unref 要对称。4)要注意是否有些函数会隐式改变计数,在使用函数之前要先看下函数注释,如果有隐式的计数操作,那么在离开作用域的时候要记得补偿计数。原创 2022-11-10 16:38:42 · 466 阅读 · 0 评论 -
[GStreamer] 媒体类型对照表
GStreamer是一个数据处理管线,因此各个element需要互相知晓peer传递给自己数据的类型,这个过程通常发生在阶段。因此要求peer互相只有有一套公认的数据类型集合。GStreamer已经提供了一套尽可能详细的数据类型表,这个表里的数据类型能覆盖目前近乎所有的应用场景。因此我们在进行pad注册并指定pad数据类型的时候可以参考这个表。原创 2021-11-24 10:11:10 · 306 阅读 · 0 评论