GStreamer学习5----probe数据探测
参考资料:
gstreamer中如何使用probe(探针)获取帧数据_gstreamer 视频编码时获取视频关键帧信息-CSDN博客
Gstreamer中可以使用AppSink作为一个分支来查看管线中的数据,还可以使用probe去处理。
在GStreamer中,probe是一种强大的机制,用于在管道(pipeline)的不同点上检查、修改或拦截数据流。当数据流经管道中的元素时,probe允许开发者在特定的pad(输入或输出端口)上设置监听器,从而可以捕获或处理正在通过的数据。
GStreamer提供了几种不同类型的probe:
-
Buffer Probe (
GST_PAD_PROBE_TYPE_BUFFER): 这是最常见的类型,它会在缓冲区(buffer)到达指定pad时被触发。缓冲区通常包含了一帧音频或视频数据。 -
Event Probe (
GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM或GST_PAD_PROBE_TYPE_EVENT_UPSTREAM): 这种probe会在事件(event)通过pad时触发。事件可以是各种各样的信号,如标记(mark)、缓冲区开始(buffer start)或结束(buffer end)等。 -
Block Probe (
GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM或GST_PAD_PROBE_TYPE_BLOCK_UPSTREAM): 这种probe可以阻止数据流,直到回调函数返回一个非阻塞的状态。 -
Latency Probe (
GST_PAD_PROBE_TYPE_LATENCY): 这种probe用于测量数据从进入管道到离开管道所花费的时间。 -
Buffer List Probe (
GST_PAD_PROBE_TYPE_BUFFER_LIST): 类似于Buffer Probe,但可以处理多个连续的缓冲区。
为了在GStreamer中添加probe,你需要调用gst_pad_add_probe()函数,传入你想要监控的pad以及一个回调函数,当probe被触发时将执行此回调。回调函数的原型通常如下:
C
深色版本
1gboolean probe_callback (GstPad *pad,
2 GstPadProbeInfo *info,
3 gpointer user_data);
在回调函数中,你可以访问和操作GstPadProbeInfo结构,这包含了触发probe的数据(如缓冲区或事件)。你可以选择是否让数据继续通过管道,或者修改数据并让它通过,甚至完全阻止数据。
例如,一个简单的Buffer Probe回调函数可能如下所示:
C
深色版本
1static GstPadProbeReturn
2cb_have_data (GstPad *pad,
3 GstPadProbeInfo *info,
4 gpointer data)
5{
6 GstBuffer *buf;
7
8 /* Cast the info to a buffer probe info */
9 buf = GST_PAD_PROBE_INFO_BUFFER (info);
10
11 /* Do something with the buffer here... */
12
13 /* Let the buffer pass through */
14 return GST_PAD_PROBE_OK;
15}
通过使用probe,开发者可以在不打断数据流的情况下进行调试、性能分析或实时数据处理,这在开发复杂的流媒体应用程序时非常有用。
一个例子
添加probe
//date probe
GstPad* pad = gst_element_get_static_pad(videosink, "sink");
gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER,
(GstPadProbeCallback)cb_have_data, NULL, NULL);
gst_object_unref(pad);
回调方法
static GstPadProbeReturn
cb_have_data(GstPad* pad,
GstPadProbeInfo* info,
gpointer user_data) {
GstBuffer* buffer = NULL;
GstMapInfo map_info;
GstStructure* s;
gint width, height; //图片的尺寸
GstCaps* sink_caps = gst_pad_get_current_caps(pad);
s = gst_caps_get_structure(sink_caps, 0);
gboolean res;
res = gst_structure_get_int(s, "width", &width); //获取图片的宽
res |= gst_structure_get_int(s, "height", &height); //获取图片的高
if (!res) {
g_print("gst_structure_get_int fail\n");
return GST_PAD_PROBE_DROP;
}
g_print("width=%d, height=%d \n", width, height);
return GST_PAD_PROBE_OK;
}
完整例子
static GstPadProbeReturn
cb_have_data(GstPad* pad,GstPadProbeInfo* info,gpointer user_data) {GstBuffer* buffer = NULL;GstMapInfo map_info;GstStructure* s;gint width, height; //图片的尺寸GstCaps* sink_caps = gst_pad_get_current_caps(pad);s = gst_caps_get_structure(sink_caps, 0);gboolean res;res = gst_structure_get_int(s, "width", &width); //获取图片的宽res |= gst_structure_get_int(s, "height", &height); //获取图片的高if (!res) {g_print("gst_structure_get_int fail\n");return GST_PAD_PROBE_DROP;}g_print("width=%d, height=%d \n", width, height);return GST_PAD_PROBE_OK;
}
从打印结果中,可以看到,回调方法被调用了

