视频文件异步识别
视频识别主要是截图识别,当待审核视频较大或时长较长时,截图及识别耗时较长,用户可以通过该接口进行异步识别,识别结果将以回调的方式通知用户。除去回调外,用户也可以 主动查询识别结果。
调用该接口时会返回 videoId
作为该视频(也即本次审核任务)的唯一标识,并在回调请求中携带 videoId
。同样的,主动查询识别结果时也需要提供 videoId
。
1. 调用说明
任务处理并发
测试 secretId
视频异步处理最大并发为 30 个,即同时处理最大数量为 30 个。超出的任务会排队进行处理。正式调用时可以联系我们,根据需求调整并发数。
支持格式
支持的格式包括:flv
, mkv
, mp4
, rmvb
, avi
, wmv
, 3gp
, ts
, mov
, gif
, m3u8
, mpg/mpeg
, mxf
。
截图分辨率
如果视频的分辨率的短边超过 1024
,则截取的图片以 1024/短边
等比例截取。
例如:视频分辨率为 1920x1080
,截图的分辨率为 1820x1024
。
2. 请求
2.1 请求地址
区域 | 请求地址 |
---|---|
国内 | http://api.video.tuputech.com/v3/recognition/video/asyncscan/<secretId> |
国外 | http://api-us.open.tuputech.com/v3/recognition/video/asyncscan/<secretId> |
<secretId> 需替换为您的 secretId
,请联系我们为您开通 secretId
。
2.2 请求方法
POST
2.3 请求头
参数名称 | 类型 | 是否必需 | 说明 |
---|---|---|---|
Content-Type | String | 是 | application/json |
2.3 请求参数
参数名称 | 类型 | 是否必需 | 说明 |
---|---|---|---|
timestamp | Int | 是 | 当前的服务器的 Unix 时间戳,可以是毫秒或秒级 |
nonce | Int | 是 | 随机数 |
signature | String | 是 |
|
video | String | 是 | 视频链接地址 |
callbackUrl | String | 否 | 识别结果回调接口地址,用于接收 POST 回调;未指定时忽略回调 |
audio | Boolean | 否 | 是否开启语音识别,默认 false |
customInfo | Object<String, String/Int> | 否 | 自定义信息,用于给视频附加额外信息(例如:直播房间号,主播 ID 等) |
callbackRules | CallbackRules | 否 | 回调规则,用于筛选回调数据,默认回调违规标签的数据,详见 CallbackRules |
interval | Int | 否 | 视频截图间隔,单位为秒;取值范围为 [1, 10] ,默认 3 秒 |
task | Array<String> | 否 | 指定本次执行的识别任务 ID,默认为空(即执行应用(SID)下配置的所有识别任务) |
CallbackRules
参数名称 | 类型 | 是否必需 | 说明 |
---|---|---|---|
<taskId> | Array<callbackRule> | 否 | 识别任务的回调规则,数据结构详见 CallbackRule |
CallbackRules
数据结构是一个 Object,key 为 taskId
, value 为 CallbackRule
数组。
CallbackRule
参数名称 | 类型 | 是否必需 | 说明 |
---|---|---|---|
label | Int | 否 | 不为空时,仅回调指定的识别分类 |
review | Boolean | 否 | 不为空时,仅回调指定的复审类型 |
2.4 请求示例
{
"video": "<video url>",
"customInfo": {
"roomId": "<room id>"
},
"interval": 1,
"callbackUrl": "<callback url>",
"callbackRules": {
"54bcfc6c329af61034f7c2fc": [{
"label": 0,
"review": false
}, {
"label": 1,
"review": false
}]
},
"audio": false,
"task": [
"54bcfc6c329af61034f7c2fc"
],
"timestamp": 1559554003759,
"nonce": 1559554003759,
"signature": "p0fX2Vb5JMtN0wM7WkQR...5ivuTBO/jDueWhoxEI9Y="
}
3. 同步响应
3.1 响应内容
接口返回带签名的 JSON 数据,业务数据需要用户解析 json
字段获得
参数名称 | 类型 | 说明 |
---|---|---|
signature | String | 响应内容签名,由图普使用私钥签名,在需要时,您可以通过 图普公钥 进行验签以确保此响应内容来自图普(与您调用接口时使用的公私钥不同)。验签步骤:
|
json | String | 响应或回调内容经过 JSON 转义后的字符串 |
json 参数
参数名称 | 类型 | 说明 |
---|---|---|
code | Int | 状态码,参考公共状态码 |
message | String | 状态信息 |
nonce | Number | 随机数 |
timestamp | Number | 当前的服务器的 Unix 时间戳 |
videoId | String | 视频唯一标识,长度为 20~64 的字符串(可能随着服务迭代发生变化) |
3.2 响应示例
{
"json": "{\"code\":0,\"message\":\"success\",\"nonce\":1559554003759,\"timestamp\":1559554003759,\"videoId\":\"617b99fb021942117f715ea7\"}",
"signature": "p0fX2Vb5JMtN0wM7WkQR...5ivuTBO/jDueWhoxEI9Y="
}
4. 识别结果回调
4.1 回调说明
视频识别结果通过回调通知用户,请求方式为 POST,请求体为带签名的 JSON 数据。
当用户回调接口返回 HTTP 状态码 200
响应时,即认为回调成功。如果 HTTP 状态码不为 200
,会重试最多 2 次。
4.2 回调参数
参数名称 | 类型 | 说明 |
---|---|---|
signature | String | 响应内容签名,由图普使用私钥签名,在需要时,您可以通过 图普公钥 进行验签以确保此响应内容来自图普(与您调用接口时使用的公私钥不同)。验签步骤:
|
json | String | 响应或回调内容经过 JSON 转义后的字符串 |
json 参数
参数名称 | 类型 | 说明 |
---|---|---|
code | Int | 状态码,参考公共状态码 |
message | String | 状态信息 |
nonce | Number | 随机数 |
timestamp | Number | 当前的服务器的 Unix 时间戳 |
suggestion | Number | 汇总结果,整体的通过/拒绝情况,参考 汇总结果解析 |
riskType | Number | 汇总结果,整体的风险类型,参考 汇总结果解析 |
videoInfo | VideoInfo | 视频信息,详见VideoInfo。 |
customInfo | Object | 自定义信息,请求参数中的 customInfo |
<taskId> | Object | 识别任务的结果,每个识别任务会有 全局固定不变 的 taskId 和对应数据结构,详见各识别任务回调参数 |
VideoInfo
参数名称 | 类型 | 说明 |
---|---|---|
id | String | 视频唯一标识 |
captureStart | String | 视频截图开始时间,ISO 时间 |
capturedImages | Int | 视频截图数量 |
duration | Int | 视频时长,单位为秒 |
frames | Int | 视频帧数 |
status | String | 已弃用。视频识别状态,可能的值有:end - 识别正常error - 识别出错 |
message | String | 已弃用。视频识别结果信息 |
4.3 各识别任务回调参数
图像类任务:
语音类任务:
4.4 识别结果回调示例
{
"json": "{\"code\":0,\"message\":\"success\",\"nonce\":1559554003759,\"timestamp\":1559554003759,\"videoInfo\":{}}",
"signature": "p0fX2Vb5JMtN0wM7WkQR...5ivuTBO/jDueWhoxEI9Y="
}
json 字段经过解析后内容如下:
{
"videoInfo": {
"id": "5d0b2f0511b3e74eadf152dd",
"captureStart": "2019-06-20T07:00:22.851Z",
"duration": 8.5,
"frames": 204,
"status": "end",
"message": "success"
},
"customInfo": {
"id": 1
},
// 图片分类
"54bcfc6c329af61034f7c2fc": {
// 指定 label 的部分图片列表
"fileList": [
{
"url": "https://static.tuputech.com/api/image/original/cloud-api/storage-0831/2019-06-20/15-7/5c8760515a82342809627fea/15610140357610.8919706822430384.jpg",
"rate": 0.7911882400512695,
"label": 0,
"review": false,
"offset": 0
}
],
"avgScores": [
{
"score": 0.9632003605365753,
"label": 0
},
{
"score": 0.036799637170042844,
"label": 1
}
],
"maximums": [
{
"max": 0.9982892870903015,
"label": 0
},
{
"max": 0.18442420661449432,
"label": 1
}
],
"statistics": [
{
"count": 10,
"label": 0
},
{
"count": 0,
"label": 1
}
],
"label": 0,
"review": false
},
// 图片搜索
"5b7be1f59b0c77a8c2afb351": {
// 指定 label 的部分图片列表
"fileList": [
{
"url": "https://static.tuputech.com/api/image/original/cloud-api/storage-0831/2019-06-20/15-7/5c8760515a82342809627fea/15610140357660.906444779265335.jpg",
"similarity": 0.32518404722213745,
"label": 2,
"review": false,
"facePosition": [
[
0.19140625,
0.25
],
[
0.3125,
0.25
],
[
0.3125,
0.4652777777777778
],
[
0.19140625,
0.4652777777777778
]
],
"typeName": "外国政治人物",
"faceId": "金正恩",
"personId": "5cc01fe9da417194068fdd41",
"offset": 0
}
],
"statistics": [
{
"count": 1,
"label": 0
},
{
"count": 3,
"label": 2
},
{
"count": 6,
"label": 3
}
],
// 匹配的全部人物列表
"matchList": [
{
"personId": "5cc01fe9da417194068fdd41",
"faceId": "金正恩",
"typeName": "外国政治人物"
}
],
"label": 0,
"review": false
},
// 人物搜索
"5e13f8b2170dd16ec51f2c95": {
// 匹配的全部图片列表
"fileList": [
{
"url": "https://static.tuputech.com/api/image/original/cloud-api/storage-0831/2019-06-20/15-7/5c8760515a82342809627fea/15610140357660.906444779265335.jpg",
"scene": "politician",
"similarity": 0.32518404722213745,
"label": 2,
"review": false,
"facePosition": [
[
0.19140625,
0.25
],
[
0.3125,
0.25
],
[
0.3125,
0.4652777777777778
],
[
0.19140625,
0.4652777777777778
]
],
"typeName": "外国政治人物",
"faceId": "金正恩",
"personId": "5cc01fe9da417194068fdd41",
"offset": 0
}
],
"statistics": [
{
"count": 1,
"label": 0
},
{
"count": 3,
"label": 2
},
{
"count": 6,
"label": 3
}
],
// 匹配的全部人物列表
"matchList": [
{
"scene": "politician",
"personId": "5cc01fe9da417194068fdd41",
"faceId": "金正恩",
"typeName": "外国政治人物"
}
]
},
// 自定义图库
"5c8f44ca25ade48455a63bad": {
"maximums": [
{
"max": 0.7245864868164062,
"label": 2
}
],
"statistics": [
{
"count": 4,
"label": 2
}
],
"fileList": [
{
"url": "https://static.tuputech.com/api/image/original/cloud-api/storage-0831/2019-06-20/15-7/5c8760515a82342809627fea/15610140357660.906444779265335.jpg",
"label": 2,
"similarity": 0.6458022594451904,
"relatives": [
{
"path": "https://static.tuputech.com/lts/image/original/lts-52/LTS-Bucket-UserDefineImages/2019-03-29/cloud-api/storage-0831/2019-03-29/10/0.9202317260827633/15538277415580.7420568768203986.jpg",
"score": 0.6458022594451904
}
],
"offset": 10
}
],
"label": 2
},
// 语音转译结果
"5caee6b2a76925c55a09a6d2": {
"violations": [
{
"startTime": 12,
"endTime": 15,
"content": "毛泽东",
"action": "block",
"label": "Politics",
"review": false,
"rate": 0.896484,
"details": [
{
"keyword": "毛泽东",
"hint": "毛泽东",
"mainLabel": "Politics",
"subLabel": "National_Leader"
}
]
}
],
"text": "毛泽东你好"
},
// 低俗语音
"5c8213b9bc807806aab0a574": {
"violations": [
{
"label": 1,
"review": false,
"details": [
{
"startTime": 10,
"endTime": 20,
"label": 1,
"rate": 0.9998823404
}
]
}
]
},
// OCR文本审核
"5e1d634d2809c24f6d909bd3": {
// 指定 label 的部分图片列表
"fileList": [
{
"url": "https://static.tuputech.com/api/image/original/cloud-api/storage-0831/2019-06-20/15-7/5c8760515a82342809627fea/15610140357660.906444779265335.jpg",
"text": "毛泽东",
"scores": 0.9951668977737427,
"degree": 0,
"location": [
[
0.4256518406293357,
0.5753968315895163
],
[
0.5806905895660593,
0.5753968315895163
],
[
0.5806905895660593,
0.65079364460096
],
[
0.4256518406293357,
0.65079364460096
]
],
"textAnalysis": {
"label": 3,
"review": false,
"rate": 0.9,
"details": [
{
"keyword": "毛泽东",
"hint": "毛泽东",
"mainLabel": 3
}
]
},
"offset": 10
}
],
"avgScores": [
{
"score": 0.9,
"label": 3
}
],
"maximums": [
{
"max": 0.9,
"label": 3
}
],
"statistics": [
{
"count": 1,
"label": 3
}
],
"label": 3,
"review": false
},
// 违禁台标
"5dca1869d3d8752b37f94ee1": {
"fileList": [
{
"url": "https://static.tuputech.com/api/image/original/cloud-api/storage-233/2020-06-01/17-7/5c8760515a82342809627fea/15910053542810.3343467625425356.jpg",
"location": [
[
0.03537565228836477,
0.03303825855255127
],
[
0.2027942005938315,
0.03303825855255127
],
[
0.2027942005938315,
0.271730899810791
],
[
0.03537565228836477,
0.271730899810791
]
],
"category": 0,
"scores": 0.9999051094055176,
"offset": 1
}
],
"avgScores": [
{
"score": 0.39996163845062255,
"category": 0
}
],
"maximums": [
{
"max": 0.9999051094055176,
"category": 0
}
],
"statistics": [
{
"count": 2,
"category": 0
}
]
},
// logo检测
"5eeadb619ac44c1316975f51": {
"avgScores": [
{
"score": 0.745452880859375,
"category": 0
}
],
"maximums": [
{
"max": 0.80084228515625,
"category": 0
}
],
"statistics": [
{
"count": 2,
"category": 0
}
],
"fileList": [
{
"url": "https://static.tuputech.com/api/image/original/cloud-api/storage-0831/2020-08-24/14-7/5c8760515a82342809627fea/15982522135770.7805975910322889.jpg",
"location": [
[
0.06879091262817383,
0.05533757335261295
],
[
0.1368561167466013,
0.05533757335261295
],
[
0.1368561167466013,
0.16865464260703636
],
[
0.06879091262817383,
0.16865464260703636
]
],
"degree": 0,
"category": 0,
"scores": 0.80072021484375,
"text": "logo",
"offset": 1
}
]
},
"code": 0,
"message": "success",
"nonce": "0.9994704892215807",
"timestamp": 1561014050113
}