老习惯先说下背景:
使用阿里云做音视频处理,转码处理模式有两种:
主动请求阿里转码服务器获取转码之后数据写库(后续上代码);
通过阿里云主题回调,转码完成之后主动回调;
优缺点:主动请求在使用资源的时候才获取阿里云转码数据,如果资源使用率低或者只是个云盘推荐该方法;
回调需要单独服务器处理阿里云回调,增加服务器压力,容易丢数据;但是数据实时性高;
直接上核心处理代码(没搞清楚阿里云音视频转码逻辑的可能得多下点功夫看看阿里文档了,这里不赘述)
/** * 处理转码结果通知 * @param bodyJson */ @Override public void handleMediaTranscodingNotice(JSONObject bodyJson, HttpServletResponse response) { JSONObject message = JSONObject.fromObject(bodyJson.getString("Message")); if(!message.get("Type").equals("Report") || !message.get("State").equals("Success")){ return ; } String run_id = message.getString("RunId"); Map<String,String> messageMap = new HashMap<String,String>(); JSONObject mediaWorkflowExecution = message.getJSONObject("MediaWorkflowExecution"); String workFlow = mediaWorkflowExecution.getString("Name"); if(workFlow.contains("mp3")){ messageMap = getObjectMapForMp3(message); }else{ messageMap = getObjectMap(message); } if(!updateRemoteStatus(messageMap)){ long num = this.springJedisDao.increment("media_notice_error_"+run_id,1); if(num > 5){ response.setStatus(200); this.springJedisDao.del("media_notice_error_"+run_id); return; } this.springJedisDao.expire("media_notice_error_"+run_id,24*60*60); response.setStatus(500); }else{ response.setStatus(200); } } //这个接口要优化 by smkk private boolean updateRemoteStatus(Map<String, String> map) { boolean result = false; String key = map.get("key"); Stri