视频合成

  视频合成服务是基于模板变量替换的服务,区别于普通的视频创作API,基于模板变量的合成服务可通过简单的模板合成API接入即可实现复杂内容定义的模板生成,无需理解视频元素布局、内容定义等,适用于剪同款、一键替换等场景下的视频合成服务。同时智云的MGC合成渲染引擎提供serverless能力,高并发任务下依旧能保障合成效率。

域名说明

https://api.shuwen.com

用于自动化合成的包含多组排列有序的元素集合的标准化数据结构,模板通过卡片组装而成。模板定义了一个视频中的每个画面元素,这些元素有些可以通过外部输入进行替换,有些则是使用模板创建之初所用的素材。

一个模版当中会有很多的卡片,由多个有序的卡片组合而成。其中的每个卡片都会有很多的变量素材组成。卡片概念是针对一组有共性、通用的一组素材(视频、图片等)而组成的一个抽象概念。

1. 获取变量模板列表

标题部分 1. 获取变量模板列表
  • 请求path:/external/template/authorize/query?pageNo=1&pageSize=10&query=模板
  • 请求类型:GET
字段是否必填类型说明
queryString搜索信息, 搜索模板标题或模板 id
pageNoInteger当前页数
pageSizeInteger页面大小
字段类型说明
templateIdString模板 Id
nameString模板名称
previewObject模板预览信息
gmtCreateLong创建时间
gmtModifyLong修改时间

preview结构:

字段类型说明
previewImgString模板预览封面
previewVideoString模板预览视频
  • 返回样例
{
  "records": [
    {
      "templateId": "a689f48205f1458da3c8cc1679c98076",
      "name": "转存验证2",
      "gmtCreate": 1663566348110,
      "gmtModify": 1663566475672,
      "preview": {
        "previewImg": "http://xhzy-test.oss-cn-hangzhou.aliyuncs.com/jimu_upload/TEST/2022-09-19/%E9%AB%98%E5%85%B4_v64e1.gif",
        "previewVideo": "http://xhzy-test.oss-cn-hangzhou.aliyuncs.com/jimu_upload/TEST/2022-09-19/%E9%AB%98%E5%85%B4_v64e1.gif"
      }
    }
  ],
  "total": "1",
  "size": "12",
  "current": "1",
  "pageSize": "12",
  "pageNo": "1",
  "pages": "1",
  "searchCount": true
}

2. 获取模板变量列表

标题部分 2. 获取模板变量列表
  • 请求path:/external/template/get_variables/{templateId}
  • 请求类型:GET
字段是否必填类型说明
templateIdString模板 ID
字段类型说明
unitKeyString卡片 key, 卡片的唯一标识
variablesList<Object>卡片变量, 每张卡片上的入参变量

variables结构:

字段类型说明
keyString变量 key, 卡片上变量的唯一标识
typeString变量类型, 标明使用该变量的组件类型
nameString变量描述, 说明该变量需要使用什么数据作为入参
dataFormatObject可视化组件变量描述
当组件为可视化组件类型时, 对该组件入参格式的说明,不同组件的数据格式也会不同, 可能是数组或对象等
例如下面的样例, 折线图组件需要数组数据, 公司简介需要对象数据
extInfoObject其他变量信息, 在做 数字人和声音 替换时, 传入对应值

type枚举值:

枚举类型说明
video视频组件
image图片组件
audio音频组件
subtitle字幕组件
tts语音组件
vizz可视化组件
virtual_host虚拟主播组件
  • 返回样例
[
  {
    "unitKey": "xxx",
    "variables": [
      {
        "key": "yyy",
        "type": "tts",
        "name": "变量描述1",
        "extInfo": {
          "per": "请填入发音人编号"
        }
      },
      {
        "key": "zzz",
        "type": "vizz_old",
        "name": "折线图变量",
        "dataFormat": [
          {
            "x": "文字1", // x 轴坐标值
            "y": 76 // y 轴坐标值
          },
          {
            "x": "文字2", // x 轴坐标值
            "y": 88 // y 轴坐标值
          },
          {
            "x": "文字3", // x 轴坐标值
            "y": 164 // y 轴坐标值
          }
        ]
      },
      {
        "key": "uuu",
        "type": "vizz_old",
        "name": "公司简介组件变量",
        "dataFormat": {
          "id": "601288", // 公司代码
          "name": "农业银行", // 公司名称
          "date": "2010-07-15" // 公司上市时间
        }
      }
    ]
  }
]
  • 请求path:/external/template/produce
  • 请求类型:POST
