You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 22:15:03