环境:windows10、jdk17、springboot3

文档概述 · 萤石开放平台API文档icon-default.png?t=N7T8https://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;
    }

请求参数:

参数名类型描述是否必选
accessTokenString授权过程获取的access_tokenY
deviceSerialString设备序列号例如427734222,均采用英文符号,限制最多50个字符Y
channelNoInteger通道号,非必选,默认为1N
protocolInteger流播放协议,1-ezopen、2-hls、3-rtmp、4-flv,默认为1N
codeStringezopen协议地址的设备的视频加密密码N
expireTimeInteger过期时长,单位秒;针对hls/rtmp/flv设置有效期,相对时间;30秒-720天N
typeString地址的类型,1-预览,2-本地录像回放,3-云存储录像回放,非必选,默认为1;回放仅支持rtmp、ezopen、flv协议N
qualityInteger视频清晰度,1-高清(主码流)、2-流畅(子码流)N
startTimeString本地录像/云存储录像回放开始时间,云存储开始结束时间必须在同一天,示例:2019-12-01 00:00:00N
stopTimeString本地录像/云存储录像回放结束时间,云存储开始结束时间必须在同一天,示例:2019-12-01 23:59:59N
supportH265Integer请判断播放端是否要求播放视频为H265编码格式,1表示需要,0表示不要求N
playbackSpeedString回放倍速。倍速为 -1( 支持的最大倍速)、0.5、1、2、4、8、16;
仅支持protocol为4-flv

type为2-本地录像回放( 部分设备可能不支持16倍速) 或者 3-云存储录像回放
N
gbchannelString国标设备的通道编号,视频通道编号IDN

        添加如果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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