相关文章:
GStreamer学习5----probe数据探测
参考资料: gstreamer中如何使用probe(探针)获取帧数据_gstreamer 视频编码时获取视频关键帧信息-CSDN博客 Gstreamer中可以使用AppSink作为一个分支来查看管线中的数据,还可以使用probe去处理。 在GStreamer中,probe…...
Open3D 点云的圆柱形邻域搜索
目录 一、概述 1.1原理 1.2应用 二、代码实现 2.1完整代码 2.2程序说明 三、实现效果 3.1原始点云 3.2搜索后点云 一、概述 1.1原理 圆柱邻域搜索的基本思想是确定点云中的哪些点位于给定圆柱的内部。一个圆柱可以由以下几个参数定义: 中心点:…...
python如何设计窗口
PyQt是一个基于Qt的接口包,可以直接拖拽控件设计UI界面,下面我简单介绍一下这个包的安装和使用,感兴趣的朋友可以自己尝试一下: 1、首先,安装PyQt模块,这个直接在cmd窗口输入命令“pip install pyqt5”就行…...
C语言获取当前时间
一共有两段代码,一个是获取当前时间,一个是获取到现在的总毫秒数 求关注😄 互粉必回 获取当前时间 #include <stdio.h> #include <time.h> int main() { time_t rawtime; struct tm * timeinfo; char buffer[20]; // 获取当前…...
【每日一练】python三目运算符的用法
""" 三目运算符与基础运算的对比 """ a 1 b 2#1.基础if运算判断写法: if a > b:print("基础判断输出:a大于b") else:print("基础判断输出: a不大于b")#2.三目运算法判断:…...
CentOS 7.9 停止维护(2024-6-30)后可用在线yum源 —— 筑梦之路
众所周知,centos 7 在2024年6月30日,生命周期结束,官方不再进行支持维护,而很多环境一时之间无法完全更新替换操作系统,因此对于yum源还是需要的,特别是对于互联网环境来说,在线yum源使用方便很…...
Git 常用命令备忘
1、删除 (1)、git push origin --delete dev 删除远程分支 (2)、git branch -d dev 删除本地分支 git branch -D dev 强制删除本地分支 2、创建分支 (1)、git checkout -b dev 创建本地分支 (2)、git push origin dev 创建远程分支,此时本地分支与远程…...
Ubuntu24.04安装Skynet环境
安装依赖 sudo apt-get -y install gcc sudo apt-get -y install g sudo apt-get -y install make sudo apt-get install -y autoconf automake libtool sudo apt-get install -y git 或者可以用: sudo apt-get -y install gcc g make autoconf automake libtool…...
【C++】cout.self()函数
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文作为 JohnKi 学习笔记,借鉴了部分大佬案例 📢未来很长&#…...
VueQuill 富文本编辑器技术文档快速上手
VueQuill 富文本编辑器技术文档 1. 安装 VueQuill2. 配置 VueQuill3. 在组件中使用 VueQuill4. 配置选项5. 事件处理6. 数据格式7. 自定义工具栏8. 示例项目结构9. 常见问题如何添加图片上传功能?如何自定义编辑器主题? 在此之前,我讲解过关于…...
链式二叉树oj题
1.输入k ,找第k层节点个数 int TreeKlevel(BTNode*root,int k) {if (root NULL) {return 0;}if (k 1) {return 1;}return TreeKlevel(root->left, k - 1)TreeKlevel(root->right, k - 1); } 在这里我们要确定递归子问题,第一个就是NULL时返回&…...
Curator 是一个开源工具为 Elasticsearch 集群设计,用于自动化索引的维护任务。
Elasticsearch 使用 Curator 进行索引生命周期管理是一种常见的做法,Curator 是一个开源的 Python 工具,专为 Elasticsearch 集群设计,用于自动化索引的维护任务。以下是使用 Curator 进行索引生命周期管理的一些关键步骤和概念: …...
STM32-PWR和WDG看门狗
本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. PWR1.1 PWR简介1.2 电源框图1.3 上电复位和掉电复位1.4 可编程电压监测器1.5 低功耗模式1.6 模式选择1.7 睡眠模式1.8 停止模式1.9 待机模式1.10 库函数 2. WDG看门狗2.1 WDG简介2.2 IWDG框图2.3 IWDG键寄存器2.4 …...
C++循环队列 经典示例
循环队列(Circular Queue),又称环形缓冲区,是一种常用的数据结构,特别适用于资源有限的场合,比如操作系统中的任务调度、网络数据缓冲等。循环队列在数组的基础上实现,逻辑上首尾相连࿰…...
【程序大侠传】大表分库分表切换数据库类型导致pagehelper生成sql语法报错
前序 代码剑宗等级分明,其门下弟子等级划分如下: 入门弟子 刚刚拜入代码剑宗,学习基础编程语言和基本剑法(语法和基础概念)。他们的代码还显得生涩,但已经开始展现出对优雅代码的追求。 江湖小虾 初步掌握…...
7、Redis 队列与 Stream
引言 Redis 自 5.0 版本起引入了一种新的数据结构——Stream。这种数据结构不仅增加了 Redis 的数据处理能力,还使其在消息队列和数据流处理方面更具竞争力。Stream 提供了持久化、多播、消费组等功能,可以满足多种复杂的数据处理需求。 1. Redis Stre…...
FFT剖析
快速傅里叶变换 (fast Fourier transform) xn{x0,x1,…xn-1} (num:N) 旋转因子系数: d2pik/N 旋转因子 wk(n)(cos(dn)isin(dn)) n[0,N-1] y(k) sum(x(n)wk(n),0,N-1) y(k){y(0),y(1),…y(N-1)} 傅里叶级数 x(n)wk(n)的级数是: 1.d2pik/N 这个系数决…...
git clone报错RPC failed; curl 92 HTTP/2 stream 7 was not closed cleanly
问题描述 git clone github上的项目报错: RPC failed; curl 92 HTTP/2 stream 7 was not closed cleanly: CANCEL (err 8) 4796 bytes of body are still expected fetch-pack: unexpected disconnect while reading sideband packet early EOF fetch-pack: invalid index-pac…...
Apispec,一个用于生成 OpenAPI(Swagger)规范的 Python 库
目录 01什么是 Apispec? 为什么选择 Apispec? 安装与配置 02Apispec 的基本用法 生成简单的 API 文档 1、创建 Apispec 实例 2、定义 API 路由和视图 3、添加路径到 Apispec 集成 Flask 和 Apispec 1、安装…...
SpringBoot 自定义异常返回数据格式
Spring Boot 默认异常处理 当我们用 spring boot 开发接口是,当遇到异常时返回的数据格式是如下形式的 {"timestamp": "2024-07-06T02:48:55.79100:00","status": 404,"error": "Not Found","path":…...
CSS 变量进阶:动态主题与复杂动画
CSS 变量进阶:动态主题与复杂动画从基础到高级,掌握 CSS 变量的全部潜能。一、CSS 变量的强大之处 作为一名把 CSS 视为流动韵律的 UI 匠人,我深知 CSS 变量的革命性意义。它们不仅让样式代码更易维护,还开启了动态主题、复杂动画…...
双buck电路并联(VDCM控制+下垂控制) 变换器并联控制方案中,下垂控制是一种经典的控制策略
双buck电路并联(VDCM控制下垂控制) 变换器并联控制方案中,下垂控制是一种经典的控制策略,但下垂控制因缺少传统电机的阻尼和旋转惯量以及励磁暂态特性,因此在负载功率变化时,输出电压更容易受到影响 随着交…...
Halcon局部可变形匹配实战:用‘垫片’案例手把手教你搞定弹性物体定位与缺陷检测
Halcon局部可变形匹配实战:弹性物体定位与缺陷检测全流程解析 在工业视觉检测领域,弹性零件的精准定位一直是工程师面临的棘手难题。想象一下,当您面对一批因冲压工艺差异导致厚度不均的橡胶垫片,或是装配过程中发生拉伸变形的金属…...
商道融绿ESG评级实战指南:从数据获取到企业绿色转型效果验证
商道融绿ESG评级实战指南:从数据获取到企业绿色转型效果验证 当某制造业上市公司ESG负责人张总监第一次向董事会汇报绿色转型方案时,遭遇的质疑声至今记忆犹新:"这些环保投入真能带来实际效益吗?"直到他们运用商道融绿E…...
Anaconda误删预防体系建设:自动化备份脚本与版本控制策略题
Anaconda误删预防体系建设:自动化备份脚本与版本控制策略题 昨天实验室又出事了。同事在清理服务器时顺手把整个/opt/anaconda3给删了,理由是“看着像临时文件夹”。三个项目的环境全挂,依赖冲突排查到半夜。这种剧情每隔几个月就上演一次&am…...
整流器模型预测控制mpc仿真三相三电平npc型整流器有限集模 整流器模型预测控制mpc仿真三相...
整流器模型预测控制mpc仿真三相三电平npc型整流器有限集模整流器模型预测控制mpc仿真三相三电平npc型整流器有限集模型预测控制fcs-mps,控制目标为跟踪电流和中点电位平衡,有参考文献文章:标题:整流器模型预测控制(MPC…...
别再乱用ROS2的QoS了!深入DDS底层,搞懂Reliability和Deadline到底怎么选
别再乱用ROS2的QoS了!深入DDS底层,搞懂Reliability和Deadline到底怎么选 在机器人系统开发中,数据传输的实时性和可靠性往往是一对难以调和的矛盾。当你的ROS2节点在复杂网络环境中频繁丢包,或者关键控制指令无法及时送达时&…...
告别重复造轮子:用快马平台高效生成Touchgal手势业务模块
告别重复造轮子:用快马平台高效生成Touchgal手势业务模块 在电商项目开发中,商品详情页的手势交互一直是提升用户体验的关键环节。最近在做一个移动端电商项目时,我需要为商品详情页实现完整的手势操作功能,包括图片缩放、滑动切…...
用 Laravel AI SDK 构建多智能体工作流
Anthropic 之前发布过一篇广泛传播的文章《Building Effective Agents》,系统总结了构建生产级 AI 系统时最实用的几种模式。这些模式的共同点是:都已经在真实场景中被反复验证,实践性强,而且采用范围很广。对 Laravel 开发者来说…...
GREAT-PVT周跳探测算法:从MW组合到电离层延迟处理的代码逻辑剖析
1. GREAT-PVT周跳探测算法概述 周跳探测是卫星导航定位中的关键技术难题。简单来说,当卫星信号被遮挡或干扰时,接收机可能会丢失对载波相位的连续跟踪,导致相位观测值出现整数倍的跳变,这种现象就称为周跳。打个比方,就…...
