AKStream.Next · 文档中心

录像智能检索 API

录像智能检索 API

第三方服务器使用现有 API Token 调用 /api/v2/recording/search/*。Token 需要 recordings.play 权限;管理员手工补救需要 recordings.manage。调用时还会检查录像智能检索模块授权、总开关、通道参与状态和原录像文件状态。请从服务端保存 Token,不要放入网页、URL 或日志。

以文字搜索

POST /api/v2/recording/search/text,请求体为 JSON:

curl -X POST 'https://example.invalid/api/v2/recording/search/text' \
  -H 'Authorization: Bearer ak_pat_<TOKEN>' \
  -H 'Content-Type: application/json' \
  --data '{"text":"有人穿黄色外套进入大门","channelIds":["channel-1"],"fromUtc":"2026-09-30T00:00:00Z","toUtc":"2026-10-01T00:00:00Z","minSimilarity":0.45,"maxSegments":5}'

text 必填,1–500 字符;channelIds 省略时搜索所有已参与通道;时间使用 ISO 8601 带时区格式。minSimilarity 范围为 0–1,默认 0.45;maxSegments 范围为 1–50,默认 5;超出范围返回 HTTP 400。结果按请求阈值和数量限制返回。开始时间不得晚于结束时间。空通道范围返回空 segments。

minSimilarity:0.60 表示模型余弦相似度至少 0.60,不是画面含有目标的 60% 识别置信度。实际分数随模型与查询语句变化;阈值太高可能没有结果。RK3588 上一次 RN50 实测中,“男人”的前排分数约 0.42,“出风口”约 0.48,因此页面初始值采用 0.45 / Top 5,并允许用户现场调整。

以图片搜索

POST /api/v2/recording/search/image,请求体为 multipart/form-data,恰好包含一张 JPEG/PNG 图片和可选的 query JSON 筛选对象。图片上限 5 MiB,请求上限 6 MiB;不要传服务器路径或外部图片 URL。

curl -X POST 'https://example.invalid/api/v2/recording/search/image' \
  -H 'Authorization: Bearer ak_pat_<TOKEN>' \
  -F 'image=@./reference.jpg' \
  -F 'query={"channelIds":["channel-1"],"minSimilarity":0.45,"maxSegments":5}'

读取结果并播放

两个搜索接口返回同样的结构。以下值只展示字段形状,文件 ID、时间和相似度均以实际响应为准:

{
  "modelSpaceId": "chinese-clip-rn50-official-v1",
  "effectiveBackend": "Cpu",
  "coverage": "Unverified",
  "segments": [{
    "recordFileId": "00000000-0000-0000-0000-000000000001",
    "channelId": "channel-1",
    "channelName": "入口摄像机",
    "deviceId": "device-1",
    "nodeId": "node-1",
    "mediaServerId": "media-1",
    "vhost": "__defaultVhost__",
    "app": "live",
    "streamId": "stream-1",
    "fileName": "record.mp4",
    "hitAtUtc": "2026-09-30T01:02:03Z",
    "hitOffsetMs": 42000,
    "segmentStartMs": 40000,
    "segmentEndMs": 47000,
    "similarity": 0.82,
    "mediaUrl": "/api/v2/recording/files/00000000-0000-0000-0000-000000000001/media",
    "playableOnCurrentNode": true
  }]
}

mediaUrl 是受保护的相对地址,不是匿名公开视频。服务端客户端可附带同一 Bearer Token 并用 HTTP Range 播放;浏览器 <video> 不能自行设置 Authorization 头时,先使用第三方录像短时播放地址接口 POST /api/v2/third-party/recordings/{fileId}/playback-link,再把命中偏移换成播放器的 seek 时间。该播放地址仍受原文件和权限状态约束。

运行状态与人工补救

GET /api/v2/recording/search/status 返回授权、模型、向量服务和任务状态。GET /api/v2/recording/search/hardware 与 /capabilities 要求 system.config.view,供运维检测后端;不要把“运行时可见”当作“模型已验收”。

管理员临时打开配置 FileRecoveryEnabled 后,可用 POST /api/v2/recording/search/index-jobs 提交明确文件:

{"recordFileIds":["00000000-0000-0000-0000-000000000001"]}

每次须提交 1–100 个 ID。返回 HTTP 202 及 requested、accepted、skipped;只表示排队,不表示向量已生成。该接口需要 recordings.manage 和相同模块授权。关闭补救开关不会删除已经存在的检索结果。

错误处理

HTTP code 处理
400 invalid_query、invalid_image、invalid_filter、invalid_file_ids 修正文字、图片或筛选条件,不原样重试
401 authentication_required 提供有效 Bearer API Token
403 permission_denied 或授权拒绝 检查 Token 权限及高级模块授权
503 recording_search_disabled、recording_search_unavailable、file_recovery_disabled 查看模块状态、模型、Qdrant 与补救开关,退避后重试

coverage: "Unverified" 表示索引可能不完整。录像文件被删后,客户端必须丢弃以前缓存的播放地址和搜索结果。