API调用视频审核
本文介绍了异步调用视频内容审核/v3/video/censor
的接口,帮助您正确使用此 API 进行视频内容审核,支持基于API URL发起HTTP/HTTPS POST请求的方式调用。
使用限制
- 视频大小不超过1G。
- 视频格式支持 mp4、flv、mov、avi、wmv、ts和mpg。
- 支持用户设定截帧频率,但单个视频最大截帧数为3000帧。如根据截帧频率计算出来的截帧数大于3000帧,则会按最大3000帧对整个视频进行均匀截帧。
- 接口响应时间依赖视频的下载时间。请保证被审核视频所在的存储服务稳定可靠,建议您使用七牛云存储或者CDN缓存等。
功能描述
视频内容审核 API 主要用于检测或识别视频中的不良信息,并给出审核结果管控建议。支持的审核类型包括:视频鉴黄、视频鉴暴恐、视频敏感人物识别。
审核类型scenes与相应的label/group
在提交内容审核任务时,您需要指定审核类型scenes;而在返回结果中,则包含了您指定的类型对应的label结果分类参数,具体label/group请参见图片内容审核。
请求说明
请求方式: POST
请求url: http://ai.qiniuapi.com/v3/video/censor
请求Header
字段 | 取值 |
---|---|
Content-Type | application/json |
Authorization | Qiniu <AccessKey>:<Sign> 注意: 用户请根据 AccessKey 和 SecretKey 后生成鉴权,以便进行身份验证, Sign 的取值以及Authorization 签名方法请参考七牛鉴权。 |
请求参数
字段 | 类型 | 是否必选 | 说明 |
---|---|---|---|
data.uri | string | Y | 视频URL地址,目前支持http、https和qiniu协议的资源。 |
data.id | string | N | 调用者设置的视频唯一标识,异步处理的返回结果中会带上该信息。 |
params.scenes | array | Y | 审核类型,必填字段,没有默认值,可选项:pulp/terror/politician/ads/behavior。 |
params.cut_param.interval_msecs | int | N | 截帧频率,单位:毫秒,默认为5000(5s),取值范围为1000~60000(即1s~60s)。 |
params.saver.bucket | string | N | 视频截帧文件存入的bucket,目前只支持存入七牛云华东的bucket。如何创建七牛云bucket,请参见文档。 |
params.saver.prefix | string | N | 保存的截帧文件的前缀。 |
params.hook_url | string | N | 视频检测结束后的回调地址。关于API调用视频审核回调文档,请参见文档 |
params.hook_auth | Boolean | N | true/false,默认为false,设置回调请求中加入请求头authorization,用于回调服务器鉴权 |
请求示例
POST /v3/video/censor HTTP/1.1
Host: ai.qiniuapi.com
Content-Type: application/json
Authorization: Qiniu YnxrxOSvGotRZpqkZnMzl_euuoqRzOKUd6zwbRju:r6a-o2UpBg6A4puIMnkCExH8lE8=
{
"data": {
"uri": "https://mars-assets.qnssl.com/scene.mp4",
"id": "video_censor_test"
},
"params": {
"scenes": [
"pulp",
"terror",
"politician"
],
"cut_param": {
"interval_msecs": 5000
}
}
}
注意: 请把 Authorization 换成您的账号七牛鉴权 QiniuToken
系统接受到请求后,会立即返回job_id,视频审核结果通过job_id获得。
HTTP/1.1 200 OK
Content-Type: application/json
{
"job": <job_id>
}
参数 | 类型 | 必选 | 说明 |
---|---|---|---|
job_id |
string | 是 | 服务器返回的,唯一标识该视频任务的ID。 |
通过job_id获取视频审核结果
请求语法
GET /v3/jobs/video/<job-id> HTTP/1.1
Host: ai.qiniuapi.com
Authorization: Qiniu <AccessKey>:<Sign>
注意: 需要在请求的 head 部分添加七牛鉴权,以进行用户身份验证。
参数 | 类型 | 必选 | 说明 |
---|---|---|---|
job_id |
string | 是 | 服务器返回的,唯一标识该视频任务的ID。 |
返回参数说明
字段 | 取值 | 说明 |
---|---|---|
id | string | 服务器返回的,唯一标识该视频任务的ID。 |
vid | string | 视频唯一标识,申请任务时传入的data.id。 |
request | json结构体 | 视频审核请求中的body。 |
status | string | 任务状态,WAITING/DOING/RESCHEDULED/FAILED/FINISHED ,RESCHEDULED 是指等待重试中。 |
result | json结构体 | 视频内容审核的返回结果,详情请查看*表.视频内容审核的返回结果* 。 |
created_at | string | 任务创建时间,如:2019-01-02T15:03:04。 |
updated_at | string | 任务更新时间,如:2019-01-02T15:03:04。 |
rescheduled_at | string | 任务重试时间,如:2019-01-02T16:03:04。 |
表.视频内容审核的返回结果
字段 | 取值 | 说明 |
---|---|---|
code | int | 处理状态:200 调用成功 |
message | string | 与code对应的状态描述信息 |
result.suggestion | string | 视频的审核结果管控建议说明 根据内容审核中各种审核类型的返回结果,系统会将审核结果转换成对应的管控建议,取值包括:[“block”,”review”,”pass”]。 suggestion=block:表示系统确认审核内容违规,建议您将其删除。 suggestion=review:表示系统无法确认审核内容是否违规,建议您进行人工复核。 suggestion=pass:表示系统确认审核内容正常,建议您忽略该文件。 |
result.scenes.<type> |
json结构体 | 审核类型,目前支持"pulp", “terror”, “politician” |
result.scenes.<type> .suggestion |
string | 该审核类型的结果管控建议,参见result.suggestion |
result.scenes.<type> .cuts[] |
array | 该审核类型的截帧审核结果数组 |
result.scenes.<type> .cuts[].suggestion |
string | 该审核类型的截帧审核结果管控建议,参见result.suggestion |
result.scenes.<type> .cuts[].offset |
int | 该审核类型的截帧的时间位置 |
result.scenes.<type> .cuts[].uri |
string | 该审核类型的截帧uri |
result.scenes.<type> .cuts[].details[] |
array | 该审核类型的截帧审核详细信息数组 |
result.scenes.<type> .cuts[].details[].suggestion |
string | 该审核类型的截帧审核结果详细的结果管控建议,参见result.suggestion |
result.scenes.<type> .cuts[].details[].label |
string | 该审核类型的截帧审核结果标签,具体请参见图片内容审核的label/group |
result.scenes.<type> .cuts[].details[].score |
string | 该审核类型的截帧审核结果置信度 |
result.scenes.politician.cuts[].details[].group | string | 该审核类型的截帧审核结果分组,具体请参见图片内容审核的label/group |
result.scenes.politician.cuts[].details[].sample.uri | string | 该敏感人物的参考图链接 |
result.scenes.politician.cuts[].details[].sample.pts | array | 参考图中敏感人物的人脸方框坐标 |
result.scenes.politician.cuts[].details[].detections[].pts | array | 截帧中检测到的敏感人物人方框坐标 |
result.scenes.politician.cuts[].details[].detections[].score | string | 截帧中检测到的人脸匹配为敏感人物的置信度 |
result.scenes.terror.cuts[].details[].detections[].pts | array | 当截帧审核结果label为以下五种时,该字段用于返回检测到的物体方框坐标: “illegal_flag:违规旗帜类” ”guns:枪” ”knives:刀” ”anime_knives:二次元刀” “anime_guns:二次元枪” |
result.scenes.terror.cuts[].details[].detections[].score | string | 截帧中检测到的物体置信度 |
返回示例
{
"id":"5c416b7afb09fe00089e37be",
"vid":"video_censor_test",
"request":{
...
},
"status":"FINISHED",
"result":{
"code":200,
"message":"OK",
"result":{
"suggestion":"pass",
"scenes":{
"politician":{
"cuts":[
{
"offset":0,
"suggestion":"pass"
},
{
"offset":657,
"suggestion":"pass"
}
],
"suggestion":"pass"
},
"pulp":{
"cuts":[
{
"details":[
{
"label":"normal",
"score":0.99976,
"suggestion":"pass"
}
],
"offset":0,
"suggestion":"pass"
},
{
"details":[
{
"label":"normal",
"score":0.99998,
"suggestion":"pass"
}
],
"offset":657,
"suggestion":"pass"
}
],
"suggestion":"pass"
},
"terror":{
"cuts":[
{
"details":[
{
"label":"normal",
"score":0.76111,
"suggestion":"pass"
}
],
"offset":0,
"suggestion":"pass"
},
{
"details":[
{
"label":"normal",
"score":0.52299,
"suggestion":"pass"
}
],
"offset":657,
"suggestion":"pass"
}
],
"suggestion":"pass"
}
}
}
},
"created_at":"2019-01-18T14:00:26.865+08:00",
"updated_at":"2019-01-18T14:01:01.148+08:00",
"rescheduled_at":"2019-01-18T14:00:26.865+08:00"
}
代码示例
注意
- 运行方法:
python VideoReview.py <censor | pulp | terror | politician> <uri>
,得到job_id - 代码中需填入账号的
ak
、sk
视频内容审核(VideoReview.py)
# -*- coding: utf-8 -*-
from qiniu import Auth, QiniuMacAuth, http
import requests, json, sys
access_key = '<ak>'
secret_key = '<sk>'
auth = QiniuMacAuth(access_key, secret_key)
url = 'http://ai.qiniuapi.com/v3/video/censor'
body = {
"data": {
"uri": "<uri>"
},
"params": {
"scenes":[],
"cut_param": {
"interval_msecs": 5000
}
}
}
ops = {
"censor": ["pulp","terror","politician"],
"pulp": ["pulp"],
"terror": ["terror"],
"politician": ["politician"],
}
body["params"]["scenes"] = ops[sys.argv[1]]
body["data"]["uri"] = sys.argv[2]
ret, res = http._post_with_qiniu_mac(url, body, auth)
headers = {"code": res.status_code, "reqid": res.req_id, "xlog": res.x_log}
print(json.dumps(headers, indent=4, ensure_ascii=False))
print(json.dumps(ret, indent=4, ensure_ascii=False))
注意
- 调用命令:
python VideoReview.py.py censor https://mars-assets.qnssl.com/scene.mp4
{
"reqid": "lSQAAPpUdoS3roUV, lSQAAPpUdoS3roUV",
"code": 200,
"xlog": "COMMON-GATE:2;AI:2"
}
{
"job": "5c6fe7f59a0b0500082b774f"
}
注意
- 运行方法:
python AsyncResult.py <job_id>
,得到视频审核结果 - 代码中需填入账号的
ak
、sk
通过job_id获取视频审核结果(AsyncResult.py)
# -*- coding: utf-8 -*-
from qiniu import Auth, QiniuMacAuth
import requests, json, sys
access_key = '<ak>'
secret_key = '<sk>'
auth = QiniuMacAuth(access_key, secret_key)
url = 'http://ai.qiniuapi.com/v3/jobs/video/' + sys.argv[1]
token = "Qiniu " + auth.token_of_request("GET", "ai.qiniuapi.com", url, "")
r = requests.get(url, headers={'Authorization': token})
print json.dumps(json.loads(r.text), indent=4, ensure_ascii=False)
注意
- 调用命令:
python AsyncResult.py 5c6fe7f59a0b0500082b774f
{
"status": "FINISHED",
"rescheduled_at": "2019-02-22T20:15:49.931+08:00",
"created_at": "2019-02-22T20:15:49.931+08:00",
"request": {
"params": {
"cut_param": {
"interval_msecs": 5000
},
"sync": false,
"scenes": [
"pulp",
"terror",
"politician"
]
},
"data": {
"uri": "https://mars-assets.qnssl.com/scene.mp4"
}
},
"updated_at": "2019-02-22T20:15:52.426+08:00",
"result": {
"message": "OK",
"code": 200,
"result": {
"scenes": {
"terror": {
"suggestion": "pass",
"cuts": [
{
"details": [
{
"score": 0.8864266,
"suggestion": "pass",
"label": "normal"
}
],
"suggestion": "pass",
"offset": 520
},
{
"details": [
{
"score": 0.99499327,
"suggestion": "pass",
"label": "normal"
}
],
"suggestion": "pass",
"offset": 5520
}
]
},
"politician": {
"suggestion": "pass",
"cuts": [
{
"suggestion": "pass",
"offset": 520
},
{
"suggestion": "pass",
"offset": 5520
}
]
},
"pulp": {
"suggestion": "pass",
"cuts": [
{
"details": [
{
"score": 0.6159534,
"suggestion": "pass",
"label": "normal"
}
],
"suggestion": "pass",
"offset": 520
},
{
"details": [
{
"score": 0.65406007,
"suggestion": "pass",
"label": "normal"
}
],
"suggestion": "pass",
"offset": 5520
}
]
}
},
"suggestion": "pass"
}
},
"id": "5c6fe7f59a0b0500082b774f"
}
服务价格
视频内容审核是对视频截帧后,进行截帧图片内容审核,所以视频内容审核的价格实际使用的是截帧图片审核的价格,与图片内容审核共用范围。
1)按照设置的截帧频率对视频进行截帧,不额外收费
2)对截帧进行图片内容审核
图片内容审核价格请参考。
示例:
某月客户视频文件使用视频鉴黄服务,视频截帧的数量为400万,即视频鉴黄产生的图片鉴黄量为400万;当月图片文件使用鉴黄服务,其调用量为106万。则这个月总的图片鉴黄调用量为506万,账单金额则为:
图片鉴黄:
3000000*0.155/100+2000000*0.145/100=4650+2900=7550元