Skip to content

实时预览接口 ​

创建或复用预览流 ​

http
POST /v1/source/streams
Content-Type: application/json
json
{ "resourceToken": "<resource-token>" }

同一资源已有活动流时返回同一会话,不创建第二个 streamToken。

HTTP 201 响应:

json
{
  "streamToken": "<stream-token>",
  "resourceToken": "<resource-token>",
  "expiresIn": 1800,
  "streamUrl": "/v1/source/stream/<stream-token>"
}

流的有效期不会超过关联资源的剩余 TTL。

订阅预览流 ​

http
GET /v1/source/stream/{streamToken}

响应头:

http
Content-Type: multipart/x-mixed-replace; boundary=markify-frame
Cache-Control: no-store, no-cache, must-revalidate
X-Accel-Buffering: no

浏览器可以直接把 URL 设为 <img src>。连接建立后立即发送当前帧,后续预览继续在同一 HTTP 响应中输出。

每个流的订阅者数量受 MAX_PREVIEW_SUBSCRIBERS_PER_STREAM 限制,达到上限返回 429 STREAM_SUBSCRIBER_LIMIT。

发布预览 ​

http
POST /v1/source/preview
Content-Type: application/json

请求体使用完整 RenderRequest。resources[] 中的每个资源都必须已经创建活动流。

HTTP 200 响应:

json
{
  "revision": 7,
  "updated": 2
}
字段类型说明
revisionintegerAPI 进程内单调递增的成功批次版本
updatedinteger本次原子更新的流数量

预览固定输出 image/webp、质量 80,请求中的 output 不影响预览帧。

关闭预览流 ​

http
DELETE /v1/source/streams/{streamToken}

成功返回 204 No Content 并关闭所有订阅连接。过期 token 返回 410 STREAM_EXPIRED,未知 token 返回 404 STREAM_NOT_FOUND。

并发语义 ​

同一源资源的新预览会取消旧批次,旧请求返回 409 PREVIEW_SUPERSEDED。前端应忽略被取代请求,不要将其视为服务故障。

Markify 文档与协议随实现同步演进。