You need to enable JavaScript to run this app.
文档中心
复制全文
下载 pdf
AI中台公用文档
常见问题指南
复制全文
下载 pdf
常见问题指南
视觉服务(人像人体/图像技术/视频技术)​
  1. 如何获取调用API必需的AK/SK?​
  • 未上架控制台的能力需要联系商务申请授权​
  1. 视频人脸融合异步接口中,任务有效期是多久?​
  • 12H,超过12H后,无法获取结果​
  1. 同步转异步接口中,提交任务接口返回的taskID有效期是多久?​
  • 24H,超过24H后,无法获取结果​
  1. 返回的图片链接/视频链接过期时间是多久?​
  • 图片链接为24H,超过24H后,需要重新生成​
  • 视频链接为1H,超过1H后,需要重新生成​
  1. 返回的资源地址的域名有哪些?​
  • v3-vvecloud.yangyi08.com​
  • v6-vvecloud.yangyi08.com​
  • v9-vvecloud.yangyi08.com​
  • v26-vvecloud.yangyi08.com​
  1. 如何稳定持续的保持指定QPS去请求接口​
​
Python
​
​
# coding:utf-8​
from __future__ import print_function​
import time​
import threading​
from queue import Queue, Empty​
import datetime​
from concurrent.futures import ThreadPoolExecutor​
import collections​
​
from volcengine import visual​
from volcengine.visual.VisualService import VisualService​
​
​
def send_request(visual_service, req_body, request_count, result_queue):​
"""发送请求并将结果放入队列"""​
try:​
start_time = time.time()​
resp = visual_service.cv_process(req_body)​
end_time = time.time()​
​
result_queue.put({​
'request_index': request_count,​
'response': resp,​
'time': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'),​
'elapsed': end_time - start_time​
})​
except Exception as e:​
result_queue.put({​
'request_index': request_count,​
'error': str(e),​
'time': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')​
})​
​
​
class TokenBucket:​
"""令牌桶算法实现精确的QPS控制"""​
​
def __init__(self, rate):​
"""​
初始化令牌桶​
​
Args:​
rate: 每秒产生的令牌数量(即目标QPS)​
"""​
self.rate = rate # 令牌生成速率​
self.capacity = rate # 桶容量​
self.tokens = 0 # 当前令牌数量​
self.last_time = time.time() # 上次更新令牌的时间​
self.lock = threading.Lock() # 线程锁​
​
def _add_tokens(self):​
"""添加令牌到桶中"""​
now = time.time()​
elapsed = now - self.last_time​
new_tokens = elapsed * self.rate​
​
self.tokens = min(self.capacity, self.tokens + new_tokens)​
self.last_time = now​
​
def get_token(self, block=True):​
"""​
获取一个令牌​
​
Args:​
block: 如果为True,则阻塞直到获取到令牌;否则立即返回是否获取到令牌​
​
Returns:​
获取到令牌时返回True,否则返回False​
"""​
with self.lock:​
self._add_tokens()​
​
if self.tokens >= 1:​
self.tokens -= 1​
return True​
elif not block:​
return False​
​
# 如果需要阻塞等待,计算需要等待的时间​
wait_time = (1 - self.tokens) / self.rate​
time.sleep(wait_time)​
​
# 再次尝试获取令牌​
with self.lock:​
self._add_tokens()​
self.tokens -= 1​
return True​
​
​
def process_results(result_queue, count_lock, success_count, failure_count):​
"""单独的线程处理结果队列"""​
while True:​
try:​
result = result_queue.get(block=True, timeout=0.1)​
if result is None: # 结束信号​
break​
​
if 'error' in result:​
with count_lock:​
failure_count[0] += 1​
print(f"请求 {result['request_index']} 失败: {result['error']} 时间: {result['time']}")​
else:​
with count_lock:​
success_count[0] += 1​
print(f"请求 {result['request_index']} 成功, 耗时: {result['elapsed']:.4f}秒, 时间: {result['time']}")​
# 打印完整响应​
# print(f"完整响应内容: {result['response']}")​
except Empty:​
continue​
except Exception as e:​
print(f"处理结果时出错: {e}")​
​
​
def maintain_qps(ak, sk, req_body, target_qps=3, duration_seconds=None, max_workers=100):​
"""维持指定的QPS发送请求​
​
Args:​
ak: AccessKey of your account​
sk: SecretKey of your account​
req_body: 请求体​
target_qps: 目标每秒请求数,默认3​
duration_seconds: 运行持续时间(秒),如果为None则一直运行​
max_workers: 最大线程池工作线程数,默认100​
"""​
visual_service = VisualService()​
​
# call below method if you don't set ak and sk in $HOME/.volc/config​
visual_service.set_ak(ak)​
visual_service.set_sk(sk)​
​
request_count = 0​
success_count = [0] # 使用列表包装,便于在线程间共享​
failure_count = [0]​
start_time = time.time()​
result_queue = Queue()​
# 添加线程锁,保护共享资源​
count_lock = threading.Lock()​
​
# 创建线程池,限制最大线程数以防资源浪费​
executor = ThreadPoolExecutor(max_workers=max_workers)​
​
# 创建令牌桶控制QPS​
token_bucket = TokenBucket(target_qps)​
​
# 创建结果处理线程​
result_thread = threading.Thread(​
target=process_results,​
args=(result_queue, count_lock, success_count, failure_count)​
)​
result_thread.daemon = True​
result_thread.start()​
​
print(f"开始以精确的 {target_qps} QPS 频率发送请求...")​
​
try:​
# 记录上次打印统计信息的时间​
last_stats_time = start_time​
​
while duration_seconds is None or time.time() - start_time < duration_seconds:​
# 获取令牌(阻塞直到获取到令牌)​
token_bucket.get_token(block=True)​
​
with count_lock:​
request_count += 1​
current_request_index = request_count​
​
# 提交请求任务到线程池​
executor.submit(​
send_request,​
visual_service, req_body,​
current_request_index, result_queue​
)​
​
# 每10秒打印一次当前QPS和成功/失败统计​
current_time = time.time()​
if current_time - last_stats_time >= 10:​
current_qps = request_count / (current_time - start_time)​
print(f"当前平均QPS: {current_qps:.2f}, 已发送请求数: {request_count}, 成功: {success_count[0]}, 失败: {failure_count[0]}")​
last_stats_time = current_time​
​
except KeyboardInterrupt:​
print("\n用户中断,停止发送请求")​
finally:​
# 发送结束信号给结果处理线程​
result_queue.put(None)​
# 等待结果处理线程结束​
result_thread.join(timeout=2)​
# 关闭线程池,等待所有任务完成​
executor.shutdown(wait=False)​
​
total_time = time.time() - start_time​
print(f"总共发送了 {request_count} 个请求,成功: {success_count[0]}, 失败: {failure_count[0]}, 耗时 {total_time:.2f} 秒")​
print(f"平均QPS: {request_count / total_time:.2f}")​
​
​
if __name__ == '__main__':​
# 调用函数维持3QPS,如果需要限制运行时间,可以设置duration_seconds参数​
ak = "your-ak"​
sk = "your-sk=="​
req_body = {​
"req_key": "high_aes_general_v21_L",​
"prompt": "千军万马",​
"return_url": True,​
}​
target_qps = 3 # 有可能会因为网络延迟问题导致实际请求打到接口时大于目标QPS,建议此QPS比接口限制略小​
max_workers = target_qps * 30 * 1.2 # 所需线程数 = QPS × 平均响应时间(秒) × 冗余率​
maintain_qps(ak, sk, req_body, target_qps, max_workers=max_workers)​
​
​
​
  1. 如何稳定持续的保持指定并发去请求接口​
