阿里云媒体转码处理方式
老习惯先说下背景:
使用阿里云做音视频处理,转码处理模式有两种:
主动请求阿里转码服务器获取转码之后数据写库(后续上代码);
通过阿里云主题回调,转码完成之后主动回调;
优缺点:主动请求在使用资源的时候才获取阿里云转码数据,如果资源使用率低或者只是个云盘推荐该方法;
回调需要单独服务器处理阿里云回调,增加服务器压力,容易丢数据;但是数据实时性高;
直接上核心处理代码(没搞清楚阿里云音视频转码逻辑的可能得多下点功夫看看阿里文档了,这里不赘述)
/*** 处理转码结果通知* @param bodyJson*/@Overridepublic 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 smkkprivate boolean updateRemoteStatus(Map<String, String> map) {boolean result = false;String key = map.get("key");String url = map.get("url");String workflow = map.get("workflow");String picurl = map.get("pickey");String picAttribute = null;if(StringUtils.isNotBlank(picurl)){picAttribute = getPicInfo(picurl);}String duration = map.get("duration");String filePath =map.get("filePath");//OSS 保存的文件 源文件路径BaseResp<Object> baseResp = new BaseResp<Object>();if(filePath.contains("longbei_media_resource")){if(filePath.contains("_video")){url = AppserviceConfig.alimedia_mp4_outurl +"/"+ url;}else{url = AppserviceConfig.alimedia_cdnurl + url;}baseResp = mediaResourceService.updateMediaResourceInfo(key,picurl,url,workflow,duration,picAttribute);}else if(filePath.contains("tiku")){Double d = Double.parseDouble(duration);tikuMongoDao.save(key, d.intValue() ,url);result = true;}else {baseResp = improveService.updateMedia(key,picurl,url,workflow,duration,picAttribute);}if(baseResp.getCode() == Constant.STATUS_SYS_00){result = true;}return result;}//ActivityListpublic static Map<String,String> getObjectMap(JSONObject json){if(json.get("Type").equals("Report")&&json.get("State").equals("Success")){Map<String,String> map = new HashMap<>();JSONObject mediaWorkflowExecution = json.getJSONObject("MediaWorkflowExecution");String name = (String)mediaWorkflowExecution.get("Name");//通过工作流名称 判断走mp3 还是 mp4map.put("workflow",name);String mediaId = (String)mediaWorkflowExecution.get("MediaId");JSONObject jsonObject2 = mediaWorkflowExecution.getJSONObject("Input").getJSONObject("InputFile");String objId = jsonObject2.getString("Object");String filePath = jsonObject2.getString("Object");map.put("filePath",filePath);String[] objArr = objId.split("/");objId = objArr[objArr.length-1];map.put("key",objId);JSONArray activityList = mediaWorkflowExecution.getJSONArray("ActivityList");//获取截图和文件for (int i = 0; i < activityList.size(); i++) {JSONObject j = JSONObject.fromObject(activityList.get(i));if("Snapshot".equals(j.get("Type"))){map.put("pickey",getPicKey(j,objId));continue;}if("Transcode".equals(j.get("Type"))){map.put("url",getFileKey(j,objId));continue;}}map = getTimeStr(map,mediaId);System.out.print("getObjectMap info ="+JSON.toJSON(map).toString());return map;}return null;}private static String getFileKey(JSONObject js, String objid){String runid = (String)js.get("RunId"); // String result = "filekey/"+runid+"/"+ AppserviceConfig.alimedia_mp4_query_mp4+"/"+objid;String result = "filekey/"+runid+".mp4";return result;}private static String getPicKey(JSONObject js, String objid){String runid = (String)js.get("RunId");return "pickey/" + runid + ".jpg";}private static String getPicInfo(String picKey){String url = AppserviceConfig.alimedia_cdnurl+ picKey +imageInfo;String sRequest = HttpUtils.getRequest(url,null);if(StringUtils.isBlank(sRequest)){return null;}JSONObject jsonObject = JSONObject.fromObject(sRequest);if(null != jsonObject){JSONArray jsonArray = new JSONArray();JSONObject reJs = new JSONObject();JSONObject jHeight = JSONObject.fromObject(jsonObject.get("ImageHeight"));JSONObject jWidth = JSONObject.fromObject(jsonObject.get("ImageWidth"));reJs.put("height",jHeight.get("value"));reJs.put("width",jWidth.get("value"));jsonArray.add(reJs);return jsonArray.toString();}return null;}/*** mp3 视频转码* @param json* @return*/private static Map<String,String> getObjectMapForMp3(JSONObject json){Map<String,String> map = new HashMap<>();JSONObject mediaWorkflowExecution = json.getJSONObject("MediaWorkflowExecution");String name = (String)mediaWorkflowExecution.get("Name");String mediaId = (String)mediaWorkflowExecution.get("MediaId");map.put("workflow",name);JSONObject jsonObject2 = mediaWorkflowExecution.getJSONObject("Input").getJSONObject("InputFile");String objId = jsonObject2.getString("Object");map.put("filePath",objId);String[] objArr = objId.split("/");objId = objArr[objArr.length-1];map.put("key",objId);JSONArray activityList = mediaWorkflowExecution.getJSONArray("ActivityList");//获取文件for (int i = 0; i < activityList.size(); i++) {JSONObject j = JSONObject.fromObject(activityList.get(i));if(j.get("State").equals("Success")){map.put("url",getFileForMp3(j,objId));map = getTimeStr(map,mediaId); // JSONObject jsonObject = JSONObject.fromObject(map);break;}}return map;}private static String getFileForMp3(JSONObject js,String objid){String runid = (String)js.get("RunId"); // String result = "mp3key/"+runid+"/"+AppserviceConfig.alimedia_mp3_query_mp3+"/"+objid;String result ="mp3key/"+runid+".mp3";return result;}private static Map<String,String> getTimeStr(Map<String,String> map,String mediaId) {String duration = "";try{QueryMediaListRequest qu = new QueryMediaListRequest();qu.setMediaIds(mediaId);qu.setAcceptFormat(FormatType.JSON);AcsResponse ac = getDefaultAcsClient().getAcsResponse(qu);JSONObject js = JSONObject.fromObject(ac);JSONArray jsArray = js.getJSONArray("mediaList");if(null != jsArray && jsArray.size()>0){JSONObject j = JSONObject.fromObject(jsArray.get(0));duration = (String)j.get("duration");}}catch (Exception e){e.printStackTrace();}if(!StringUtils.isBlank(duration)){Double d = Double.parseDouble(duration);map.put("duration",d.intValue()+"");}return map;}private static DefaultAcsClient getDefaultAcsClient(){try{if(null == defaultAcsClient){DefaultProfile.addEndpoint("cn-"+AppserviceConfig.alimedia_area,"cn-"+AppserviceConfig.alimedia_area,"Mts","mts.cn-"+AppserviceConfig.alimedia_area+".aliyuncs.com");DefaultProfile profile = DefaultProfile.getProfile("cn-"+AppserviceConfig.alimedia_area,AppserviceConfig.alimedia_accessKeyId,AppserviceConfig.alimedia_accessKeySecret);defaultAcsClient = new DefaultAcsClient(profile);}}catch (Exception e){}return defaultAcsClient;}
附带了一点业务转码处理,updateRemoteStatus为获取数据之后的处理业务逻辑接口;
阿里云媒体转码处理方式相关推荐
- 阿里云媒体转码MTS使用教程
什么是媒体处理? 媒体处理(ApsaraVideo for Media Processing,原MTS)是一种多媒体数据处理服务.它以经济.弹性和高可扩展的音视频转换方法,帮助您将存储于OSS的音视频 ...
- Android(安卓)上传文件到阿里云点播,阿里云点播转码
Android(安卓)上传文件到阿里云点播,阿里云点播转码 文章目录 Android(安卓)上传文件到阿里云点播,阿里云点播转码 一:登录阿里云点播平台配置添加转码模板组 1:需要什么参数,可自行填写 ...
- 阿里云盘内测邀请码是多少?阿里云盘邀请码获得方法
原文链接:http://www.jb51.net/article/200636.htm 阿里云网盘注册邀请码怎么免费获取?为了让更多的小伙伴也体验体验,特分享一批阿里云盘邀请码送给大家,下面为大家分享 ...
- 阿里云专属推荐码nuyxa6
申请成功!您的推荐码为nuyxa6 恭喜您获得阿里云专属推荐码,推荐码有效期至2017-03-04 14:43:49. 我们会在到期日前两周以站内信的方式通知您新的有效期. 转载于:https://w ...
- 阿里云盘正式上架,速度15MB/s!(附下载链接+阿里云盘邀请码)
今年 8 月,阿里巴巴推出了一款名为 "阿里云网盘"的独立 App.定位为C端用户提供服务,网盘空间更大,下载速度更快. 但之后很快这款App就下架了,也许是阿里没有准备好,在经历 ...
- 阿里云备案服务码申请方法流程
阿里云备案服务码是什么?ICP备案服务码怎么获取?阿里云备案服务码分为免费和付费两种,申请备案服务码是有限制条件的,需要你的阿里云账号下有可用于申请备案服务码的云产品,如云服务器.建站产品.虚拟主机等 ...
- 阿里云备案服务码怎么申请?
阿里云备案服务码是什么?ICP备案服务码怎么获取?阿里云备案服务码分为免费和付费两种,申请备案服务码是有限制条件的,需要你的阿里云账号下有可用于申请备案服务码的云产品,如云服务器.建站产品.虚拟主机等 ...
- 阿里云盘内测_阿里云盘内测码,每日限量,先到先得
这几天各种网盘是闹的沸沸扬扬 什么阿里云种子用户 什么金牌体验馆 整的用户糊里糊涂的 (阿里云盘≠阿里云Teambition网盘) 过几天发个文章说明 哎 骚话就在嘴边,但不知怎么说 总之牛逼 直接开 ...
- 阿里云image-syncer源码分析
阿里云image-syncer源码分析 欢迎关注"云原生手记"微信公众号 背景 大家在公司中都会使用到容器镜像私有仓库,一般都用harbor,也有会用registry搭建一个简陋的 ...
最新文章
- 华为路由器qos car+nat+dhcp+vlan配置心得
- 参加MS CRM2011深度培训课程第二天
- jmap之使用说明与JVM配置
- funcode拼图游戏c语言程序,同求funcode平台下拼图游戏的C语言代码
- Maven(2)--- 环境配置
- 大数据(1)---全球100款大数据工具汇总(前50款)
- 远程光电容积脉搏波描记法(rPPG)
- 电脑报合订本_电脑报2018年合订本
- 【贪心 哈夫曼树】bzoj2923: [Poi1998]The lightest language
- 吴伯凡-认知方法论-如何消除认知阑尾
- Shell中如何删除首行和尾行
- basic计算机编程基础,计算机编程基础(Visual Basic)
- Django中models模型(操作数据库)
- 瑞萨RL78 dataflash pfdl库使用教程
- Docker容器引擎
- Linux编辑firmware的文件,rk3328编译Linux固件
- ENVI5.3安装或卸载时提示错误1628代码
- 如何将电子签名透明化处理
- 用户划分——RMF方法
- CST(Crypto Systems Toolkit) 7.1学习笔记-chapter6
热门文章
- IT程序员怎么分级别,以及每个级别应该会什么内容?
- 考研英语 - word-list-42
- 计算机耍人,高级的耍人套路话
- 信合考试计算机知识,2015年陕西信合考试试题――计算机基础知识五
- 神经网络入门:正反向传播推导、CNN 初识
- 12年计算机网络自考卷,08—12年全国自考计算机网络原理历年试题及答案.doc
- GB/T 24137跟GB 8624 有什么区别吗?
- python枪_大疆机甲大师教育机器人Python API中文化之一:枪亮枪暗
- java JDK安装与环境配置详解(超超超级详细)
- linux tar.gz zip 解压缩命令