GStreamer学习5----probe数据探测

参考资料:

gstreamer中如何使用probe(探针)获取帧数据_gstreamer 视频编码时获取视频关键帧信息-CSDN博客

Gstreamer中可以使用AppSink作为一个分支来查看管线中的数据,还可以使用probe去处理。

在GStreamer中,probe是一种强大的机制,用于在管道(pipeline)的不同点上检查、修改或拦截数据流。当数据流经管道中的元素时,probe允许开发者在特定的pad(输入或输出端口)上设置监听器,从而可以捕获或处理正在通过的数据。

GStreamer提供了几种不同类型的probe:

  1. Buffer Probe (GST_PAD_PROBE_TYPE_BUFFER): 这是最常见的类型,它会在缓冲区(buffer)到达指定pad时被触发。缓冲区通常包含了一帧音频或视频数据。

  2. Event Probe (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAMGST_PAD_PROBE_TYPE_EVENT_UPSTREAM): 这种probe会在事件(event)通过pad时触发。事件可以是各种各样的信号,如标记(mark)、缓冲区开始(buffer start)或结束(buffer end)等。

  3. Block Probe (GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAMGST_PAD_PROBE_TYPE_BLOCK_UPSTREAM): 这种probe可以阻止数据流,直到回调函数返回一个非阻塞的状态。

  4. Latency Probe (GST_PAD_PROBE_TYPE_LATENCY): 这种probe用于测量数据从进入管道到离开管道所花费的时间。

  5. 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;
}

从打印结果中,可以看到,回调方法被调用了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/42415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LayerNorm Plugin的使用与说明

目录 前言0. 简述1. Layernorm Plugin的使用1.1 源码下载1.2 模型下载和修改1.3 环境配置1.4 编译1.4 engine生成和执行(trtexec)1.5 enging生成和执行(C API) 2. 补充说明2.1 RTMO显存占用问题2.2 插件找不到的说明2.3 LayerNorm plugin封装的尝试2.4 layerNorm plugin核函数实…

拉曼光谱入门:3.拉曼光谱的特征参数与定量定性分析策略

