zhanghua
2023-04-14 e8a0f05f99f33fa05085536541da6bc27e66a644
ycl-platform/src/main/java/com/ycl/util/VideoUtil.java
@@ -40,74 +40,82 @@
     **/
    @SneakyThrows
    public String getVideo(String code, String scheme, Integer subType) {
        System.out.println("开始视频请求:" + code);
        String clientType = "winpc";
        String reqUrl = "/videoService/accounts/authorize";
        String deviceUrl = "/videoService/devicesManager/devices";
        // System.out.println("开始视频请求:" + code);
        try {
            String clientType = "winpc";
            String reqUrl = "/videoService/accounts/authorize";
            String deviceUrl = "/videoService/devicesManager/devices";
//        String monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme=" + scheme + "&channelId=";
        String monitorUrl = "/videoService/realmonitor/uri?trackId=&encryptedInfo=&userId=&urlType=1&keyIndex=&regionId=&packtype=Private&planId=&subType=" + subType + "&isroute=false&streamType=&locationEnable=false&domainId=&duration=600&scheme=RTSP&dataType=2&extend=&channelId=";
        if (!"RTSP".equals(scheme)) {
            monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme=" + scheme + "&channelId=";
            String monitorUrl = "/videoService/realmonitor/uri?trackId=&encryptedInfo=&userId=&urlType=1&keyIndex=&regionId=&packtype=Private&planId=&subType=" + subType + "&isroute=false&streamType=&locationEnable=false&domainId=&duration=600&scheme=RTSP&dataType=2&extend=&channelId=";
            if (!"RTSP".equals(scheme)) {
                monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme=" + scheme + "&channelId=";
            }
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
                @Override
                public boolean hasError(HttpStatus status) {
                    return super.hasError(status);
                }
                @Override
                public void handleError(URI url, HttpMethod method, ClientHttpResponse response) {
                }
            });
            SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
            simpleClientHttpRequestFactory.setOutputStreaming(false);
            restTemplate.setRequestFactory(simpleClientHttpRequestFactory);
            //请求头
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.setContentType(MediaType.APPLICATION_JSON);
            //第一次权限请求体
            FirstReq firstReq = new FirstReq();
            firstReq.setIpAddress(ip);
            firstReq.setUserName(userName);
            firstReq.setClientType(clientType);
            ObjectMapper objectMapper = new ObjectMapper();
            HttpEntity<String> firstEntity = new HttpEntity<>(objectMapper.writeValueAsString(firstReq), httpHeaders);
            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url + reqUrl, firstEntity, String.class);
            FirstRes firstRes = objectMapper.readValue(responseEntity.getBody(), FirstRes.class);
            String signature = MD5Util.md5Encrypt(passWord);
            signature = MD5Util.md5Encrypt(userName + signature);
            signature = MD5Util.md5Encrypt(signature);
            signature = MD5Util.md5Encrypt(userName + ":" + firstRes.getRealm() + ":" + signature);
            signature = MD5Util.md5Encrypt(signature + ":" + firstRes.getRandomKey());
            SecondReq secondReq = new SecondReq();
            secondReq.setIpAddress(ip);
            secondReq.setEncryptType(firstRes.getEncryptType());
            secondReq.setSignature(signature);
            secondReq.setRandomKey(firstRes.getRandomKey());
            secondReq.setClientType(clientType);
            secondReq.setUserName(userName);
            HttpEntity<String> secondEntity = new HttpEntity<>(objectMapper.writeValueAsString(secondReq), httpHeaders);
            ResponseEntity<String> secondResEntity = restTemplate.postForEntity(url + reqUrl, secondEntity, String.class);
            HttpHeaders deviceHeaders = new HttpHeaders();
            deviceHeaders.add("X-Subject-Token", objectMapper.readTree(secondResEntity.getBody()).get("token").textValue());
            HttpEntity<Object> deviceEntity = new HttpEntity<>(deviceHeaders);
            // System.out.println("视频设备请求地址:" + url + deviceUrl + "/" + code);
            ResponseEntity<String> exchange = restTemplate.exchange(url + deviceUrl + "/" + code, HttpMethod.GET, deviceEntity, String.class);
            // System.out.println("开始视频身份请求结果:" + exchange.getBody());
            String channelId = objectMapper.readTree(objectMapper.readTree(objectMapper.readTree(exchange.getBody()).get("encoderUnit").toString()).get("channels").get(0).toString()).get("channelId").textValue();
            // System.out.println("视频请求地址:" + url + monitorUrl + channelId);
            ResponseEntity<String> monitorReq = restTemplate.exchange(url + monitorUrl + channelId, HttpMethod.GET, deviceEntity, String.class);
            // System.out.println("视频请求返回参数:" + monitorReq.getBody());
            return objectMapper.readTree(monitorReq.getBody()).get("url").textValue();
        } catch (Exception ex) {
            System.out.println("获取视频异常:" + ex);
            return "获取地址失败,请检查code值";
        }
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
            @Override
            public boolean hasError(HttpStatus status) {
                return super.hasError(status);
            }
            @Override
            public void handleError(URI url, HttpMethod method, ClientHttpResponse response) {
            }
        });
        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
        simpleClientHttpRequestFactory.setOutputStreaming(false);
        restTemplate.setRequestFactory(simpleClientHttpRequestFactory);
        //请求头
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        //第一次权限请求体
        FirstReq firstReq = new FirstReq();
        firstReq.setIpAddress(ip);
        firstReq.setUserName(userName);
        firstReq.setClientType(clientType);
        ObjectMapper objectMapper = new ObjectMapper();
        HttpEntity<String> firstEntity = new HttpEntity<>(objectMapper.writeValueAsString(firstReq), httpHeaders);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url + reqUrl, firstEntity, String.class);
        FirstRes firstRes = objectMapper.readValue(responseEntity.getBody(), FirstRes.class);
        String signature = MD5Util.md5Encrypt(passWord);
        signature = MD5Util.md5Encrypt(userName + signature);
        signature = MD5Util.md5Encrypt(signature);
        signature = MD5Util.md5Encrypt(userName + ":" + firstRes.getRealm() + ":" + signature);
        signature = MD5Util.md5Encrypt(signature + ":" + firstRes.getRandomKey());
        SecondReq secondReq = new SecondReq();
        secondReq.setIpAddress(ip);
        secondReq.setEncryptType(firstRes.getEncryptType());
        secondReq.setSignature(signature);
        secondReq.setRandomKey(firstRes.getRandomKey());
        secondReq.setClientType(clientType);
        secondReq.setUserName(userName);
        HttpEntity<String> secondEntity = new HttpEntity<>(objectMapper.writeValueAsString(secondReq), httpHeaders);
        ResponseEntity<String> secondResEntity = restTemplate.postForEntity(url + reqUrl, secondEntity, String.class);
        HttpHeaders deviceHeaders = new HttpHeaders();
        deviceHeaders.add("X-Subject-Token", objectMapper.readTree(secondResEntity.getBody()).get("token").textValue());
        HttpEntity<Object> deviceEntity = new HttpEntity<>(deviceHeaders);
        // System.out.println("视频设备请求地址:" + url + deviceUrl + "/" + code);
        ResponseEntity<String> exchange = restTemplate.exchange(url + deviceUrl + "/" + code, HttpMethod.GET, deviceEntity, String.class);
        // System.out.println("开始视频身份请求结果:" + exchange.getBody());
        String channelId = objectMapper.readTree(objectMapper.readTree(objectMapper.readTree(exchange.getBody()).get("encoderUnit").toString()).get("channels").get(0).toString()).get("channelId").textValue();
        // System.out.println("视频请求地址:" + url + monitorUrl + channelId);
        ResponseEntity<String> monitorReq = restTemplate.exchange(url + monitorUrl + channelId, HttpMethod.GET, deviceEntity, String.class);
        // System.out.println("视频请求返回参数:" + monitorReq.getBody());
        return objectMapper.readTree(monitorReq.getBody()).get("url").textValue();
    }
}