Gstreamer如何读取元素属性内部动态更新的结构体数据
GStreamer 获取TensorFlow推理插件动态检测结果方案
原方法失效原因
你之前使用g_object_get读取属性的方式只能拿到插件静态注册的GObject常量属性,而每帧动态更新的人脸检测结构体是运行时临时生成的帧关联数据,不会暴露在插件属性接口中,因此无法通过读取属性的方式获取。
可行实现方案
方案1:给TensorFlow插件src衬垫加缓冲区探针(最通用方案)
绝大多数GStreamer推理插件都会将推理结果以自定义GstMeta的形式附加到输出帧缓冲区上,你可以通过探针回调实时拿到每帧的检测数据,步骤如下:
- 从Pipeline中获取TensorFlow插件实例
GstElement *tf_elem = gst_bin_get_by_name(GST_BIN(pipeline), "你的TensorFlow插件名称"); - 获取插件的输出衬垫,添加缓冲区探针
GstPad *tf_src_pad = gst_element_get_static_pad(tf_elem, "src"); // 监听缓冲区输出事件 gst_pad_add_probe(tf_src_pad, GST_PAD_PROBE_TYPE_BUFFER, detect_result_probe, NULL, NULL); gst_object_unref(tf_src_pad); - 实现探针回调函数,读取检测元数据
static GstPadProbeReturn detect_result_probe(GstPad *pad, GstPadProbeInfo *info, gpointer user_data) { GstBuffer *buf = GST_PAD_PROBE_INFO_BUFFER(info); // 替换为你插件对应的自定义Meta获取宏,通常插件头文件会提供 GstTensorFlowDetectionMeta *detect_meta = gst_buffer_get_tensorflow_detection_meta(buf); if (detect_meta) { // 此处可直接读取detect_meta结构体内的ROI坐标、置信度等字段 // 注意:不要在回调内做耗时操作,需要后续处理请深拷贝结构体数据后扔到独立线程处理 } return GST_PAD_PROBE_OK; }
方案2:监听插件推理完成信号
如果你使用的TensorFlow插件封装了推理完成信号(多数开源推理插件都提供该接口),可以直接监听对应信号,回调中会直接携带检测结构体参数,无需手动解析元数据,实现更简单。
注意事项
如果你的Detection结构体没有被插件注册为GstMeta,可以修改插件代码,要么将结构体注册为自定义GstMeta附加到缓冲区,要么新增自定义信号在每轮推理完成后发射结构体数据,上层都可以通过上述两种方案获取数据。
内容的提问来源于stack exchange,提问作者Alwin
相关产品推荐
相关产品推荐

