From 676a722241116fd53e9f6063484a966dcabe5b48 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Wed, 16 Aug 2023 01:56:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BF=83=E8=B7=B3=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=EF=BC=8C=E6=94=AF=E6=8C=81=E9=80=9A=E9=81=93=E5=88=97?= =?UTF-8?q?=E8=A1=A8=EF=BC=8C=E6=8E=A8=E6=B5=81=E5=88=97=E8=A1=A8=EF=BC=8C?= =?UTF-8?q?=E6=8B=89=E6=B5=81=E4=BB=A3=E7=90=86=E5=88=97=E8=A1=A8=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E6=9F=A5=E7=9C=8B=E5=AF=B9=E5=BA=94=E7=9A=84=E4=BA=91?= =?UTF-8?q?=E7=AB=AF=E5=BD=95=E5=83=8F=EF=BC=8C=E5=85=BC=E5=AE=B9=E5=A4=A7?= =?UTF-8?q?=E4=BA=8EINT=E7=9A=84ssrc=E7=9A=84=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/vmp/vmanager/bean/PageInfo.java | 99 ++++++++++++ .../iot/vmp/vmanager/bean/RecordFile.java | 53 +++++++ .../cloudRecord/CloudRecordController.java | 145 ++++++++++++++++++ 3 files changed, 297 insertions(+) create mode 100755 src/main/java/com/genersoft/iot/vmp/vmanager/bean/PageInfo.java create mode 100755 src/main/java/com/genersoft/iot/vmp/vmanager/bean/RecordFile.java create mode 100755 src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/CloudRecordController.java diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/PageInfo.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/PageInfo.java new file mode 100755 index 00000000..8894191a --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/PageInfo.java @@ -0,0 +1,99 @@ +package com.genersoft.iot.vmp.vmanager.bean; + +import java.util.ArrayList; +import java.util.List; + +public class PageInfo { + //当前页 + private int pageNum; + //每页的数量 + private int pageSize; + //当前页的数量 + private int size; + //总页数 + private int pages; + //总数 + private int total; + + private List resultData; + + private List list; + + public PageInfo(List resultData) { + this.resultData = resultData; + } + + public PageInfo() { + } + + public void startPage(int page, int count) { + if (count <= 0) count = 10; + if (page <= 0) page = 1; + this.pageNum = page; + this.pageSize = count; + this.total = resultData.size(); + + this.pages = total % count == 0 ? total / count : total / count + 1; + int fromIndx = (page - 1) * count; + if (fromIndx > this.total - 1) { + this.list = new ArrayList<>(); + this.size = 0; + return; + } + + int toIndx = page * count; + if (toIndx > this.total) { + toIndx = this.total; + } + this.list = this.resultData.subList(fromIndx, toIndx); + this.size = this.list.size(); + } + + public int getPageNum() { + return pageNum; + } + + public void setPageNum(int pageNum) { + this.pageNum = pageNum; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public int getPages() { + return pages; + } + + public void setPages(int pages) { + this.pages = pages; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/RecordFile.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/RecordFile.java new file mode 100755 index 00000000..72d6561f --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/RecordFile.java @@ -0,0 +1,53 @@ +package com.genersoft.iot.vmp.vmanager.bean; + +public class RecordFile { + private String app; + private String stream; + + private String fileName; + + private String mediaServerId; + + private String date; + + + public String getApp() { + return app; + } + + public void setApp(String app) { + this.app = app; + } + + public String getStream() { + return stream; + } + + public void setStream(String stream) { + this.stream = stream; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getMediaServerId() { + return mediaServerId; + } + + public void setMediaServerId(String mediaServerId) { + this.mediaServerId = mediaServerId; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/CloudRecordController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/CloudRecordController.java new file mode 100755 index 00000000..0f37a7de --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/CloudRecordController.java @@ -0,0 +1,145 @@ +package com.genersoft.iot.vmp.vmanager.cloudRecord; + +import com.genersoft.iot.vmp.conf.DynamicTask; +import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.conf.exception.ControllerException; +import com.genersoft.iot.vmp.media.zlm.SendRtpPortManager; +import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory; +import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; +import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; +import com.genersoft.iot.vmp.service.IMediaServerService; +import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; +import com.genersoft.iot.vmp.vmanager.bean.PageInfo; +import com.genersoft.iot.vmp.vmanager.bean.RecordFile; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.commons.lang3.ObjectUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +@SuppressWarnings("rawtypes") +@Tag(name = "云端录像接口") + +@RestController +@RequestMapping("/api/cloud/record") +public class CloudRecordController { + + @Autowired + private ZLMServerFactory zlmServerFactory; + + @Autowired + private SendRtpPortManager sendRtpPortManager; + + private final static Logger logger = LoggerFactory.getLogger(CloudRecordController.class); + + @Autowired + private ZlmHttpHookSubscribe hookSubscribe; + + @Autowired + private IMediaServerService mediaServerService; + + @Autowired + private UserSetting userSetting; + + @Autowired + private DynamicTask dynamicTask; + + @Autowired + private RedisTemplate redisTemplate; + + @ResponseBody + @GetMapping("/date/list") + @Operation(summary = "查询存在云端录像的日期") + @Parameter(name = "app", description = "应用名", required = true) + @Parameter(name = "stream", description = "流ID", required = true) + @Parameter(name = "year", description = "年,置空则查询当年", required = false) + @Parameter(name = "month", description = "月,置空则查询当月", required = false) + @Parameter(name = "mediaServerId", description = "流媒体ID,置空则查询全部", required = false) + public List openRtpServer( + @RequestParam String app, + @RequestParam String stream, + @RequestParam(required = false) int year, + @RequestParam(required = false) int month, + @RequestParam(required = false) String mediaServerId + + ) { + logger.info("[云端录像] 查询存在云端录像的日期 app->{}, stream->{}, mediaServerId->{}, year->{}, month->{}", + app, stream, mediaServerId, year, month); + Calendar calendar = Calendar.getInstance(); + if (ObjectUtils.isEmpty(year)) { + year = calendar.get(Calendar.YEAR); + } + if (ObjectUtils.isEmpty(month)) { + month = calendar.get(Calendar.MONTH) + 1; + } + List mediaServerItems; + if (!ObjectUtils.isEmpty(mediaServerId)) { + mediaServerItems = new ArrayList<>(); + MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); + if (mediaServerItem == null) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到流媒体: " + mediaServerId); + } + mediaServerItems.add(mediaServerItem); + } else { + mediaServerItems = mediaServerService.getAll(); + } + if (mediaServerItems.isEmpty()) { + return new ArrayList<>(); + } + + return mediaServerService.getRecordDates(app, stream, year, month, mediaServerItems); + } + + @ResponseBody + @GetMapping("/list") + @Operation(summary = "分页查询云端录像") + @Parameter(name = "app", description = "应用名", required = true) + @Parameter(name = "stream", description = "流ID", required = true) + @Parameter(name = "page", description = "当前页", required = false) + @Parameter(name = "count", description = "每页查询数量", required = false) + @Parameter(name = "startTime", description = "开始时间(yyyy-MM-dd HH:mm:ss)", required = true) + @Parameter(name = "endTime", description = "结束时间(yyyy-MM-dd HH:mm:ss)", required = true) + @Parameter(name = "mediaServerId", description = "流媒体ID,置空则查询全部流媒体", required = false) + public PageInfo openRtpServer( + @RequestParam String app, + @RequestParam String stream, + @RequestParam int page, + @RequestParam int count, + @RequestParam String startTime, + @RequestParam String endTime, + @RequestParam(required = false) String mediaServerId + + ) { + logger.info("[云端录像] 查询 app->{}, stream->{}, mediaServerId->{}, page->{}, count->{}, startTime->{}, endTime->{}", + app, stream, mediaServerId, page, count, startTime, endTime); + + List mediaServerItems; + if (!ObjectUtils.isEmpty(mediaServerId)) { + mediaServerItems = new ArrayList<>(); + MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); + if (mediaServerItem == null) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到流媒体: " + mediaServerId); + } + mediaServerItems.add(mediaServerItem); + } else { + mediaServerItems = mediaServerService.getAll(); + } + if (mediaServerItems.isEmpty()) { + return new PageInfo<>(); + } + List records = mediaServerService.getRecords(app, stream, startTime, endTime, mediaServerItems); + PageInfo pageInfo = new PageInfo<>(records); + pageInfo.startPage(page, count); + return pageInfo; + } + + +}