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