​
Python
​
​
# coding:utf-8​
from __future__ import print_function​
import concurrent.futures​
import time​
import datetime​
import os​
​
from volcengine import visual​
from volcengine.visual.VisualService import VisualService​
​
​
def call_api(form, request_id):​
"""调用API的函数"""​
visual_service = VisualService()​
​
# call below method if you don't set ak and sk in $HOME/.volc/config​
visual_service.set_ak('your-ak')​
visual_service.set_sk(​
'your-sk==')​
​
start_time = time.time()​
request_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')​
​
try:​
resp = visual_service.cv_process(form)​
end_time = time.time()​
duration = end_time - start_time​
print(f"请求 #{request_id} 成功, 耗时: {duration:.4f}秒, 请求时间: {request_time}")​
return resp, request_id, duration, request_time, True​
except Exception as e:​
end_time = time.time()​
duration = end_time - start_time​
print(f"请求 #{request_id} 失败, 耗时: {duration:.4f}秒, 请求时间: {request_time}, 错误: {str(e)}")​
return str(e), request_id, duration, request_time, False​
​
def maintain_concurrency(concurrency=3):​
"""保持指定的并发数量"""​
print(f"开始以 {concurrency} 并发数量发送请求...")​
​
request_counter = 0​
success_counter = 0​
failure_counter = 0​
start_time = time.time()​
​
with concurrent.futures.ThreadPoolExecutor(max_workers=concurrency) as executor:​
# 初始提交concurrency个任务​
futures = set() ​
req_body = {​
"req_key": "high_aes_general_v30l_zt2i",​
"prompt": "美丽的姑娘",​
"return_url": True,​
}​
# 先提交concurrency个任务​
try:​
for _ in range(concurrency):​
request_counter += 1​
futures.add(executor.submit(call_api, req_body, request_counter))​
​
# 保持并发数量​
while futures:​
# 获取已完成的future​
done, futures = concurrent.futures.wait(​
futures, ​
return_when=concurrent.futures.FIRST_COMPLETED​
)​
​
for future in done:​
try:​
result, req_id, duration, req_time, is_success = future.result()​
if is_success:​
success_counter += 1​
# 如果需要打印完整响应,取消下面这行的注释​
# print(f"响应内容: {result}")​
else:​
failure_counter += 1​
except Exception as e:​
print(f"处理结果时出错: {e}")​
​
# 补充新的任务,保持并发数​
for _ in range(len(done)):​
try:​
request_counter += 1​
futures.add(executor.submit(call_api, req_body, request_counter))​
​
# 每10个请求打印一次统计信息​
if request_counter % 10 == 0:​
elapsed = time.time() - start_time​
print(f"已发送请求数: {request_counter}, 成功: {success_counter}, 失败: {failure_counter}, 运行时间: {elapsed:.2f}秒")​
except StopIteration:​
# 没有更多请求了​
break​
​
except StopIteration:​
# 如果请求数量少于并发数,会在初始提交时触发StopIteration​
pass​
​
except KeyboardInterrupt:​
print("用户中断,停止发送请求")​
​
# 打印最终统计信息​
total_time = time.time() - start_time​
print(f"总共发送了 {request_counter} 个请求,成功: {success_counter}, 失败: {failure_counter}, 总耗时: {total_time:.2f}秒")​
​
if __name__ == '__main__':​
maintain_concurrency(3) # 保持3并发​
​
​
  1. 如何取消异步调用接口​
