时间显示优化

This commit is contained in:
wuweida 2022-06-14 16:37:57 +08:00
parent 8b1ecd7b9d
commit cdb2bc5f87
2 changed files with 449 additions and 447 deletions

View File

@ -16,6 +16,6 @@ public class PeopleRecognize {
private String channelName; private String channelName;
private String picUrl; private String picUrl;
private Integer personNum; private Integer personNum;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date pushTime; private Date insertTime;
} }

View File

@ -208,6 +208,453 @@ public class MonitorService {
} }
} }
@Scheduled(cron = "0 0 8 1/1 * ?")
public void construction() {
try {
log.info("[monitor-capture]: start capture1");
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1009,1008");
labels.forEach(label -> {
String channelCode = label.getChannelCode();
try {
BufferedImage bufferedImage = capturecreenshot(channelCode);
String fileName = channelCode + ".jpg";
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
String picUrl = picHost + "/images/" + fileName;
ChannelPicture picture = new ChannelPicture();
picture.setChannelCode(channelCode);
picture.setPicUrl(picUrl);
/*picture.setInsertTime(new Date());
channelPictureMapper.insert(picture);*/
if (channelCode == null){
channelPictureMapper.insert(picture);
}else {
QueryWrapper<ChannelPicture> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("channel_code", channelCode);
picture.setInsertTime(new Date());
channelPictureMapper.update(picture, queryWrapper);
}
}catch (Exception e){
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
}
});
log.info("[monitor-capture]: end capture1");
}catch (Exception exception){
exception.printStackTrace();
}
}
@Scheduled(cron = "0 0 8/1 * * ?")
public void scenicSpotAndBathing() {
try {
log.info("[monitor-capture]: start capture");
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1006,1004");
labels.forEach(label -> {
String channelCode = label.getChannelCode();
try {
BufferedImage bufferedImage = capturecreenshot(channelCode);
String fileName = channelCode + ".jpg";
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
String picUrl = picHost + "/images/" + fileName;
ChannelPicture picture = new ChannelPicture();
picture.setChannelCode(channelCode);
picture.setPicUrl(picUrl);
/*picture.setInsertTime(new Date());
channelPictureMapper.insert(picture);*/
if (channelCode == null){
channelPictureMapper.insert(picture);
}else {
QueryWrapper<ChannelPicture> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("channel_code", channelCode);
picture.setInsertTime(new Date());
channelPictureMapper.update(picture, queryWrapper);
}
}catch (Exception e){
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
}
});
log.info("[monitor-capture]: end capture");
}catch (Exception exception){
exception.printStackTrace();
}
}
/**
* 海水浴场人群图片算法识别
*/
public void bathingBeach () {
try {
log.info("[monitor-capture]: start capture");
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1006");
labels.forEach(label -> {
String channelCode = label.getChannelCode();
try {
BufferedImage bufferedImage = capturecreenshot(channelCode);
String fileName = channelCode + ".jpg";
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
String picUrl = picHost + "/images/" + fileName;
//人流识别
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
Map personImage = new HashMap<>();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", stream);
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
stream.flush();
stream.close();
personImage.put("img_base64", imgBase64);
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
HashMap body = responseEntity.getBody();
if (body != null && (Integer) body.get("code") == 200){
Map data = (Map) body.get("data");
log.info(picUrl);
log.info("人流识别算法" + data);
}
}catch (Exception e){
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
}
});
log.info("[monitor-capture]: end capture");
}catch (Exception exception){
exception.printStackTrace();
}
}
/**
* 安保区域人群图片算法识别并保存到数据库
*/
@Scheduled(cron = "0 0 8/2 * * ?")
public void peopleRecognize() {
try {
log.info("[monitor-capture]: start capture");
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1042");
labels.forEach(label -> {
String channelCode = label.getChannelCode();
try {
BufferedImage bufferedImage = capturecreenshot(channelCode);
String fileName = channelCode + ".jpg";
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
String picUrl = picHost + "/images/" + fileName;
//人流识别
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
Map personImage = new HashMap<>();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", stream);
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
stream.flush();
stream.close();
personImage.put("img_base64", imgBase64);
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
HashMap body = responseEntity.getBody();
if (body != null && (Integer) body.get("code") == 200){
Map data = (Map) body.get("data");
Integer personNum = (Integer) data.get("person_num");
PeopleRecognize peopleRecognize = new PeopleRecognize();
peopleRecognize.setChannelCode(channelCode);
peopleRecognize.setChannelName(label.getChannelName());
peopleRecognize.setPicUrl(picUrl);
peopleRecognize.setPersonNum(personNum);
if (channelCode == null){
peopleRecognizeMapper.insert(peopleRecognize);
}else {
QueryWrapper<PeopleRecognize> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("channel_code", channelCode);
peopleRecognize.setInsertTime(new Date());
peopleRecognizeMapper.update(peopleRecognize, queryWrapper);
}
}
}catch (Exception e){
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
}
});
log.info("[monitor-capture]: end capture");
}catch (Exception exception){
exception.printStackTrace();
}
}
/**
* 景区人流量识别
*/
@Scheduled(cron = "0 0 9 * * ?")
public void startScenic() {
try {
log.info("[monitor-capture]: startScenic capture");
List<Camera> cameras = scenicMapper.selectCamerasInScenic();
cameras.forEach(camera -> {
String cameraCode = camera.getCode();
try {
BufferedImage bufferedImage = capturecreenshot(cameraCode);
String fileName = cameraCode + ".jpg";
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
String picUrl = picHost + "/images/" + fileName;
camera.setPic(picUrl);
camera.setCaptureTime(new Date());
cameraMapper.updateById(camera);
//人流识别
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
Map personImage = new HashMap<>();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", stream);
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
stream.flush();
stream.close();
personImage.put("img_base64", imgBase64);
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
HashMap body = responseEntity.getBody();
if (body != null && (Integer) body.get("code") == 200){
Map data = (Map) body.get("data");
Integer personNum = (Integer) data.get("person_num");
CameraScenic cameraScenic = new CameraScenic();
cameraScenic.setCameraId(cameraCode);
cameraScenic.setPersonNum(personNum);
CameraScenic cs = cameraScenicMapper.selectById(cameraCode);
if (cs == null){
cameraScenicMapper.insert(cameraScenic);
}else {
cameraScenicMapper.updateById(cameraScenic);
}
}
}
catch (Exception e){
log.info( "[monitor-capture] " +cameraCode + " 人流识别失败 " + e.getMessage());
}
});
log.info("[monitor-capture]: startScenic end capture");
}catch (Exception exception){
exception.printStackTrace();
}
}
private BufferedImage capturecreenshot(String code) throws IOException {
String url = monitorDomain + "/videoService/realmonitor/uri?scheme=HLS&channelId=" + code;
HttpHeaders headers = new HttpHeaders();
headers.add("X-Subject-Token",token);
ResponseEntity<HashMap> forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), HashMap.class );
HashMap body = forEntity.getBody();
String file = (String) body.get("url");
log.debug("开始抓流:" + file);
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(file);
try {
grabber.setOption("stimoout", "10*1000*1000");
grabber.setOption("timeout", "10*1000*1000");
grabber.start();
log.debug("grabber启动成功");
int frameIndex = 60;
Java2DFrameConverter converter = new Java2DFrameConverter();
while (true){
Frame frame = grabber.grabImage();
if (frame != null) {
log.debug("grabber 跳帧:" + frameIndex);
if (frameIndex-- > 0) continue;
BufferedImage bufferedImage = converter.getBufferedImage(frame);
return bufferedImage;
}
}
}catch (Exception e){
throw e;
}finally {
grabber.stop();
grabber.release();
}
}
/**
* 获取路径返回给前端
* @param code
* @return
* @throws IOException
*/
public String fileCode(String code)throws IOException{
String url = monitorDomain + "/videoService/realmonitor/uri?scheme=HLS&channelId=" + code;
HttpHeaders headers = new HttpHeaders();
headers.add("X-Subject-Token",token);
System.out.println(token);
ResponseEntity<HashMap> forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), HashMap.class );
HashMap body = forEntity.getBody();
String file = (String) body.get("url");
return file;
}
static public List cameras = new LinkedList<Map>();
/**
* 调用接口获取摄像头和组织
* @param parentId
* @param path
* @throws IOException
* @throws InterruptedException
*/
public void videoService(String parentId, String path) throws IOException, InterruptedException {
String url = monitorDomain + "/videoService/devicesManager/deviceTree?nodeType=1&typeCode=01;0;ALL;ALL&id=" + parentId;
HttpHeaders headers = new HttpHeaders();
headers.add("X-Subject-Token",token);
ResponseEntity<List> forEntity = null;
for (int i = 0; i < 10; i++) {
try {
forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), List.class );
break;
}catch (Exception e){
log.error("重试次数:{} url:{}",i,url);
log.error(e);
Thread.sleep(5*1000);
}
}
if (forEntity == null) return;
List<Map> results = forEntity.getBody();
// log.debug("response {}", JSONObject.toJSONString(results));
String sep = "->";
for (Map result : results) {
Boolean isParent = (Boolean) result.get("isParent");
if (isParent){
CameraOrganization cameraOrganization = JSONObject.parseObject(JSONObject.toJSONString(result), CameraOrganization.class);
cameraOrgenMapper.insert(cameraOrganization);
videoService((String) result.get("id"),path + sep + result.get("name"));
}else {
if (result.get("channelId") != null){
CameraChannel cameraChannel = JSONObject.parseObject(JSONObject.toJSONString(result), CameraChannel.class);
String id = (String)result.get("orgCode");
if (path != null && path.startsWith(sep)) {
path = path.substring(sep.length());
}
cameraChannel.setNodeName(path);
cameraChannel.setParentId(id);
cameraChannelMapper.insert(cameraChannel);
}
}
}
}
//查询视频点播巡检结果
@Scheduled(cron="0 5 6 * * ?")
public Result listChannelPlayStates(){
//获取当前时间和前一天的UTC时间
Map<String,Object> condition = new HashMap<>();
ZonedDateTime endUTC = ZonedDateTime.now(ZoneOffset.UTC);
ZonedDateTime startUTC = endUTC.minusDays(60);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'");
condition.put("checkStatus",0);
condition.put("startTime",dateTimeFormatter.format(startUTC));
condition.put("endTime",dateTimeFormatter.format(endUTC));
//组装查询条件经过验证pageSize设置过大也没效果最大512
Map<String,Object> map = new HashMap<>();
map.put("condition",condition);
map.put("page",1);
map.put("pageSize",500);//最多一次512条
//查询路径和请求头信息
String url = monitorDomain + "/nms/api/channel/play/list";
HttpHeaders headers = new HttpHeaders();
headers.add("X-Subject-Token",token);
//查询数据的页数
int pageCount = 0;
//查询结果
List<Map> list = new ArrayList<>();
HttpEntity<Map<String,Object>> request = new HttpEntity<>(map,headers);
ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, JSONObject.class );
JSONObject entityBody = responseEntity.getBody();
if (entityBody.get("i18n") != null && entityBody.get("i18n").toString() == "error"){
log.info("{}程序异常{}",entityBody.get("message").toString());
}
List<Map> results = (List<Map>) entityBody.get("results");
if(!results.isEmpty()){
list.addAll(results);
pageCount = entityBody.getIntValue("totalCount")/500 + 1;
}
for(int i = 2;i<=pageCount;i++){
map.put("page",i);
HttpEntity<Map<String,Object>> request2 = new HttpEntity<>(map,headers);
ResponseEntity<JSONObject> responseEntity2 = restTemplate.exchange(url, HttpMethod.POST, request2, JSONObject.class );
JSONObject entityBody2 = responseEntity2.getBody();
List<Map> results2 = (List<Map>) entityBody2.get("results");
if(!results2.isEmpty()){
list.addAll(results);
}
}
// List<CameraCheck> list1 = JSONObject.parseArray(JSONObject.toJSONString(jsonArray),CameraCheck.class);
// Map<String, CameraCheck> collect = list.stream().collect(Collectors.groupingBy(
// CameraCheck::getChannelCode,
// Collectors.collectingAndThen(
// Collectors.reducing((c1, c2) -> c1.getCheckTime().compareTo(c2.getCheckTime()) > 0 ? c1 : c2), Optional::get)
// )
// );
//
//通过set对channel_code去重
Set<String> set = new HashSet<>();
for(Map m:list){
set.add(m.get("channelCode").toString());
}
List<String> lists = new ArrayList<>(set.size());
lists.addAll(set);
//根据channel_code对t_camera_channel表的status字段进行更新0
List<List<String>> listMap = Lists.partition(lists,100);
for(List<String> ll:listMap){
cameraChannelMapper.updateCameraStatus(ll);
}
log.info("{} 查询视频点播巡检成功,发现异常数量:{}",LocalDateTime.now(),set.size());
return Result.success();
}
/** /**
* 特定摊点8:20抓图 * 特定摊点8:20抓图
*/ */
@ -544,451 +991,6 @@ public class MonitorService {
exception.printStackTrace(); exception.printStackTrace();
} }
} }
@Scheduled(cron = "0 0 8 1/1 * ?")
public void construction() {
try {
log.info("[monitor-capture]: start capture1");
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1009,1008");
labels.forEach(label -> {
String channelCode = label.getChannelCode();
try {
BufferedImage bufferedImage = capturecreenshot(channelCode);
String fileName = channelCode + ".jpg";
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
String picUrl = picHost + "/images/" + fileName;
ChannelPicture picture = new ChannelPicture();
picture.setChannelCode(channelCode);
picture.setPicUrl(picUrl);
/*picture.setInsertTime(new Date());
channelPictureMapper.insert(picture);*/
if (channelCode == null){
channelPictureMapper.insert(picture);
}else {
QueryWrapper<ChannelPicture> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("channel_code", channelCode);
picture.setInsertTime(new Date());
channelPictureMapper.update(picture, queryWrapper);
}
}catch (Exception e){
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
}
});
log.info("[monitor-capture]: end capture1");
}catch (Exception exception){
exception.printStackTrace();
}
}
@Scheduled(cron = "0 0 8/1 * * ?")
public void scenicSpotAndBathing() {
try {
log.info("[monitor-capture]: start capture");
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1006,1004");
labels.forEach(label -> {
String channelCode = label.getChannelCode();
try {
BufferedImage bufferedImage = capturecreenshot(channelCode);
String fileName = channelCode + ".jpg";
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
String picUrl = picHost + "/images/" + fileName;
ChannelPicture picture = new ChannelPicture();
picture.setChannelCode(channelCode);
picture.setPicUrl(picUrl);
/*picture.setInsertTime(new Date());
channelPictureMapper.insert(picture);*/
if (channelCode == null){
channelPictureMapper.insert(picture);
}else {
QueryWrapper<ChannelPicture> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("channel_code", channelCode);
picture.setInsertTime(new Date());
channelPictureMapper.update(picture, queryWrapper);
}
}catch (Exception e){
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
}
});
log.info("[monitor-capture]: end capture");
}catch (Exception exception){
exception.printStackTrace();
}
}
/**
* 海水浴场人群图片算法识别
*/
public void bathingBeach () {
try {
log.info("[monitor-capture]: start capture");
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1006");
labels.forEach(label -> {
String channelCode = label.getChannelCode();
try {
BufferedImage bufferedImage = capturecreenshot(channelCode);
String fileName = channelCode + ".jpg";
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
String picUrl = picHost + "/images/" + fileName;
//人流识别
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
Map personImage = new HashMap<>();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", stream);
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
stream.flush();
stream.close();
personImage.put("img_base64", imgBase64);
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
HashMap body = responseEntity.getBody();
if (body != null && (Integer) body.get("code") == 200){
Map data = (Map) body.get("data");
log.info(picUrl);
log.info("人流识别算法" + data);
}
}catch (Exception e){
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
}
});
log.info("[monitor-capture]: end capture");
}catch (Exception exception){
exception.printStackTrace();
}
}
/**
* 安保区域人群图片算法识别并保存到数据库
*/
@Scheduled(cron = "0 0 8/2 * * ?")
public void peopleRecognize() {
try {
log.info("[monitor-capture]: start capture");
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1042");
labels.forEach(label -> {
String channelCode = label.getChannelCode();
try {
BufferedImage bufferedImage = capturecreenshot(channelCode);
String fileName = channelCode + ".jpg";
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
String picUrl = picHost + "/images/" + fileName;
//人流识别
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
Map personImage = new HashMap<>();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", stream);
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
stream.flush();
stream.close();
personImage.put("img_base64", imgBase64);
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
HashMap body = responseEntity.getBody();
if (body != null && (Integer) body.get("code") == 200){
Map data = (Map) body.get("data");
Integer personNum = (Integer) data.get("person_num");
PeopleRecognize peopleRecognize = new PeopleRecognize();
peopleRecognize.setChannelCode(channelCode);
peopleRecognize.setChannelName(label.getChannelName());
peopleRecognize.setPicUrl(picUrl);
peopleRecognize.setPersonNum(personNum);
peopleRecognize.setPushTime(new Date());
PeopleRecognize id = peopleRecognizeMapper.selectById(channelCode);
if (id == null){
peopleRecognizeMapper.insert(peopleRecognize);
}else {
peopleRecognizeMapper.updateById(peopleRecognize);
}
}
}catch (Exception e){
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
}
});
log.info("[monitor-capture]: end capture");
}catch (Exception exception){
exception.printStackTrace();
}
}
/**
* 景区人流量识别
*/
@Scheduled(cron = "0 0 9 * * ?")
public void startScenic() {
try {
log.info("[monitor-capture]: startScenic capture");
List<Camera> cameras = scenicMapper.selectCamerasInScenic();
cameras.forEach(camera -> {
String cameraCode = camera.getCode();
try {
BufferedImage bufferedImage = capturecreenshot(cameraCode);
String fileName = cameraCode + ".jpg";
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
String picUrl = picHost + "/images/" + fileName;
camera.setPic(picUrl);
camera.setCaptureTime(new Date());
cameraMapper.updateById(camera);
//人流识别
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
Map personImage = new HashMap<>();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", stream);
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
stream.flush();
stream.close();
personImage.put("img_base64", imgBase64);
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
HashMap body = responseEntity.getBody();
if (body != null && (Integer) body.get("code") == 200){
Map data = (Map) body.get("data");
Integer personNum = (Integer) data.get("person_num");
CameraScenic cameraScenic = new CameraScenic();
cameraScenic.setCameraId(cameraCode);
cameraScenic.setPersonNum(personNum);
CameraScenic cs = cameraScenicMapper.selectById(cameraCode);
if (cs == null){
cameraScenicMapper.insert(cameraScenic);
}else {
cameraScenicMapper.updateById(cameraScenic);
}
}
}
catch (Exception e){
log.info( "[monitor-capture] " +cameraCode + " 人流识别失败 " + e.getMessage());
}
});
log.info("[monitor-capture]: startScenic end capture");
}catch (Exception exception){
exception.printStackTrace();
}
}
private BufferedImage capturecreenshot(String code) throws IOException {
String url = monitorDomain + "/videoService/realmonitor/uri?scheme=HLS&channelId=" + code;
HttpHeaders headers = new HttpHeaders();
headers.add("X-Subject-Token",token);
ResponseEntity<HashMap> forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), HashMap.class );
HashMap body = forEntity.getBody();
String file = (String) body.get("url");
log.debug("开始抓流:" + file);
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(file);
try {
grabber.setOption("stimoout", "10*1000*1000");
grabber.setOption("timeout", "10*1000*1000");
grabber.start();
log.debug("grabber启动成功");
int frameIndex = 60;
Java2DFrameConverter converter = new Java2DFrameConverter();
while (true){
Frame frame = grabber.grabImage();
if (frame != null) {
log.debug("grabber 跳帧:" + frameIndex);
if (frameIndex-- > 0) continue;
BufferedImage bufferedImage = converter.getBufferedImage(frame);
return bufferedImage;
}
}
}catch (Exception e){
throw e;
}finally {
grabber.stop();
grabber.release();
}
}
/**
* 获取路径返回给前端
* @param code
* @return
* @throws IOException
*/
public String fileCode(String code)throws IOException{
String url = monitorDomain + "/videoService/realmonitor/uri?scheme=HLS&channelId=" + code;
HttpHeaders headers = new HttpHeaders();
headers.add("X-Subject-Token",token);
System.out.println(token);
ResponseEntity<HashMap> forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), HashMap.class );
HashMap body = forEntity.getBody();
String file = (String) body.get("url");
return file;
}
static public List cameras = new LinkedList<Map>();
/**
* 调用接口获取摄像头和组织
* @param parentId
* @param path
* @throws IOException
* @throws InterruptedException
*/
public void videoService(String parentId, String path) throws IOException, InterruptedException {
String url = monitorDomain + "/videoService/devicesManager/deviceTree?nodeType=1&typeCode=01;0;ALL;ALL&id=" + parentId;
HttpHeaders headers = new HttpHeaders();
headers.add("X-Subject-Token",token);
ResponseEntity<List> forEntity = null;
for (int i = 0; i < 10; i++) {
try {
forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), List.class );
break;
}catch (Exception e){
log.error("重试次数:{} url:{}",i,url);
log.error(e);
Thread.sleep(5*1000);
}
}
if (forEntity == null) return;
List<Map> results = forEntity.getBody();
// log.debug("response {}", JSONObject.toJSONString(results));
String sep = "->";
for (Map result : results) {
Boolean isParent = (Boolean) result.get("isParent");
if (isParent){
CameraOrganization cameraOrganization = JSONObject.parseObject(JSONObject.toJSONString(result), CameraOrganization.class);
cameraOrgenMapper.insert(cameraOrganization);
videoService((String) result.get("id"),path + sep + result.get("name"));
}else {
if (result.get("channelId") != null){
CameraChannel cameraChannel = JSONObject.parseObject(JSONObject.toJSONString(result), CameraChannel.class);
String id = (String)result.get("orgCode");
if (path != null && path.startsWith(sep)) {
path = path.substring(sep.length());
}
cameraChannel.setNodeName(path);
cameraChannel.setParentId(id);
cameraChannelMapper.insert(cameraChannel);
}
}
}
}
//查询视频点播巡检结果
@Scheduled(cron="0 5 6 * * ?")
public Result listChannelPlayStates(){
//获取当前时间和前一天的UTC时间
Map<String,Object> condition = new HashMap<>();
ZonedDateTime endUTC = ZonedDateTime.now(ZoneOffset.UTC);
ZonedDateTime startUTC = endUTC.minusDays(60);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'");
condition.put("checkStatus",0);
condition.put("startTime",dateTimeFormatter.format(startUTC));
condition.put("endTime",dateTimeFormatter.format(endUTC));
//组装查询条件经过验证pageSize设置过大也没效果最大512
Map<String,Object> map = new HashMap<>();
map.put("condition",condition);
map.put("page",1);
map.put("pageSize",500);//最多一次512条
//查询路径和请求头信息
String url = monitorDomain + "/nms/api/channel/play/list";
HttpHeaders headers = new HttpHeaders();
headers.add("X-Subject-Token",token);
//查询数据的页数
int pageCount = 0;
//查询结果
List<Map> list = new ArrayList<>();
HttpEntity<Map<String,Object>> request = new HttpEntity<>(map,headers);
ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, JSONObject.class );
JSONObject entityBody = responseEntity.getBody();
if (entityBody.get("i18n") != null && entityBody.get("i18n").toString() == "error"){
log.info("{}程序异常{}",entityBody.get("message").toString());
}
List<Map> results = (List<Map>) entityBody.get("results");
if(!results.isEmpty()){
list.addAll(results);
pageCount = entityBody.getIntValue("totalCount")/500 + 1;
}
for(int i = 2;i<=pageCount;i++){
map.put("page",i);
HttpEntity<Map<String,Object>> request2 = new HttpEntity<>(map,headers);
ResponseEntity<JSONObject> responseEntity2 = restTemplate.exchange(url, HttpMethod.POST, request2, JSONObject.class );
JSONObject entityBody2 = responseEntity2.getBody();
List<Map> results2 = (List<Map>) entityBody2.get("results");
if(!results2.isEmpty()){
list.addAll(results);
}
}
// List<CameraCheck> list1 = JSONObject.parseArray(JSONObject.toJSONString(jsonArray),CameraCheck.class);
// Map<String, CameraCheck> collect = list.stream().collect(Collectors.groupingBy(
// CameraCheck::getChannelCode,
// Collectors.collectingAndThen(
// Collectors.reducing((c1, c2) -> c1.getCheckTime().compareTo(c2.getCheckTime()) > 0 ? c1 : c2), Optional::get)
// )
// );
//
//通过set对channel_code去重
Set<String> set = new HashSet<>();
for(Map m:list){
set.add(m.get("channelCode").toString());
}
List<String> lists = new ArrayList<>(set.size());
lists.addAll(set);
//根据channel_code对t_camera_channel表的status字段进行更新0
List<List<String>> listMap = Lists.partition(lists,100);
for(List<String> ll:listMap){
cameraChannelMapper.updateCameraStatus(ll);
}
log.info("{} 查询视频点播巡检成功,发现异常数量:{}",LocalDateTime.now(),set.size());
return Result.success();
}
} }