企业视频开放平台 API(/business)
重要:第 1、2 节接口维护说明
POST /business/upload与POST /business/download功能仍提供,后续将逐步不再维护。
新接入请优先使用第 3~5 节(COS 直传:uploadCosCredential→ PUT →uploadCosConfirm;结果下载:downloadCosCredential)。
通用约定
| 项目 | 说明 |
|---|---|
| multipart 接口 | Content-Type: multipart/form-data,文件字段名见各节。 |
| JSON 接口 | Content-Type: application/json(除非特别说明)。 |
| 企业凭证 | companyKey 为企业上传凭证,可在用户详情页查看。 |
骨架类型详情表(bonetype)
请求参数 bonetype 为整数,表示输出骨架/格式类型。
| 值 | 名称 | 支持功能 | 限制说明 |
|---|---|---|---|
| 1 | boyFBX 格式 | 帧率选择、原地动作、物理优化 | 无 |
| 2 | BIP 格式 | 帧率选择、原地动作、物理优化 | 不支持面捕(含 3) |
| 3 | Mixamo 格式 | 帧率选择、原地动作、物理优化 | 不支持面捕(含 3) |
| 4 | Unreal 4 格式 | 帧率选择、原地动作、物理优化 | 不支持面捕(含 3) |
| 5 | VMD 格式 | 原地动作 | 无 |
| 7 | girlFBX 格式 | 帧率选择、原地动作、物理优化 | 无 |
| 8 | Unity-Anim 格式 | 原地动作、帧率选择、物理优化 | 无 |
| 9 | OnlyFace 格式 | 原地动作、帧率选择 | capturetype 只能为 "1,3" |
| 10 | C4D 格式 | 原地动作、帧率选择、物理优化 | 不支持面捕(含 3) |
| 11 | CC&iClone 格式 | 原地动作、帧率选择、物理优化 | 不支持面捕(含 3) |
| 12 | Roblox R15 格式 | 原地动作 | 不支持手捕(2)和面捕(3) |
| 13 | Unreal 5.5 格式 | 原地动作、帧率选择、物理优化 | 不支持面捕(含 3) |
| 14 | Unreal 5.6 格式 | 原地动作、帧率选择、物理优化 | 不支持面捕(含 3) |
| 15 | BVH 格式 | 原地动作、帧率选择、物理优化 | 不支持面捕(含 3) |
| 16 | Warudo-Anim 格式 | 原地动作、帧率选择、物理优化 | 无 |
说明:服务端对
bonetype的合法范围另有校验,与capturetype的组合约束以接口实际校验为准;上表侧重格式能力与限制说明。
1. 视频上传(后续将逐步不再维护。新接入请优先使用第3,4节)
1.1 接口功能
提交 MP4 视频文件 与 制作参数,上传成功后返回 videoId 等。可配置 rollbackUrl,在视频制作完成时由服务端 POST 回调。
1.2 请求方法
POST
1.3 请求路径
https://www.qmai.vip/business/upload
1.4 请求参数
Content-Type:multipart/form-data
| 参数名 | 必填 | 类型 | 说明 |
|---|---|---|---|
| companyKey | 是 | string | 企业上传凭证。 |
| bonetype | 是 | number | 骨架类型,详见上文 骨架类型详情表(bonetype) |
| capturetype | 是 | string | 动捕类型,多个值用英文逗号分隔,如 0,2,3。0 全身、1 半身、2 手捕、3 面捕、5 自动判断(全身/半身);全身/半身/自动判断只能选一类。 |
| videoFile | 是 | file | 视频文件,MP4,其它限制以官网说明为准。 |
| isStaticCamera | 否 | number | 摄像机状态:1 表示通用摄像机等。 |
| poseType | 否 | number | 第一帧姿势:1 TPose、2 APose、3 原 Pose。 |
| mulPersonInfo | 否 | string | 多人视频目标框信息;单人场景下可不传。对于多人场景,建议先调用第 6 节 uploadPic 接口上传截图,以获取人框信息。该参数使用字符串表示,格式为 "startFrame(起始帧),x,y,w,h",其中 startFrame 表示截图对应的视频起始帧序号。 |
| frameRate | 否 | number | 输出帧率(计费相关):24 / 30 / 60 / 120 等。 |
| standPose | 否 | boolean | 原地动作:false 关闭、true 开启。 |
| physicType | 否 | number | 物理优化类型(现默认为开启)。 |
| physicTimes | 否 | number | 可选 1–6(6 表示 10 次)。 |
| rollbackUrl | 否 | string | 制作完成回调地址(POST)。 |
1.5 响应信息
响应体为 JSON(CompanyVideoResponse)。
| 字段名 | 类型 | 说明 |
|---|---|---|
| message | string | 提示信息;成功时为 "Video uploaded successfully"。 |
| videoId | string | 成功时为新建视频/任务 ID;失败时可能为 -1 等,以 message、status 为准。 |
| status | string | 200 业务成功;600 参数或业务拒绝;500 服务异常等。 |
| videoStatus | string | 成功时为待制作相关文案。 |
| data | object | 一般为空或未使用。 |
2. 文件下载(后续将逐步不再维护。新接入请优先使用第5节)
2.1 接口功能
根据 companyKey、videoId 查询动捕结果,服务端将多个结果文件打包为 ZIP,在响应体中返回二进制内容。
2.2 请求方法
POST
2.3 请求路径
https://www.qmai.vip/business/download
2.4 请求参数(JSON)
| 参数名 | 必填 | 类型 | 说明 |
|---|---|---|---|
| companyKey | 是 | string | 企业上传凭证。 |
| videoId | 是 | string | 视频任务 ID。 |
| videoSign | 否 | number | 传 1 时,ZIP 中可额外包含处理后视频、音频等资源(若任务存在);其它值按默认结果集。 |
2.5 响应信息
响应体为 JSON(CompanyDownResponse)。
| 字段名 | 类型 | 说明 |
|---|---|---|
| fileName | string | 建议保存的 ZIP 文件名(含 .zip)。 |
| message | string | 成功时为 "Success";失败时为错误说明。 |
| status | string | 200 表示 ZIP 生成成功;600 等为业务失败。 |
| file | byte[] | ZIP 文件字节;JSON 序列化形式依客户端/网关而定(常见为 Base64)。 |
若服务端内部异常(如无动捕结果文件等),可能返回 HTTP 500 且无 body。
3. 申请 COS 上传凭证
3.1 接口功能
为当前企业生成 直传对象存储的预签名 PUT 地址 及 cosObjectKey。客户端向该 URL PUT 上传 MP4 成功后,再调用 第 4 节 提交业务参数并创建动捕任务。
服务端将 cosObjectKey 与企业做短时绑定,第 4 节会校验该绑定。
3.2 请求方法
POST
3.3 请求路径
https://www.qmai.vip/business/uploadCosCredential
3.4 请求参数(JSON)
| 参数名 | 必填 | 类型 | 说明 |
|---|---|---|---|
| companyKey | 是 | string | 企业上传凭证。 |
| suffix | 否 | string | 文件后缀,仅支持 .mp4;缺省按 .mp4。可传 mp4 或 .mp4。 |
3.5 响应信息
| 字段名 | 类型 | 说明 |
|---|---|---|
| message | string | 成功为 "OK";失败为错误说明。 |
| status | string | 200 成功;600 失败。 |
| uploadUrl | string | 预签名 PUT 地址;失败时为 null。 |
| cosObjectKey | string | 对象键(非完整 URL),由服务端生成;确认接口须原样回传,勿自行拼路径。 |
| expiresInSeconds | int | 预签名剩余有效时间(秒),约 5 分钟 量级。 |
常见失败:No user information found, please check input key!、Only .mp4 suffix is supported(均为 status=600)。
成功示例:
{
"message": "OK",
"status": "200",
"uploadUrl": "https://example-bucket.cos.ap-guangzhou.myqcloud.com/companyVideoDirect/your-company-key/550e8400-e29b-41d4-a716-446655440000.mp4?q-sign-algorithm=sha1&q-ak=***&q-sign-time=1710000000;1710000300&q-key-time=1710000000;1710000300&q-header-list=host&q-url-param-list=&q-signature=***",
"cosObjectKey": "companyVideoDirect/your-company-key/550e8400-e29b-41d4-a716-446655440000.mp4",
"expiresInSeconds": 300
}3.6 调用步骤
- 调用本节接口获取
uploadUrl、cosObjectKey。 - 使用 HTTP PUT 将 MP4 二进制发往
uploadUrl(请求体为文件内容;Header 以预签名要求为准)。 - 调用 第 4 节,JSON 中携带
cosObjectKey及业务字段。
4. 确认 COS 上传并创建任务
4.1 接口功能
在客户端已把视频上传到对象存储后,本接口根据 cosObjectKey 启动动捕任务。
业务字段与 第 1 节 中除 videoFile 外的参数含义一致;本节须显式提供 videoName(逻辑名,不可为空,不允许表情符号)。
4.2 请求方法
POST
4.3 请求路径
https://www.qmai.vip/business/uploadCosConfirm
4.4 请求参数(JSON)
直传专用
| 参数名 | 必填 | 类型 | 说明 |
|---|---|---|---|
| cosObjectKey | 是 | string | 与 第 3 节 返回的 cosObjectKey 完全一致(可 trim)。 |
| videoName | 是 | string | 视频逻辑名。 |
视频逻辑名:服务端以上传文件的文件名去掉 .mp4 作为逻辑名,并校验不含表情符号。 |
业务参数(与第 1 节一致,无文件)
| 参数名 | 必填 | 类型 | 说明 |
|---|---|---|---|
| companyKey | 是 | string | 企业上传凭证。 |
| bonetype | 是 | number | 骨架类型,见上文 骨架类型详情表(bonetype)。 |
| capturetype | 是 | string | 动捕类型,英文逗号分隔。 |
| isStaticCamera | 否 | number | 摄像机状态等。 |
| halfWholeBodyCheck | 否 | number | 半全身检测相关。 |
| mulPersonInfo | 否 | string | 多人视频目标框信息;单人场景下可不传。对于多人场景,建议先调用第 6 节 uploadPic 接口上传截图,以获取人框信息。该参数使用字符串表示,格式为 "startFrame(起始帧),x,y,w,h",其中 startFrame 表示截图对应的视频起始帧序号。 |
| description | 否 | string | 简述,最长 255。 |
| rollbackUrl | 否 | string | 制作完成回调(POST)。 |
| poseType | 否 | number | 1/2/3 同上。 |
| modelUrl | 否 | string | 模型地址等。 |
| piercing | 否 | string | 防穿模 0/1。 |
| frameRate | 否 | number | 24、30、60、120 等。 |
| standPose | 否 | boolean | 原地动作。 |
| physicType | 否 | number | 物理优化类型。 |
| physicTimes | 否 | number | 物理优化次数。 |
绑定校验:须在 第 3 节 成功且预签名有效期内完成 PUT,且 companyKey 与申请凭证时一致。失败时 message 可能为:Invalid or expired cosObjectKey, please request a new upload credential。
4.5 响应信息
同 第 1 节(CompanyVideoResponse)。成功示例:
{
"message": "Video uploaded successfully",
"videoId": "xxxxxxxx",
"status": "200",
"videoStatus": "To be produced",
"data": null
}4.6 Python 示例
import requests
base = "https://www.qmai.vip/business/"
company_key = "your-company-key"
video_path = r"data\xiaoyu.mp4"
cred = requests.post(base + "uploadCosCredential", json={"companyKey": company_key}).json()
if cred.get("status") != "200":
raise RuntimeError(cred)
with open(video_path, "rb") as f:
requests.put(cred["uploadUrl"], data=f).raise_for_status()
payload = {
"companyKey": company_key,
"cosObjectKey": cred["cosObjectKey"],
"videoName": "xiaoyu",
"bonetype": 1,
"capturetype": "0",
"poseType": 1,
}
print(requests.post(base + "uploadCosConfirm", json=payload).text)5. 获取结果文件下载凭证
5.1 接口功能
根据 videoId、companyKey 解析该任务下可下载的动捕结果文件列表,返回 每个文件的文件名 与 GET 下载地址(预签名 URL 或已是 http(s) 的链接)。不返回 ZIP 二进制,由客户端自行拉取或打包。
5.2 请求方法
POST
5.3 请求路径
https://www.qmai.vip/business/downloadCosCredential
5.4 请求参数(JSON)
| 参数名 | 必填 | 类型 | 说明 |
|---|---|---|---|
| companyKey | 是 | string | 企业上传凭证。 |
| videoId | 是 | string | 视频任务 ID。 |
| videoSign | 否 | number | 传 1 时,列表中可包含处理后视频、音频等(若存在);否则为默认文件列表。 |
5.5 响应信息
| 字段名 | 类型 | 说明 |
|---|---|---|
| message | string | 成功为 "Success"。 |
| status | string | 200 成功;600 业务失败。 |
| videoId | string | 请求中的视频 ID。 |
| archiveName | string | 建议的本地 ZIP 命名(与线上下载习惯一致);失败时可能为 null。 |
| files | array | 见下表。 |
| expiresInSeconds | int | 预签名有效期 300(秒)。 |
files 元素
| 字段名 | 类型 | 说明 |
|---|---|---|
| fileName | string | 文件名。 |
| downloadUrl | string | GET 地址。 |
无动捕结果等内部错误时,可能 HTTP 500 且无 body。
成功示例:
{
"message": "Success",
"status": "200",
"videoId": "1919191919",
"archiveName": "demo_result.zip",
"files": [
{
"fileName": "demo.fbx",
"downloadUrl": "https://example-bucket.cos.ap-guangzhou.myqcloud.com/result/demo.fbx?q-signature=***"
},
{
"fileName": "demo.bvh",
"downloadUrl": "https://example-bucket.cos.ap-guangzhou.myqcloud.com/result/demo.bvh?q-signature=***"
}
],
"expiresInSeconds": 300
}5.6 Python 示例
import requests
payload = {
"companyKey": "your-company-key",
"videoId": "your-video-id",
"videoSign": 1,
}
resp = requests.post(
"https://www.qmai.vip/business/downloadCosCredential",
json=payload,
)
resp.raise_for_status()
data = resp.json()
if data.get("status") != "200":
raise RuntimeError(data.get("message"))
print("archiveName =", data.get("archiveName"))
for item in data.get("files", []):
print(item["fileName"], "->", item["downloadUrl"])6. 上传截图(人框检测)
6.1 接口功能
上传 图片 供人框检测服务使用,返回检测结果字符串(如框坐标等),用于多人场景的 mulPersonInfo 等配置。
6.2 请求方法
POST
6.3 请求路径
https://www.qmai.vip/business/uploadPic
6.4 请求参数
Content-Type:multipart/form-data
| 参数名 | 必填 | 类型 | 说明 |
|---|---|---|---|
| picture | 是 | file | 图片文件(@RequestPart("picture"))。 |
| companyKey | 是 | string | 企业上传凭证(表单字段)。 |
6.5 响应信息
响应体为 JSON(UploadPicResponse)。
| 字段名 | 类型 | 说明 |
|---|---|---|
| message | string | 成功为 "SUCCESS";失败为错误说明。 |
| multiAddr | object / string | 成功时为检测服务返回的内容(为 JSON 字符串);失败时为空。 |
| status | string | 200 成功;600 企业不存在等;500 服务异常。 |
企业不存在时:message 为 No user information found, please check input key!,status 为 600。
成功示例:
{
"code": 0,
"message": "success",
"data": {
"message": "SUCCESS",
"multiAddr": "{\"boxes\":\"[[71, 402, 177, 285], [270, 363, 134, 327]]\"}",
"status": "200",
"videoStatus": ""
}
}6.6 Python 示例
import requests
url = "https://www.qmai.vip/business/uploadPic"
data = {"companyKey": "your-company-key"}
with open(r"data\person.jpg", "rb") as f:
files = {
"picture": ("person.jpg", f, "image/jpeg")
}
resp = requests.post(url, data=data, files=files)
resp.raise_for_status()
result = resp.json()
if result.get("status") != "200":
raise RuntimeError(result.get("message"))
print("multiAddr =", result.get("multiAddr"))7. 消费记录查询
7.1 接口功能
分页查询当前 companyKey 对应企业的 CV 币消费/变动记录。
7.2 请求方法
POST
7.3 请求路径
https://www.qmai.vip/business/consumptionRecord
7.4 请求参数(JSON)
继承分页基类字段,并包含企业与时间筛选。
| 参数名 | 必填 | 类型 | 说明 |
|---|---|---|---|
| companyKey | 是 | string | 企业上传凭证。 |
| page | 否 | number | 页码,从 1 开始,对应 JSON 字段 page(默认 1)。 |
| size | 否 | number | 每页条数(默认 20)。 |
| sort | 否 | string[] | 排序字段,依服务端实现。 |
| startTime | 否 | string (ISO-8601 日期时间) | 记录开始时间。 |
| endTime | 否 | string (ISO-8601 日期时间) | 记录结束时间。 |
7.5 响应信息
响应体为 JSON(FilterResponse<SurplusRecordDTO>)。
| 字段名 | 类型 | 说明 |
|---|---|---|
| records | array | 消费记录列表。 |
| total | long | 总条数。 |
| size | long | 每页条数。 |
records 元素(SurplusRecordDTO)
| 字段名 | 类型 | 说明 |
|---|---|---|
| amount | number | 变动数量。 |
| signedAmount | string | 带符号数量展示等。 |
| reason | string | 原因说明。 |
| duration | number | 时长相关(若有)。 |
| videoId | string | 关联视频 ID(若有)。 |
| videoName | string | 关联视频名(若有)。 |
| username | string | 用户名等。 |
| createAt | string | 创建时间。 |
| statusName | string | 状态名称。 |
成功示例:
{
"records": [
{
"amount": 120,
"signedAmount": "-120",
"reason": "视频动捕消费",
"duration": 15,
"videoId": "1919191919",
"videoName": "demo",
"username": "enterprise_user",
"createAt": "2026-04-07T10:30:00",
"statusName": "已完成"
}
],
"total": 1,
"size": 20
}7.6 Python 示例
import requests
payload = {
"companyKey": "your-company-key",
"page": 1,
"size": 20,
"startTime": "2026-04-01T00:00:00",
"endTime": "2026-04-07T23:59:59",
}
resp = requests.post(
"https://www.qmai.vip/business/consumptionRecord",
json=payload,
)
resp.raise_for_status()
data = resp.json()
print("total =", data.get("total"))
for record in data.get("records", []):
print(record.get("createAt"), record.get("signedAmount"), record.get("reason"))8. 查询余额
8.1 接口功能
查询当前 companyKey 对应企业的 CV 币余额。
8.2 请求方法
POST
8.3 请求路径
https://www.qmai.vip/business/queryBalance
8.4 请求参数(JSON)
| 参数名 | 必填 | 类型 | 说明 |
|---|---|---|---|
| companyKey | 是 | string | 企业上传凭证。 |
8.5 响应信息
响应体为整数(Integer),表示当前 CV 币余额。
成功示例:
{
"code": 0,
"data": 1111,
"message": "success"
}8.6 Python 示例
import requests
resp = requests.post(
"https://www.qmai.vip/business/queryBalance",
json={"companyKey": "your-company-key"},
)
resp.raise_for_status()
balance = resp.json()
print("balance =", balance)9. 视频制作进度查询
9.1 接口功能
根据 videoId、companyKey 查询视频任务状态,并在成功时返回 可读的进度文案 与 上传参数快照(与上传表单字段对齐,便于核对)。
9.2 请求方法
POST
9.3 请求路径
https://www.qmai.vip/business/getStatus/{videoId}/{companyKey}
路径参数 videoId、companyKey 中若含特殊字符,请按 URL 规则编码。
9.4 请求参数
无请求体;参数全部来自路径。
9.5 响应信息
响应体为 JSON(CompanyVideoResponse)。
| 字段名 | 类型 | 说明 |
|---|---|---|
| message | string 或 object | 成功时可能为含 CaptureType 的键值信息;失败时为错误说明文案。 |
| videoId | string | 路径中的视频 ID。 |
| status | string | 查询过程状态:200 表示查询逻辑正常返回;未找到企业/视频时 message 仍可能为错误文案。异常时为 500。 |
| videoStatus | string | 制作状态可读文案(如待制作、制作中等),依 ExchangeUtil 转换;无数据时可能为空字符串。 |
| data | object | 成功且查到视频时,为 上传参数快照(与 VideoUploadRequest 字段一致,如 bonetype、capturetype、mulPersonInfo 等);否则可能为 null。 |
常见 message:企业不存在 No user information found, please check input key!;视频不存在 未查询到上传视频信息,请检查输入的视频ID!。
附录
- 骨架类型、动捕类型、计费规则等以 视频上传接口 及官网更新为准。
- bonetype 能力与限制说明见本文 骨架类型详情表(bonetype);若与官网表不一致,以官网及更新日志为准。
CopyRight © 千面动捕开放平台文档(项目内副本,发布时请与官网同步)
