Skip to content
On this page

视频上传接口

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)

名称支持功能限制说明
1boyFBX 格式帧率选择、原地动作、物理优化 V2.0
7girlFBX 格式帧率选择、原地动作、物理优化 V2.0
3Mixamo 格式帧率选择、原地动作、物理优化 V2.0、不支持面捕(含3)
4Unreal 4 格式帧率选择、原地动作、物理优化 V2.0不支持面捕(含3)
13Unreal 5.5 格式原地动作、帧率选择、物理优化 V2.0不支持面捕(含3)
14Unreal 5.6 格式原地动作、帧率选择、物理优化 V2.0不支持面捕(含3)
11CC&iClone 格式原地动作、帧率选择、物理优化 V2.0不支持面捕(含3)
2BIP 格式帧率选择、原地动作、物理优化 V2.0不支持面捕(含3)
5VMD 格式原地动作
10C4D 格式原地动作、帧率选择、物理优化 V2.0不支持面捕(含3)
9OnlyFace 格式原地动作、帧率选择capturetype 只能为 "1,3"
12Roblox R15 格式原地动作不支持手捕(2)和面捕(3)
8Unity-Anim 格式原地动作、帧率选择、物理优化 V2.0
16Warudo-Anim 格式原地动作、帧率选择、物理优化 V2.0
15BVH+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