• vod回调设置


    HTTP形式回调)续上一篇上传视频,发现了一个问题当你阿里云那边设置了视频转码,如果上传完成后你立即去获取视频信息,会返回你视频还在转码中无法获取视频信息,看了阿里的回调api 写回调事件,当视频回调转码成功后再去填充数据里的视频信息
    需注意如果你设置了回调URL鉴权后,他会发两个"X-VOD-TIMESTAMP",“X-VOD-SIGNATURE” 这样做是防止别人恶意刷你的链接
    URL鉴权api链接
    回调事件类型api链接

    上代码:

    AliyunVideoUtils.callbackUrl// 这个是你设置回调的url  
    AliyunVideoUtils.privateKey  //这个是你设置鉴权让你预设的签名Key~
    public void callback(@RequestBody String body, HttpServletRequest request, HttpServletResponse response) {
            try {
                String vodTimestamp = request.getHeader("X-VOD-TIMESTAMP");   //UNIX时间戳,整形正数,固定长度10,1970年1月1日以来的秒数,表示回调请求发起时间~
                String vodSignature = request.getHeader("X-VOD-SIGNATURE");    //签名字符串,为32位MD5值
                String sign = DigestUtils
                        .md5Hex(AliyunVideoUtils.callbackUrl + "|" + vodTimestamp + "|" + AliyunVideoUtils.privateKey); //以这种形式拼接起来 下面进行对比
                if (!sign.equalsIgnoreCase(vodSignature)) { //进行对比   此操作是防止别人通过 你的链接刷数据
                    logger.warn("阿里云视频回调签名不通过!X-VOD-TIMESTAM={},X-VOD-SIGNATURE={}", vodTimestamp, vodSignature);
                } else {
                    logger.info("阿里云视频回调:{}", body);
                    if (StringUtils.isNotBlank(body)) {
                        // 判断事件,如此事件是视频转码完成,根据videoId 来获取视频信息来填充数据库
                        Map<String, Object> map = jsonToMap(body);// 此方法是将返回来的json字符串 转为map   下面有这方法
                        //断送事件类型 有很多个事件类型  我这是单个视频转码成功事件类型 通过判断 EventType 来确认是回调了什么事件类型再处理
                       //注意他会回两个这个事件 ,因有m3u8与MP4 所以 我根据 FileUrl拿后缀名去减少多于的循环
                        if (map.get("EventType").toString().equalsIgnoreCase("StreamTranscodeComplete")
                                && map.get("Status").toString().equalsIgnoreCase("success")
                                && map.get("FileUrl").toString()
                                        .substring(map.get("FileUrl").toString().lastIndexOf(".") + 1)
                                        .equalsIgnoreCase("mp4")) {
                            String videoId = map.get("VideoId").toString();
                            List<CourseVideo> courseVideos = courseVideoService.findByVideoUrl(videoId);
                            if (courseVideos != null && courseVideos.size() > 0) {
                                for (CourseVideo courseVideo : courseVideos) {
                                //经过多个判断通过后 调用我上一次写的工具类来获取转码成功后的视频 信息 并填充到数据库
                                    GetPlayInfoResponse playInfo = AliyunVideoUtils.getPlayInfo(videoId);
                                    if (playInfo != null) {
                                        // courseVideo.setCoverUrl(playInfo.getVideoBase().getCoverURL()); //  我以第一帧去做封面 但3000秒后失效 所以不要存到数据库中  我是当controlle拿数据填充 View时再将这些视频信息填充到实体类(我是实体类中有暂存字段的)中
                                        courseVideo.setStatus(CourseVideoStatus.DRAFT.getValue());
                                        courseVideo.setDuration(
                                                Integer.parseInt(playInfo.getPlayInfoList().get(0).getDuration()));
                                    } else {
                                        logger.warn("阿里云视频获取不到视频信息:{}", "VideoId:" + videoId);
                                    }
                                }
                                courseVideoService.save(courseVideos);
                            } else {
                                logger.warn("未找到相对于的课程视频信息,videoId={}", videoId);
                            }
                        } else if (map.get("EventType").toString().equalsIgnoreCase("ImageUploadComplete")
                                && map.get("Status").toString().equalsIgnoreCase("success")) {
                            // 图片上传回调
                        }
                    }
                }
            } catch (Exception e) {
                logger.error("阿里云回调处理服务器内部出错,原因={}", e.getMessage(), e);
                response.setStatus(500);
            }
        }

      /**
         * json字符串转Map<String,Object>
         */
        public Map<String, Object> jsonToMap(String jsonString) {
            JSONObject json = new JSONObject(jsonString);
            Map<String, Object> map = new HashMap<String, Object>();
            @SuppressWarnings("rawtypes")
            Iterator it = json.keys();
            while (it.hasNext()) {
                String key = (String) it.next();
                Object value = json.get(key);
                map.put(key, value);
            }
            return map;
        }

  • 相关阅读:
    (七)四种常见的post请求中的参数形式
    (六)获取http状态码和处理返回结果
    (五)application/x-www-form-urlencoded(表单请求)
    (四)进行HTTPS请求并进行(或不进行)证书校验(示例)
    (三)解决httpclient乱码
    (二)HttpClient Post请求
    (一)HttpClient Get请求
    (十一)Maven之profile实现多环境配置动态切换
    (四)带图片和附件的复杂邮件发送
    (三)JavaMail发送附件
  • 原文地址:https://www.cnblogs.com/lykbk/p/erererer2343434343.html
Copyright © 2020-2023  润新知