1.特征参数 1.1 退偏振率 退偏振率(p)是一个衡量拉曼散射光偏振状态的参数,它描述了拉曼散射光的偏振方向与入射光偏振方向之间的关系。退偏振率定义为垂直偏振方向的拉曼散射强度与平行偏振方向的拉曼散射强度之比。退偏振率(p&…

禁用windows的语音识别快捷键win+ctrl+s

win11组合键winctrls会弹出语音识别提示,即使到设置里禁用了语音识别也没用 解决办法:安装PowerToys,通过“键盘管理器”-“重新映射快捷键”禁用 PowerToys是微软自己的工具,不用担心安全问题,下载地址:h…

系统设计题-简易数据库系统

一、设计一个简易数据库系统,包含create,insert,select三个指令。 create(int tableId,int colNum,String key):创建表,其id为tableId,如果该表已存在,则不做任何处理。colNum为表中列的数量&a…

洛谷 P3008 [USACO11JAN] Roads and Planes G

题意 有一张 n n n 点 ( m 1 m 2 ) (m_1m_2) (m1​m2​) 边的无向图,其中 m 1 m_1 m1​ 条为无向边,另外 m 2 m_2 m2​ 条为有向边, 无向边的边权可以为负。求 s s s 到其他每个点的最短路。 思路 使用 SPFA 会 T 掉一两个点&#x…

第10章:网络与信息安全

目录 第10章:网络与信息安全 网络概述 计算机网络概念 计算机网络的分类 网络的拓扑结构 ISO/OSI网络体系结构 网络互联硬件 物理层互联设备 数据链路层互联设备 网络层互联设备 应用层互联设备 网络的协议与标准 网络标准 TCP/IP协议族 网络接口层协…

GCC扩展功能、函数,预处理命令

文章目录 前言一、GCC C语言扩展声明函数属性变量属性内敛汇编与原子操作相关的内建函数内存模型感知原子操作的内置函数使用溢出检查执行算术的内置函数 - xxx 二、GCC C语言扩展interface和 pragmasTemplate 二、预处理过程及其指令预处理过程1. 字符集转换2. Initial proces…

实现基于Spring Cloud的事件驱动微服务

实现基于Spring Cloud的事件驱动微服务 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 事件驱动架构在现代微服务架构中越来越受欢迎,它通过事件的…

【JAVA多线程】线程池概论

目录 1.概述 2.ThreadPoolExector 2.1.参数 2.2.新任务提交流程 2.3.拒绝策略 2.4.代码示例 1.概述 线程池的核心: 线程池的实现原理是个标准的生产消费者模型,调用方不停向线程池中写数据,线程池中的线程组不停从队列中取任务。 实现…

最新版Python安装教程

一、安装Python 1.下载Python 访问Python官网: https:/www.oython.orgl 点击downloads按钮,在下拉框中选择系统类型(windows/Mac OS./Linux等) 选择下载最新稳定版本的Python 以下内容以演示安装Windows操作系统64位的python 左边是稳定发布版本Stabl…

python网络编程-TCP/IP

链路层 帧组成(按顺序): 目标MAC:6B 源MAC:6B 类型:2B 数据:46B-1500B CRC:4B 其中,源MAC为主机网卡地址,类型为来源网络层的数据类型,ipv…

Self-Instruct构造Prompt的例子

人工构造一批Prompt做种子。(Starting with a small seed set of human-written tasks)每次把一些种子后来生成的Prompt,放到Input里做few-shot examples,用LLM生成更多的Prompt;(Using the LLM to generat…

PyTorch学习之torch.transpose函数

PyTorch学习之torch.transpose函数 一、简介 torch.transpose 函数我们用于交换张量的维度。 二、语法 torch.transpose 函数用于交换给定张量的两个维度,其语法如下: torch.transpose(input, dim0, dim1)三、参数 input:待交换维度的张…

kotlin 基础

文章目录 1、安装 Java 和 Kotlin 环境2、程序代码基本结构3、变量的声明与使用4、数据类型5、数字类型的运算1)布尔类型2)字符类型3)字符串类型 6、 选择结构1)(if - else)2) 选择结构(when&am…

useImperativeHandle浅谈

useImperativeHandle 是 React Hooks 提供的一个高级功能,它允许你在函数式组件中自定义并暴露特定的实例值或方法给父组件。主要的作用是: 自定义对外暴露的实例值或方法: 通常情况下,函数式组件内部的实例值或方法对外是不可见的&#xff0…

如何有效管理你的Facebook时间线?

Facebook作为全球最大的社交平台之一,每天都有大量的信息和内容在用户的时间线上展示。有效管理你的Facebook时间线,不仅可以提升用户体验,还能够帮助你更好地控制信息流和社交互动。本文将探讨多种方法和技巧,帮助你有效管理个人…

分班结果老师怎么发给家长?

分班结果老师怎么发给家长? 随着新学期的脚步渐近,老师们的工作也变得愈发繁忙。从准备教学计划到整理课程材料,每一项任务都不容小觑。而其中,分班结果的告知工作,更是让不少老师头疼不已。传统的分班通知方式&#…

7、Redis主从复制过程

Redis主从复制过程 ​ 当一个Redis节点(Slave节点)接受到类似slaveof 127.0.0.1 6380的指令直到其可以从master持续复制数据,大致经历如下过程: 1、保存master地址 ​ 当slave接收到slaveof命令后,slave会立即将新的…

Python爬虫与数据可视化:构建完整的数据采集与分析流程

Python爬虫技术概述 Python爬虫是一种自动化的数据采集工具,它可以模拟浏览器行为,访问网页并提取所需信息。Python爬虫的实现通常涉及以下几个步骤: 发送网页请求:使用requests库向目标网站发送HTTP请求。获取网页内容&#xf…

.gitignore 的奥秘:前端开发者必须了解的文件忽略规则(二).gitignore 匹配规则

.gitignore 匹配规则 Git 版本管理在开发中场景,其中.gitignore也是Git中必不可少的配置文件,.gitignore 文件用于告诉 Git 哪些文件或目录应该被忽略,即不被版本控制系统跟踪和提交。 系列文章,上一篇介绍了:.gitigno…