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

修改Mediapipe C++手部检测示例时poller.Next()调用冻结问题

问题原因

.Next()调用永久阻塞的核心原因是你在pbtxt顶层声明的landmarks输出流没有任何计算节点作为生产者往里面写入数据包,阻塞调用等不到数据也等不到流结束信号,就会一直挂起。
你混淆了计算节点的内部输出标签和全局流名:HandLandmarkTrackingCpu节点确实存在landmark相关输出,但这个输出是节点的带标签输出端口,没有自动映射为全局名为landmarks的流,你只在顶层加输出声明相当于开了没有接水源的水龙头,永远等不到数据。

修复步骤
  • 第一步:定位pbtxt中HandLandmarkTrackingCpu对应的node配置块,检查该节点的output_stream配置:
    • 如果已经存在LANDMARKS:xxx格式的配置(xxx通常是multi_hand_landmarks这类默认命名),不需要修改节点配置,直接把你之前加的顶层output_stream声明、C++层AddOutputStreamPoller的流名参数改成这个已有的xxx即可。
    • 如果没有对应映射,就在该节点的output_stream列表中新增一行output_stream: "LANDMARKS:landmarks",所有原有输入输出配置保留不动,配置示例如下:
      node {
        calculator: "HandLandmarkTrackingCpu"
        # 原有input_stream配置全部保留
        input_stream: "IMAGE:input_video"
        # ... 其他原有输入配置
        # 新增landmarks流映射
        output_stream: "LANDMARKS:landmarks"
        # ... 其他原有输出配置、节点选项全部保留
      }
      
  • 第二步:保留你已经写的C++层注册poller、读取packet的逻辑即可,不需要改动这部分代码。
排查验证技巧
  • 可以先拿pbtxt中默认已经存在的输出流(比如渲染后的视频帧输出流)测试你的poller逻辑,如果能正常取包,就说明C++层代码没有问题,故障点一定在pbtxt流配置上。
  • 如果后续遇到偶发阻塞属于正常现象:landmarks流只有在画面中检测到手时才会产生数据包,没有检测目标时不会发包,不需要额外处理。你现在遇到的完全无输出的永久阻塞就是流无生产者导致的。
Mediapipe C++ API参考说明

核心规则可以直接看源码头文件的注释:

  • 计算节点的流映射规则定义在mediapipe/framework/calculator.proto中,每个node的输入输出都必须遵循"TAG:stream_name"的格式,省略TAG直接写流名的写法仅适用于无标签的端口。
  • OutputStreamPoller的阻塞行为在mediapipe/framework/output_stream_poller.h中有明确说明:调用Next()会一直阻塞直到拿到新包、流被关闭或者图运行出错。

内容的提问来源于stack exchange,提问作者Mikhail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:06:29