视频上传配合使用Ffmpeg实时解析
问题点
- 视频上传上限1G
- 需要对上传的不同格式的视频,进行统一格式的转码处理,并实现 截断视频,水印转码视频,截图等功能。
- 视频处理的时效问题,不可以采用定时器去刷库轮询处理
方案
前台 -> 后台(即时token返回)-> 任务线程(维护 token + MultipartFile#transferTo[服务器本地文件])
前台所有信息填写完成后数据保存 -> 后台 (数据入库完成后,发送ActiveMQ消息队列)
监听代码 (实时消费) -> 根据文件路径 调用 ffmpeg 执行处理处理 -> (解析异常、JMS异常时) 触发重试机制
逻辑实现
Spring Mvc 类型的controller 接口 接收前台传过来的视频信息
@ResponseBody @RequestMapping(value = "/uploadVideo2", method = RequestMethod.POST) public String uploadVideo2(@RequestParam("upFile") MultipartFile uploadFile, HttpServletRequest request) throws Exception { ObjectMapper mapper = new ObjectMapper(); Map<String, Object> map = new HashMap<>(9); map = ucenterKnowledgeCenterService.syncUploadVideo(uploadFile,request); return mapper.writeValueAsString(map); }
因为要支持用户可删除维护
此处追加 token(UUID) + itemFile 信息的维护
private class TransferTask implements Runnable {private MultipartFile uploadFile; private String token; private Logger log = Logger.getLogger(TransferTask.class); private TransferTask(MultipartFile uploadFile, String token) { this.uploadFile = uploadFile; this.token = token; } /** * 执行转码和发送任务 todo -> 维护 token + itemFile */ @Override public void run() { String originalFileName = this.uploadFile.getOriginalFilename(); String savePath = UcenterKnowledgeCenterServiceImpl.class.getResource("").getPath(); String itemFile = savePath + originalFileName; //字节流转换成文件 try { uploadFile.transferTo(new File(itemFile)); if (new File(itemFile).exists()) { UcenterVideoTransferReleation releation = new UcenterVideoTransferReleation()