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;
    }

posted on 2020-03-12 17:04  微笑点燃希望  阅读(483)  评论(0编辑  收藏  举报
font=white