【注意】当前不支持取消generating状态的任务;​
Query参数​
​
Action​
Version​
CVCancelTask​
2024-06-06​
​
Header参数,主要用于鉴权,详见 公共参数 - 签名参数 - 在Header中的场景部分​
注意​
本服务固定值:Region为cn-north-1,Service为cv​
Body参数​
注意​
业务请求参数,放到request.body中,MIME-Type为application/json​
​
参数​
类型​
可选/必选​
说明​
req_key​
string​
必选​
服务标识,接口服务的reqkey​
task_id​
string​
必选​
任务ID​
​
请求示例:​
​
{​
"req_key": "接口服务req_key",​
"task_id": "<任务task_id>",​
}​
​
返回示例:​
​
{​
'ResponseMetadata': {​
'Action': 'CVCancelTask',​
'Region': 'cn-north-1',​
'RequestId': '20260305163450832702219043ADB5DC86',​
'Service': 'cv',​
'Version': '2024-06-06'​
},​
'Result': {​
'code': 10000,​
'data': {​
'req_key': '接口服务req_key',​
'task_id': '任务id'​
},​
'message': 'Success',​
'request_id': '20260305163450832702219043ADB5DC86',​
'status': 10000,​
'time_elapsed': '88.408746ms'​
}​
}​
​
调用示例可参考:https://www.volcengine.com/docs/6444/1390583?lang=zh;​
身份认证服务​
1.什么是有源比对,无源比对?​
a. 第一种解答:​
  • 无源是端上采集人脸与客户上传的人脸做比对​
  • 有源是姓名+身份证号+端上采集人脸一起送到公安数据源做比对​
b. 第二种解答:​
  • 有源无源是两块产品,差异点在于核验的源不同。​
  • 身份认证(有源认证):是指活体验证真人之后,活体截取的用户人脸图+姓名+身份证号去和公安数据源核对是否本人的一致性;​
  • 身份认证(无源认证):是指活体验证真人之后,活体截取的人脸图+业务上传的基准图进行对比,判断是否同一人;​
2.有源和无源比对的通过阈值默认分别是多少?​
  • 有源:70分​
  • 无源:90分​
3.身份认证H5的降级策略,什么情况下会走降级​
  • 拒绝相机权限​
  • 浏览器不支持getUserMedia获取媒体输入​
  • 机型性能差,通过帧率阈值判断(阈值为10,小于10走降级)​
  • 检测浏览器渲染是否异常​
