云天励飞AI流调识别接口无需PHP推流,PHP仅需调用/v1/ai/track/start发起任务并轮询结果;回调为raw JSON,须用php://input读取并校验签名;去重应使用stream_id+event_time+track_id组合键存Redis。

云天励飞 AI_传监控流调识别 接口到底要不要 PHP 直接推流
不要。PHP 本身不支持持续 TCP/RTSP 流式写入,fsockopen 或 cURL 都无法维持长连接推送视频帧流,强行用 curl_setopt($ch, CURLOPT_TIMEOUT, 0) 模拟长连只会卡死或超时断开。云天励飞该接口实际要求的是:由边缘设备(如 IPC、NVR)或专用流媒体服务(如 SRS、ZLMediaKit)将 RTSP 流转成 HTTP-FLV / WebSocket / GB28181 上报,PHP 只负责「发起识别任务」和「轮询结果」。
PHP 怎么调用 /v1/ai/track/start 启动目标追踪任务
这是 PHP 唯一需要主动发起的 POST 请求。关键在请求体格式和鉴权方式 —— 云天励飞多数私有部署环境用 Access-Token Header,而非 OAuth2。参数必须严格匹配其 OpenAPI 文档字段名(注意大小写):
-
stream_url填的是已接入平台的流地址 ID 或内部流路径(如rtsp://192.168.1.100:554/stream1),不是公网可直访 URL -
target_type常见值为person、vehicle,不能填中文或自定义字符串 -
callback_url必须是能被云天服务器公网访问的 PHP 脚本地址(如https://your.com/callback.php),且需支持POST+application/json - 务必设置
Content-Type: application/json,否则返回415 Unsupported Media Type
POST /v1/ai/track/start HTTP/1.1
Host: ai-cloud.tianyilife.com
Authorization: Bearer your-jwt-token
Content-Type: application/json
{
"stream_url": "stream_abc123",
"target_type": "person",
"callback_url": "https://your.com/callback.php",
"max_track_num": 5
}
回调接收时为什么 $_POST 为空,但 file_get_contents('php://input') 能读到数据
因为云天励飞回调默认发的是 raw JSON,不是 application/x-www-form-urlencoded。PHP 不会自动解析 raw body 到 $_POST,必须手动处理:
- 先用
file_get_contents('php://input')读原始体 - 再用
json_decode($raw, true)解析,检查$data['event_type'] === 'track_result' - 注意验证
signature字段(如有),云天通常用HMAC-SHA256+ 密钥签名,PHP 需调用hash_hmac('sha256', $raw, $secret)校验 - 回调接口必须返回 HTTP 200 状态码,且响应体为空或仅
{"code":0},否则会被重试多次
怎么避免重复处理同一帧的 track_result 事件
云天励飞回调不保证 exactly-once,尤其在网络抖动时可能重复推送。不能只靠 frame_id 去重 —— 它在不同摄像头间不唯一。推荐组合去重键:
立即学习“PHP免费学习笔记(深入)”;
- 用
stream_id + event_time + track_id拼接成唯一键(如s1001_1715234400123_t456) - 存入 Redis 并设 TTL(如 30 秒),写入前
SETNX判断是否已存在 - 避免用 MySQL 主键冲突做去重,高并发下性能差且易锁表
- 注意
event_time是毫秒时间戳,PHP 中用(int)$data['event_time'] / 1000转成标准 Unix 时间便于存储
真正难的不是调通接口,而是处理回调乱序、重复、丢失 —— 这些问题在测试环境几乎不暴露,上线后才集中爆发。










