package com.izouma.awesomeadmin.service.impl; import com.izouma.awesomeadmin.constant.AppConstant; import com.izouma.awesomeadmin.model.PlayerInfo; import com.izouma.awesomeadmin.service.PlayerInfoService; import com.izouma.awesomeadmin.service.VideoRecognitionService; import com.izouma.awesomeadmin.util.VideoProcessToolNew; import org.bytedeco.javacv.FrameGrabber; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @Service public class VideoRecognitionServiceImpl implements VideoRecognitionService { @Autowired private PlayerInfoService playerInfoService; private VideoProcessToolNew videoProcessTool = new VideoProcessToolNew(); public static boolean DEBUG = false; private static Map> resultMap = new HashMap<>(); private static Map lastStat = new HashMap<>(); private static Map processing = new HashMap<>(); private ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); @Override public boolean start(String videoPath) { if (processing.get(videoPath) != null) { return true; } processing.put(videoPath, videoPath); lastStat.put(videoPath, System.currentTimeMillis()); resultMap.remove(videoPath); executor.execute(() -> { try { Map map = videoProcessTool.processVideo(videoPath, 0); if (map != null) { resultMap.put(videoPath, map); } } catch (FrameGrabber.Exception e) { e.printStackTrace(); } processing.remove(videoPath); }); return true; } @Override public void start(PlayerInfo playerInfo) { // if (playerInfo.getStatusFlag() > AppConstant.PlayerStatus.END) { // return; // } executor.execute(() -> { try { Map map = videoProcessTool.processVideo(playerInfo.getVideo(), 0); playerInfo.setImage(map.get("image")); playerInfo.setLiveTime(map.get("参赛时间")); int rank = Integer.valueOf(map.get("rank").replace("第", "")); if (rank <= 0 || rank > 100) { throw new Exception(); } try { playerInfo.setRanking(Integer.valueOf(map.get("rank").replace("第", ""))); } catch (Exception ignore) { } try { playerInfo.setScore(Float.parseFloat(map.get("评分"))); } catch (Exception ignore) { } try { playerInfo.setKillNumber(Integer.parseInt(map.get("淘汰"))); } catch (Exception ignore) { } try { playerInfo.setScore(Float.parseFloat(map.get("淘汰"))); } catch (Exception ignore) { } playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED); } catch (Exception e) { e.printStackTrace(); playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED_FAIL); } playerInfoService.updatePlayerInfo(playerInfo); }); } @Override public Map stat(String videoPath) { lastStat.put(videoPath, System.currentTimeMillis()); return resultMap.get(videoPath); } }