AKStream.Next · 文档中心

第三方 API:录像、裁剪和删除

第三方 API:录像、裁剪和删除

录像文件只能通过 fileId 操作。第三方接口不会返回服务器物理路径、原始 Hook JSON 或节点删除命令载荷。

查询、播放和下载

按通道和时间查询录像:

GET /api/v2/third-party/recordings?channelId=camera-001&startTime=2026-08-24T08:00:00%2B08:00&endTime=2026-08-24T10:00:00%2B08:00&page=1&pageSize=50
Authorization: Bearer ak_pat_<TOKEN>

startTime/endTime 使用时间交集:录像只要与查询窗口有重叠就会返回。用 fileState=Available 只查可播放文件。

查询结果不会出现服务器 FilePath 或 file:///。每行会给出 playbackLinkEndpoint、playbackLeaseEndpoint 和 downloadLinkEndpoint;它们是下一步 POST 接口,不是已经签发的播放票据。需要播放时优先调用该行的 playbackLeaseEndpoint。

长录像或原生 <video> 播放推荐创建 URL 不变的播放租约:

POST /api/v2/third-party/recordings/{fileId}/playback-lease
Authorization: Bearer ak_pat_<TOKEN>
Content-Type: application/json

{"leaseSeconds":120,"absoluteLifetimeSeconds":43200}

到 renewAfter 时调用 /api/v2/third-party/playback-leases/{leaseId}/renew。续租只更新时间,URL 不变,因此浏览器后续 Range 请求不需要重设 video.src 或恢复 currentTime。不需要续租的短播放仍可使用 /playback-link;下载使用 /download-link。播放要求 recordings.play,下载要求 recordings.download,两种凭据不能互换,下载链接不可续租。

开始和停止录像

手工开始录像继续使用领域接口:

POST /api/v2/recording/start
Authorization: Bearer ak_pat_<TOKEN>
Content-Type: application/json

{
  "channelId": "camera-001",
  "mediaServerId": "zlm-prod-01",
  "app": "live",
  "streamId": "camera-001-main",
  "vhost": "__defaultVhost__",
  "recordSource": "Manual"
}

停止时调用 /api/v2/recording/stop,然后查询 /api/v2/recording/sessions。命令成功不等于 MP4 已经封口;最终以录像会话终态、WebHook 和 /third-party/recordings 中出现可用文件为准。

裁剪和合并

创建任务:

POST /api/v2/third-party/cut-merge/tasks
Authorization: Bearer ak_pat_<TOKEN>
Content-Type: application/json

{
  "channelId": "camera-001",
  "mainId": "camera-001",
  "app": "live",
  "vhost": "__defaultVhost__",
  "startTime": "2026-08-24T08:15:00+08:00",
  "endTime": "2026-08-24T08:35:00+08:00"
}

第三方入口不接受 callbackUrl,避免旧回调把物理路径外发到任意地址。请查询:

GET /api/v2/third-party/cut-merge/tasks/{taskId}
Authorization: Bearer ak_pat_<TOKEN>

等 taskStatus=Closed 后,长时间播放使用 /playback-lease,短播放或下载使用 /playback-link、/download-link。一次任务最长 120 分钟;所选录像跨多个物理节点时会明确拒绝,需要缩小时间范围或先归档到同一节点。

平台录像与裁剪任务的普通查询同样只返回 /media、/download 等 HTTP 入口,不返回物理路径、原始 Hook/计划 JSON、回调地址或内部命令编号。

软删、恢复和硬删

动作 接口 实际效果
软删除 POST /api/v2/third-party/recordings/soft-delete 隐藏录像并开始可恢复窗口,不删磁盘文件
恢复 POST /api/v2/third-party/recordings/restore 只恢复仍可撤销且物理文件可确认存在的录像
硬删除 POST /api/v2/third-party/recordings/hard-delete 创建可审计的节点删除命令;响应成功不等于物理文件已删
删除裁剪结果 DELETE /api/v2/third-party/cut-merge/tasks/{taskId} 默认同时删除任务输出文件,不返回服务器路径

批量请求格式:

{
  "fileIds": [
    "01234567-89ab-cdef-0123-456789abcdef",
    "11234567-89ab-cdef-0123-456789abcdef"
  ]
}

单次最多 200 个 ID。响应中的 succeeded 表示本阶段成功,failed 给出逐项原因。硬删除要继续查询录像状态或关联节点命令,直到 FileState=Deleted;不要因为 HTTP 200 就从自己的业务库永久抹掉记录。

常见状态和处理

状态 说明 建议动作
Available 文件可播放/下载 可以申请短时地址
SoftDeleted 已软删,可能仍可恢复 查看 canUndoDelete/deleteUndoUntil
DeleteRequested 节点硬删除命令已创建 等命令回写,不重复提交
Deleted 物理删除流程已完成 保留业务审计,停止播放和下载
Missing 索引存在但磁盘文件找不到 检查挂载、节点和扫描结果
DeleteFailed 删除命令或文件操作失败 保存 TraceId 和失败原因,修复后再重试
播放返回“当前节点不可访问” 录像在远端节点且当前实例没有共享挂载 把请求路由到文件所属节点,或部署共享受管录像根目录

软删、硬删和删除裁剪结果需要 recordings.delete;恢复、开始/停止录像和裁剪合并需要 recordings.manage。删除前应在你自己的页面明确展示文件数量、时间范围和不可恢复影响。