<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}
webSocket拆帧进度推送
@Component
@ServerEndpoint("/ws/sp/{md5}")
public class WebSocketSplitFrame {private final Logger logger = LoggerFactory.getLogger(this.getClass());private static final Map<String, Session> clients = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(Session session, @PathParam("md5") String md5) {clients.put(md5, session);logger.info("当前拆帧连接视频数量:{}", clients.size());}@OnMessagepublic int onMessage(String md5AndNum) throws InterruptedException {String[] split = md5AndNum.split(":", 2);String md5 = split[0];Integer num = Integer.valueOf(split[1]);File sfUiFile = FileUtil.getSfUiFile();File splitFrameFile = new File(sfUiFile.getPath() + File.separator + md5);int length = 0;while (num != length) {length = splitFrameFile.listFiles().length;Thread.sleep(400);sendFrameNum(md5, length);}logger.info("素材已拆帧数完毕 md5:{} num:{}", md5, length);return length;}public void sendFrameNum(String md5, int num) {Session session = clients.get(md5);if (session != null) {try {session.getBasicRemote().sendText(num + "");} catch (IOException e) {logger.error("sendFrameNum e:{}", e.getMessage());}} else {logger.info("[sendFrameNum]视频拆帧已完毕:{}", md5);}}@OnClosepublic void onClose(@PathParam("md5") String md5) {Session session = clients.get(md5);StreamClose.close(session);clients.remove(md5);logger.info("[onClose]视频拆帧已完毕断开连接:{}", md5);}}


WebSocket图片推送
@Component
@ServerEndpoint("/ws/fp/{md5}")
public class WebSocketFramePic {private final Logger logger = LoggerFactory.getLogger(this.getClass());private final Map<String, Session> clients = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(Session session, @PathParam("md5") String md5) {clients.put(md5, session);logger.info("获取拆帧图连接数量:{}", clients.size());}@OnMessagepublic int onMessage(String md5) throws InterruptedException {File splitFrameFile = new File(FileUtil.getSfUiFile().getPath() + File.separator + md5);LinkedList<File> mergePicFiles = Arrays.stream(splitFrameFile.listFiles()).sorted(Comparator.comparingInt(x -> Integer.parseInt(x.getName().substring(0, x.getName().lastIndexOf("."))))).collect(Collectors.toCollection(LinkedList::new));List<String> pics = new ArrayList<>();for (File mergePicFile : mergePicFiles) {byte[] bytes = FileUtil.getFileBytes(mergePicFile);String base64str = Base64.encodeBase64String(bytes);String picBase64 = "data:image/jpeg;base64," + base64str;pics.add(picBase64);if (pics.size() == 30) {Thread.sleep(1000);sendFramePic(md5, pics);pics = new ArrayList<>();}}logger.info("获取素材已拆帧图片 md5:{} num:{}", md5, mergePicFiles.size());return mergePicFiles.size();}public void sendFramePic(String md5, List<String> pics) {Session session = clients.get(md5);if (session != null) {try {String text = JSONArray.toJSONString(pics);session.getBasicRemote().sendText(text);} catch (Exception e) {logger.error("sendFramePic e:{}", e.getMessage());}} else {logger.info("[sendFrameNum]视频拆帧已完毕:{}", md5);}}@OnClosepublic void onClose(@PathParam("md5") String md5) {Session session = clients.get(md5);StreamClose.close(session);clients.remove(md5);logger.info("[onClose]拆帧图片推送已完毕断开连接:{}", md5);}}