字段是否必填类型说明
templateIdString模板 ID
callbackUrlString回调接口地址, 合成完成后, 自动回调接口发送结果
templateVariablesList<Object>根据第一步获得的数据结构, 填入模板变量入参

templateVariables结构:

字段是否必填类型说明
unitKeyString卡片 key, 卡片的唯一标识
variablesList<Object>卡片变量, 每张卡片上的入参变量

variables结构:

字段是否必填类型说明
keyString变量 key, 卡片上变量的唯一标识
valueObject变量值
卡片变量的入参值
- video、image、audio,value值即为素材对象,MediaObject类型
- subtitle,value值即为文本内容,String类型
- tts,value值即为文本内容,String类型
- vizz,value值即为Data数据内容,Object 类型
- virtual_host,value值即为文本内容,String类型
extInfoObject其他变量信息, 在做 数字人和声音 替换时, 传入对应值
replaceTypeString元素替换类型
替换策略
移除元素 - removeVariable
移除卡片 - removeCard
兼容显示当前素材 - undo
模板不合成 - removeAll

extInfo结构:

字段是否必填类型说明
avatarString数字人形象, 虚拟主播形象衣服中的代码
perString发音人, 声音代码

replaceType枚举值:

枚举类型说明
removeVariable移除元素
removeCard移除卡片
undo兼容显示当前素材
removeAll模板不合成
  • 请求示例
{
    "templateId": "986de72cb8f74d4695a201a1fe61a31a",
    "templateVariables": [
        {
            "unitKey": "xxx",
            "variables": [
                {
                    "key": "yyy",
                    "value": "变量填充1"
                },
                {
                    "key": "uuu",
                    "value": {
                        "id": "601288", // 公司代码
                        "name": "农业银行", // 公司名称
                        "date": "2010-07-15" // 公司上市时间
                    }
                }
            ]
        }
    ]
}
字段类型说明
dataString合成的视频 id, 建议业务方打印返回的任务id,用于合成链路排查使用
  • 返回样例
{
    "success":true,
    "code":"",
    "message":"",
    "requestId":"18b4932f5e1b8695",
    "data":"2dd965de203545d5ad53af26d615ded2"
}
  • 请求path:/external/play_job/detail/{jobId}
  • 请求类型:GET
字段是否必填类型说明
jobIdString视频 id
字段类型说明
jobIdString视频 ID
jobTypeInteger视频类型, 任务执行类型: 0 - 单视频任务;1 - 批量视频任务
bizIdString业务标示ID, 业务自定义标示,
jobType 为 0 时, bizId 是模板 ID
jobType 为 1 时, bizId 是任务 ID
playTitleString合成视频名称, 默认使用模板名称作为视频名称
dictParamObject数据字典, 批量任务使用, 合成视频时, 使用到的数据入参
dataTimeString数据时间, 批量任务使用, 合成视频时的数据时间
batchNoString批次号, 批量任务使用, 视频对应的任务批次号
jobStatusInteger视频状态
jobResultObject合成结果
synthStartedLong合成发起时间, 发起智能模板合成请求的时间
synthUpdatedLong合成完成时间, 接收到智能模板合成结果的时间
triggerUserIdString触发用户id, 触发合成的用户 id
belongUserIdString归属用户id, 模板的用户 id
tenantIdString机构id, 模板的机构 id

jobStatus枚举值:

枚举类型说明
0作业初始化
1构建成功
11构建失败
2协议转换成功
21协议转换失败
3发起合成任务
4合成任务成功
41合成任务失败

jobResult结构:

