环境:windows10、jdk17、springboot3
文档概述 · 萤石开放平台API文档https://open.ys7.com/help/81
1.导入依赖
<dependency>
<groupId>com.ezviz.open</groupId>
<artifactId>ezviz-openplatform</artifactId>
<version>1.1.6.RELEASE</version>
</dependency>
2.根据appKey和secret获取accessToken
登录官网获取appkey、secret
萤石开放平台-提供持续稳定的以音视频为主的全场景、多功能综合性服务
/**
* 获取token
* @author luobei
* @return
*/
private static String getToken() {
// STEP1:设置平台参数
ArtemisConfig.host = host;
ArtemisConfig.appKey = appKey;
ArtemisConfig.appSecret = appSecret;
// STEP2:设置OpenAPI接口的上下文
final String previewUrlsApi = EzvizConstant.TOKEN_PATH; // 示例API路径,请根据实际情况修改
Map<String, String> path = new HashMap<String, String>(2) {{put("https://", previewUrlsApi);}};
// STEP4:设置参数提交方式
String contentType = "application/x-www-form-urlencoded";
// STEP5:组装请求参数
Map<String, String> params = new HashMap<>();
params.put("appKey", appKey);
params.put("appSecret", appSecret);
// 将参数转换为URL编码格式
StringBuilder encodedParams = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
if (encodedParams.length() > 0) {
encodedParams.append("&");
}
encodedParams.append(entry.getKey()).append("=").append(entry.getValue());
}
String body = encodedParams.toString();
String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);
if (StringUtils.isEmpty(result)) {
return null;
}
JsonObject jsonObject = new JsonParser().parse(result).getAsJsonObject();
EzvizConstant.setToken(jsonObject.get("data").getAsJsonObject().get("accessToken").getAsString());
return result;
}
3.获取视频播放地址
private static String getCameraPreviewUrl(String deviceSerial) {
/* STEP1:设置平台参数,根据实际情况,设置host apKey appSecret 三个参数.*/
// artemis网关服务器ip端口
ArtemisConfig.host = host;
ArtemisConfig.appKey = appKey;
ArtemisConfig.appSecret = appSecret;
/*** STEP2:设置OpenAPI接口的上下文*/
final String previewUrlsApi = EzvizConstant.PLAY_PATH;
Map<String, String> path = new HashMap<String, String>(2) {
{
//根据现场环境部署确认是http还是https
put("https://", previewUrlsApi);
}
};
// STEP4:设置参数提交方式
String contentType = "application/x-www-form-urlencoded";
// STEP5:组装请求参数
Map<String, String> params = new HashMap<>();
params.put("accessToken", EzvizConstant.getTOKEN());
params.put("deviceSerial", deviceSerial);
//流播放协议,1-ezopen、2-hls、3-rtmp、4-flv,默认为1
params.put("protocol", "2");
//过期时长,单位秒;针对hls/rtmp/flv设置有效期,相对时间;30秒-720天
params.put("expireTime", "7200");
//地址的类型,1-预览,2-本地录像回放,3-云存储录像回放,非必选,默认为1;回放仅支持rtmp、ezopen、flv协议
params.put("type", "1");
//视频清晰度,1-高清(主码流)、2-流畅(子码流)
params.put("quality", "1");
// 将参数转换为URL编码格式
StringBuilder encodedParams = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
if (encodedParams.length() > 0) {
encodedParams.append("&");
}
encodedParams.append(entry.getKey()).append("=").append(entry.getValue());
}
String body = encodedParams.toString();
String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);
return result;
}
请求参数:
参数名 | 类型 | 描述 | 是否必选 |
---|---|---|---|
accessToken | String | 授权过程获取的access_token | Y |
deviceSerial | String | 设备序列号例如427734222,均采用英文符号,限制最多50个字符 | Y |
channelNo | Integer | 通道号,非必选,默认为1 | N |
protocol | Integer | 流播放协议,1-ezopen、2-hls、3-rtmp、4-flv,默认为1 | N |
code | String | ezopen协议地址的设备的视频加密密码 | N |
expireTime | Integer | 过期时长,单位秒;针对hls/rtmp/flv设置有效期,相对时间;30秒-720天 | N |
type | String | 地址的类型,1-预览,2-本地录像回放,3-云存储录像回放,非必选,默认为1;回放仅支持rtmp、ezopen、flv协议 | N |
quality | Integer | 视频清晰度,1-高清(主码流)、2-流畅(子码流) | N |
startTime | String | 本地录像/云存储录像回放开始时间,云存储开始结束时间必须在同一天,示例:2019-12-01 00:00:00 | N |
stopTime | String | 本地录像/云存储录像回放结束时间,云存储开始结束时间必须在同一天,示例:2019-12-01 23:59:59 | N |
supportH265 | Integer | 请判断播放端是否要求播放视频为H265编码格式,1表示需要,0表示不要求 | N |
playbackSpeed | String | 回放倍速。倍速为 -1( 支持的最大倍速)、0.5、1、2、4、8、16; 仅支持protocol为4-flv 且 type为2-本地录像回放( 部分设备可能不支持16倍速) 或者 3-云存储录像回放 | N |
gbchannel | String | 国标设备的通道编号,视频通道编号ID | N |
添加如果token过期就刷新的机制
public static String urlByCode(String deviceSerial) throws InterruptedException {
String json = getCameraPreviewUrl(deviceSerial);
String url = parseUrlFromJson(json);
if (url != null) {
return url;
}
getToken();
json = getCameraPreviewUrl(deviceSerial);
return parseUrlFromJson(json);
}
private static String parseUrlFromJson(String json) {
if (StringUtils.isEmpty(json)) {
return null;
}
JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
if (jsonObject != null && jsonObject.get("code") != null) {
if ("0".equals(jsonObject.get("code").getAsString())) {
JsonObject dataObject = jsonObject.getAsJsonObject("data");
if (dataObject != null) {
return dataObject.get("url").getAsString();
}
} else if ("10002".equals(jsonObject.get("code").getAsString())) {
// token过期,刷新token
return null;
}
}
return null;
}
4.云台控制
开始云台控制
/**
* 开始云台控制
* @author luobei
*/
public static String startCameraControl(String deviceSerial,String direction) throws InterruptedException {
String json = startControl(deviceSerial,direction);
String url = parseUrlFromJson(json);
if (url != null) {
return url;
}
getToken();
json = getCameraPreviewUrl(deviceSerial);
return parseUrlFromJson(json);
}
private static String startControl(String deviceSerial,String direction) {
/* STEP1:设置平台参数,根据实际情况,设置host apKey appSecret 三个参数.*/
// artemis网关服务器ip端口
ArtemisConfig.host = host;
ArtemisConfig.appKey = appKey;
ArtemisConfig.appSecret = appSecret;
/*** STEP2:设置OpenAPI接口的上下文*/
final String previewUrlsApi = EzvizConstant.START_PATH;
Map<String, String> path = new HashMap<String, String>(2) {
{
//根据现场环境部署确认是http还是https
put("https://", previewUrlsApi);
}
};
// STEP4:设置参数提交方式
String contentType = "application/x-www-form-urlencoded";
// STEP5:组装请求参数
Map<String, String> params = new HashMap<>();
params.put("accessToken", EzvizConstant.getTOKEN());
params.put("deviceSerial", deviceSerial);
//通道号
params.put("channelNo", "1");
//操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距,16-自动控
params.put("direction", direction);
//云台速度:0-慢,1-适中,2-快,海康设备参数不可为0
params.put("speed", "1");
// 将参数转换为URL编码格式
StringBuilder encodedParams = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
if (encodedParams.length() > 0) {
encodedParams.append("&");
}
encodedParams.append(entry.getKey()).append("=").append(entry.getValue());
}
String body = encodedParams.toString();
String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);
return result;
}
停止云台控制
/**
* 停止云台控制
* @author luobei
*/
public static String stopCameraControl(String deviceSerial,String direction) throws InterruptedException {
String json = stopControl(deviceSerial,direction);
String url = parseUrlFromJson(json);
if (url != null) {
return url;
}
getToken();
json = getCameraPreviewUrl(deviceSerial);
return parseUrlFromJson(json);
}
private static String stopControl(String deviceSerial,String direction) {
/* STEP1:设置平台参数,根据实际情况,设置host apKey appSecret 三个参数.*/
// artemis网关服务器ip端口
ArtemisConfig.host = host;
ArtemisConfig.appKey = appKey;
ArtemisConfig.appSecret = appSecret;
/*** STEP2:设置OpenAPI接口的上下文*/
final String previewUrlsApi = EzvizConstant.PLAY_PATH;
Map<String, String> path = new HashMap<String, String>(2) {
{
//根据现场环境部署确认是http还是https
put("https://", previewUrlsApi);
}
};
// STEP4:设置参数提交方式
String contentType = "application/x-www-form-urlencoded";
// STEP5:组装请求参数
Map<String, String> params = new HashMap<>();
params.put("accessToken", EzvizConstant.getTOKEN());
params.put("deviceSerial", deviceSerial);
//通道号
params.put("channelNo", "1");
//操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距,16-自动控
params.put("direction", direction);
// 将参数转换为URL编码格式
StringBuilder encodedParams = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
if (encodedParams.length() > 0) {
encodedParams.append("&");
}
encodedParams.append(entry.getKey()).append("=").append(entry.getValue());
}
String body = encodedParams.toString();
String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);
return result;
}
5.问题
- "msg":"加密已开启","code":"60019"
- 视频编码非H.264
配置下设备主码流为H.264