由于设备类型多,浏览器版本多,所以是否支持实时刷脸,主要有以下几个细节:​
设备本身是否支持webRTC特性(https://developer.mozilla.org/zh-CN/docs/Web/API/WebRTC_API)​
在实际测试反馈中,部分小米自带浏览器、UC浏览器、夸克浏览器下的webRTC能力不稳定,所以针对这三类浏览器,统一默认不支持。​
根据一些case表明,ios 15_1 系统的浏览器也是不支持webRTC​
4.Android webview异常走降级模式,未弹出申请相机权限​
  • 检查系统中,app是否已授权相机权限​
  • 在webview中授权打开相机权限,参考:https://www.jianshu.com/p/aa589c05c307​
5.身份认证H5链接打开后提示鉴权失败​
  • 检查参数是否已经进行urlencode,对于特殊字符的参数必须编码​
  • 检查是否链接过长导致截断​
  • 如果是集成到app,可以参考Demo:​
​
​
Android H5 Demo.zip
​
​
​
​
​
IOS H5 Demo.zip
​
​
6.小程序原生调用 H5,人脸认证完成后如何接收通知​
​Image​​
7.APP内拉起H5活体认证失败,如何校验设备是否正常?​
​Image​​
  • 打开这个链接测试采集功能:https://webrtc.github.io/samples/src/content/getusermedia/gum/​
​
Replay
Play
00:00 / 00:08 Live
00:00
Fullscreen
Cssfullscreen
1x
  • 2x
  • 1.5x
  • 1x
  • 0.75x
  • 0.5x
Click and hold to drag
​
​
8.身份认证H5兼容性相关文档?​
9.身份认证双端SDK release-note?​
10.身份认证增强版高风险的判断标准是什么?​
  • 高风险判断标签:​
  • 安装篡改摄像头工具或应用​
  • 篡改摄像头相关的高风险rom​
  • Hook​
  • 安装接码平台​
  • wifi硬件缺失​
  • 改机、群控​
  • 虚拟系统、模拟器运行​
  • 系统时间穿越​
  • SO 文件被修改​
  • 调试行为​
11.如果碰到视频录制异常的情况如何排查?​
  • 更换浏览器或设备重试,兼容性有以下标准​
​
当前接入身份认证H5的场景,主要有以下几种:​
- 手机自带浏览器 ​
- 第三方浏览器 ​
- 微信内置浏览器 ​
- 小程序(微信、支付宝)​
- App Webview (Android、IOS)​
客户的业务产品,面向的用户群体十分庞大,用户访问的真实场景更加复杂:​
- 数十个手机品牌​
- 同一个手机品牌,不同的手机系统版本​
- 同一个手机系统版本,不同的浏览器厂商​
- 同一个浏览器厂商,不同的浏览器版本​
以上几种组合互相搭配,至少有几千种情况,涉及范围很广,浏览器厂商、内核开发团队等也要不断的发布新版本修复Bug,任何一个H5服务都不能百分百保证兼容所有场景。​
因此H5只能最大限度按照W3C标准Web API来实现所有能力​
关于W3C的介绍:https://www.chinaw3c.org/standards.html​
W3C、微软、谷歌将文档都统一迁入了 MDN,所有标准规范皆可查询:https://developer.mozilla.org/zh-CN/​
​
12.同一身份证超过限制次数 same id card exceed limit times?​
  • 账户默认是15,可以通过控制台-频控管理进行配置​
​Image​​
13.三要素是否支持港澳台身份证?​
  • 不支持​
14.身份认证H5走ocr的流程,调用token接口,url链接拼接了byteToken,查询结果时候,redirectUrl后面的byteToken查询不到数据。​
  • 如果使用了ocr上传身份信息的接口,就无需再次调用token接口。url链接上不用再拼接byteToken了​
15.身份认证SDK认证页打不开​
  • 校验设备时间​
  • 看一下本地日志​
16.身份认证H5页面报错“输入参数不合法”​
  • 大概率网络抖动导致视频丢失,尝试重新认证​
控制台相关​
1.QPS增项包购买生效和失效时间​
​Image​​
  • 选择当日时间,则下单即生效,到第二天中午12:00失效​
2.开通某个接口服务的时候一直在开通中​
进入 业务总览 - 服务管理 ,将开通中的服务关闭,重新开通​
​Image​​
3.正式调用过程中,调接口突然出现报错“Access Denied”​
  • 欠费24H内冲正,服务会自动恢复​
4.是否支持按项目进行账单分账?​
支持,可参考项目分账说明​
​
最近更新时间:2026.03.05 20:10:13
这个页面对您有帮助吗?
有用
有用
无用
无用