视频上传接口
1.接口功能
该功能通过调用千面动捕服务的上传接口,允许用户上传包含视频文件和制作信息的数据。用户需要配置相关参数,包括域名、用户凭证、视频文件路径、动捕类型和骨架类型等。上传成功后,用户可以通过检查返回的状态码和消息来验证操作的结果。此外,用户还可以提供回调地址,以便在视频制作完成时接收通知
2.请求方法
Post
3.请求路径
https://www.qmai.vip/business/upload
4.请求参数
| 参数名 | 必填 | 说明 |
|---|---|---|
| companyKey | 是 | 企业上传凭证,可在用户详情页查看 |
| bonetype | 是 | 骨架类型,详见下方骨架类型表 |
| capturetype | 是 | 动捕类型,多个值用逗号分隔,如 "0,2,3" • 0:全身(默认) • 1:半身 • 2:手捕 • 3:面捕 • 5:自动判断(全身/半身) 注意:全身/半身/自动判断只能选一个 |
| videoFile | 是 | 视频文件,详见视频限制链接 |
| isStaticCamera | 否 | 摄像机状态:1(通用摄像机) |
| poseType | 否 | 第一帧姿势:1(TPose)、2(APose)、3(原视频) |
| mulPersonInfo | 否 | 多人视频目标框信息,单人可不传 |
| frameRate | 否 | 输出帧率(计费相关) 24/30:1 cv币/秒、120s 60:2 cv币/秒、60s 120:4 cv币/秒、30s |
| standPose | 否 | 原地动作:false(关闭)、true(开启) |
| physicType | 否 | 物理优化类型(计费相关): 1:(1.0版):1cv币/秒、 2:(2.0版):2cv币/秒 |
| physicTimes | 否 | 仅当 physicType=2 时有效,可选 1--6(6代表10次) |
| rollback_url | 否 | 回调地址(POST) |
4.1、骨架类型详情表(bonetype)
| 值 | 名称 | 支持功能 | 限制说明 |
|---|---|---|---|
| 1 | boyFBX 格式 | 帧率选择、原地动作、物理优化 V2.0 | 无 |
| 7 | girlFBX 格式 | 帧率选择、原地动作、物理优化 V2.0 | 无 |
| 3 | Mixamo 格式 | 帧率选择、原地动作、物理优化 V2.0、 | 不支持面捕(含3) |
| 4 | Unreal 4 格式 | 帧率选择、原地动作、物理优化 V2.0 | 不支持面捕(含3) |
| 13 | Unreal 5.5 格式 | 原地动作、帧率选择、物理优化 V2.0 | 不支持面捕(含3) |
| 14 | Unreal 5.6 格式 | 原地动作、帧率选择、物理优化 V2.0 | 不支持面捕(含3) |
| 11 | CC&iClone 格式 | 原地动作、帧率选择、物理优化 V2.0 | 不支持面捕(含3) |
| 2 | BIP 格式 | 帧率选择、原地动作、物理优化 V2.0 | 不支持面捕(含3) |
| 5 | VMD 格式 | 原地动作 | 无 |
| 10 | C4D 格式 | 原地动作、帧率选择、物理优化 V2.0 | 不支持面捕(含3) |
| 9 | OnlyFace 格式 | 原地动作、帧率选择 | capturetype 只能为 "1,3" |
| 12 | Roblox R15 格式 | 原地动作 | 不支持手捕(2)和面捕(3) |
| 8 | Unity-Anim 格式 | 原地动作、帧率选择、物理优化 V2.0 | 无 |
| 16 | Warudo-Anim 格式 | 原地动作、帧率选择、物理优化 V2.0 | 无 |
| 15 | BVH+blendshape.json 格式 | 原地动作、帧率选择、物理优化 V2.0 | 选择身体捕捉和手捕,只会输出BVH文件选择身体捕捉或手捕+面捕,会输出BVH文件+blendshape.json文件 |
5.响应信息
服务端将以 JSON 格式返回响应数据。成功的响应会包含状态码、消息和数据;错误的响应会包含状态码和错误信息。
Message:千面动捕参数校验消息和成功消息。
videoId:视频文件上传成功后会返回视频记录的ID号。
status:状态码
200:成功 600:系统异常 500:参数异常videoStatus:上传成功为待制作,否则为空。
6.python示例代码
# encoding=utf-8
import os
import requests
# Configuration
domain_url = "https://www.qmai.vip"
key = "f351974e-9d4e-46f1-b221-d0bf7c6d25df"
video_path = r"data\xiaoyu.mp4"
capture_type = "0"
bone_type = "1"
pose_type = "1"
# Ensure URL ends with "/"
if not domain_url.endswith("/"):
domain_url += '/'
# Check if video file exists
assert os.path.exists(video_path)
# Prepare data and files
files = {'videoFile': open(video_path, 'rb')}
data = {"capturetype": capture_type, "bonetype": bone_type, "companyKey": key, "pose_type": pose_type}
# API endpoint URL
url = f"{domain_url}business/upload/"
print(url)
print(data)
# Make API request
response = requests.post(url, data=data, files=files)
# Check response status
if response.status_code == 200:
print(response.text)
else:
print(f"{response.status_code}, 访问链接失败")7.回调地址响应信息
message:处理信息。
videoId:上传的视频ID。
status:接口调用状态
200:成功 600:系统异常 500:参数异常videoStatus:视频制作状态(待制作、制作中、制作完成、制作失败)。
8.python示例代码(含回调)
# encoding=utf-8
import os
import requests
# Configuration
domain_url = "https://www.qmai.vip"
key = "f351974e-9d4e-46f1-b221-d0bf7c6d25df"
video_path = r"data\xiaoyu.mp4"
capture_type = "0"
bone_type = "1"
pose_type = "1"
rollback_url = "http://192.168.141.68:80"
# Ensure URL ends with "/"
if not domain_url.endswith("/"):
domain_url += '/'
# Check if video file exists
assert os.path.exists(video_path)
# Prepare data and files
files = {'videoFile': open(video_path, 'rb')}
data = {
"capturetype": capture_type,
"bonetype": bone_type,
"companyKey": key,
"rollbackUrl": rollback_url,
"pose_type": pose_type
}
# API endpoint URL
url = f"{domain_url}business/upload/"
print(url)
print(data)
# Make API request
response = requests.post(url, data=data, files=files)
# Check response status
if response.status_code == 200:
print(response.text)
else:
print("访问链接失败")9.启动回调服务代码示例
import datetime
import sanic
from sanic import Sanic
from sanic.response import json
app = Sanic("test")
@app.route('/', methods=['POST'])
async def test(request: sanic.Request):
now_time = datetime.datetime.now()
print(f"Hello, {now_time}")
print(request.json)
return json({'hello': 'world'})
if __name__ == '__main__':
app.run(host="127.0.0.1", port=12345)
# test
# curl -X POST -H "Content-Type: application/json" -d '{"x":"1"}' -v 192.168.141.68:80