字段类型说明
requestIdString合成请求 ID
taskStatusString合成任务状态
messageString合成消息
durationDouble视频时长
coverUrlObject视频封面
urlString视频链接
  • 返回样例
{
    "success":true,
    "code":"",
    "message":"",
    "requestId":"631066fd96d317d506cd3ab1250adb74",
    "data":{
        "id":"497",
        "status":0,
        "gmtCreate":1662014052000,
        "gmtModified":1662014057000,
        "deleted":0,
        "jobId":"2dd965de203545d5ad53af26d615ded2",
        "jobType":0,
        "bizId":"986de72cb8f74d4695a201a1fe61a31a",
        "playTitle":"转存封面验证",
        "jobStatus":4,
        "synthStarted":1662014052000,
        "synthUpdated":1662014057000,
        "jobResult":{
            "coverUrl":{
                "default":"https://***/4b4f4c2cc512431483d7b4fcdbc74c21_default.png"
            },
            "duration":3.019,
            "requestId":"jimu_2dd965de203545d5ad53af26d615ded2",
            "taskStatus":"mgcFinish",
            "url":"http://***/4b4f4c2cc512431483d7b4fcdbc74c21.mp4"
        },
        "triggerUserId":"236422856946230278",
        "belongUserId":"236422856946230278",
        "tenantId":"132066159006606348"
    }
}

5. 任务结果回调接口(客户提供)

标题部分 5. 任务结果回调接口(客户提供)

客户需按下述规范提供回调接口

  • 请求path:(客户提供)
  • 请求类型:POST

Query 入参

字段是否必填类型说明
timestampString时间戳, 接口调用时的时间戳
signatureString加签信息, 加签信息计算规则
md5(sk + $ + timestamp + $ + ak)
timestamp 就是上面的入参
aksk 与向客户提供的 aksk 相同
为保证接口请求安全, 客户需验证接收到的加签信息是否一致

Body 入参

字段是否必填类型说明
jobIdString视频 ID
jobTypeInteger视频类型, 任务执行类型: 0 - 单视频任务;1 - 批量视频任务
bizIdString业务标示ID, 业务自定义标示,
jobType 为 0 时, bizId 是模板 ID
jobType 为 1 时, bizId 是任务 ID
playTitleString合成视频名称, 默认使用模板名称作为视频名称
dictParamObject数据字典, 批量任务使用, 合成视频时, 使用到的数据入参
dataTimeString数据时间, 批量任务使用, 合成视频时的数据时间
batchNoString批次号, 批量任务使用, 视频对应的任务批次号
jobStatusInteger视频状态
jobResultObject合成结果
synthStartedLong合成发起时间, 发起智能模板合成请求的时间
synthUpdatedLong合成完成时间, 接收到智能模板合成结果的时间
triggerUserIdString触发用户id, 触发合成的用户 id
belongUserIdString归属用户id, 模板的用户 id
tenantIdString机构id, 模板的机构 id
  • 请求示例
{
    "id":"497",
    "status":0,
    "gmtCreate":1662014052000,
    "gmtModified":1662014057000,
    "deleted":0,
    "jobId":"2dd965de203545d5ad53af26d615ded2",
    "jobType":0,
    "bizId":"986de72cb8f74d4695a201a1fe61a31a",
    "playTitle":"转存封面验证",
    "jobStatus":4,
    "synthStarted":1662014052000,
    "synthUpdated":1662014057000,
    "jobResult":{
        "coverUrl":{
            "default":"https://***/4b4f4c2cc512431483d7b4fcdbc74c21_default.png"
        },
        "duration":3.019,
        "requestId":"jimu_2dd965de203545d5ad53af26d615ded2",
        "taskStatus":"mgcFinish",
        "url":"http://***/4b4f4c2cc512431483d7b4fcdbc74c21.mp4"
    },
    "triggerUserId":"236422856946230278",
    "belongUserId":"236422856946230278",
    "tenantId":"132066159006606348"
}
字段类型说明
successBoolean是否调用成功, 返回接口是否调用成功的标识
  • 返回样例
{
    "success":true
}

失败code码:

错误码说明
SW-JM-1000系统异常, 请联系管理员
SW-JM-1001参数错误
SW-JM-1002用户账号异常
SW-JM-2001模板操作异常