From b1084891961232e3c697ea9fc52f127cdccffb6b Mon Sep 17 00:00:00 2001 From: liusuyi <1951119284@qq.com> Date: 星期四, 11 七月 2024 17:28:44 +0800 Subject: [PATCH] 优化:流媒体 --- ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java | 133 +++++++++++++++++++++++++++++++++++++++---- 1 files changed, 119 insertions(+), 14 deletions(-) diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java index 91e8103..f0be3d3 100644 --- a/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java @@ -3,10 +3,18 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.device.camera.domain.ArdCameras; +import com.ruoyi.device.camera.domain.CameraCmd; +import com.ruoyi.device.camera.factory.CameraSDK; +import com.ruoyi.device.camera.factory.CameraSDKFactory; +import com.ruoyi.device.channel.domain.ArdChannel; +import com.ruoyi.media.domain.StreamInfo; import com.ruoyi.media.service.IMediaService; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.ruoyi.media.mapper.VtduMapper; import com.ruoyi.media.domain.Vtdu; @@ -28,7 +36,10 @@ private VtduMapper vtduMapper; @Resource private IMediaService mediaService; - + @Resource + private CameraSDKFactory cameraSDKFactory; + @Value("${mediamtx.host}") + String mediamtxHost; /** * 鏌ヨ娴佸獟浣撶鐞� * @@ -37,7 +48,6 @@ */ @Override public Vtdu selectVtduByName(String name) { - return vtduMapper.selectVtduByName(name); } @@ -60,17 +70,6 @@ */ @Override public int insertVtdu(Vtdu vtdu) { - log.debug("娴佸獟浣撱��" + vtdu.getName() + "銆戦�氶亾娣诲姞"); - Map<String, String> map = mediaService.addPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode()); - vtdu.setRtspUrl(map.get("rtspUrl")); - vtdu.setRtmpUrl(map.get("rtmpUrl")); - vtdu.setWebrtcUrl(map.get("webrtcUrl")); - - vtdu.setName(vtdu.getName()); - vtdu.setRtspSource(vtdu.getRtspSource()); - vtdu.setIsCode(vtdu.getIsCode()); - vtdu.setMode(vtdu.getMode()); - vtdu.setCreateTime(DateUtils.getNowDate()); return vtduMapper.insertVtdu(vtdu); } @@ -82,7 +81,6 @@ */ @Override public int updateVtdu(Vtdu vtdu) { - log.debug("娴佸獟浣撱��" + vtdu.getName() + "銆戦�氶亾鏇存柊"); Map<String, String> map = mediaService.editPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode()); vtdu.setName(vtdu.getName()); vtdu.setRtspSource(vtdu.getRtspSource()); @@ -141,4 +139,111 @@ } return vtduMapper.deleteVtduByCameraId(cameraId); } + + /** + * @return + * @Author 鍒樿嫃涔� + * @Description 娓呴櫎鎵�鏈夋祦濯掍綋鏁版嵁 + * @Date 2024/7/10 13:31 + * @Param + */ + public void clearVtdu() { + vtduMapper.clearVtdu(); + } + + + //闇�瑕佹洿鏂扮殑锛堟祦濯掍綋鍜寁tdu鐩稿悓锛� + @Override + public List<Vtdu> sameList(List<Vtdu> vtdus, List<String> names) { + return vtdus.stream().filter(vtdu -> names.contains(vtdu.getName())).collect(Collectors.toList()); + } + + //闇�瑕佸垹闄ょ殑锛堟祦濯掍綋涓鐨勶級 + @Override + public List<String> diffListToDel(List<Vtdu> vtdus, List<String> names) { + if (vtdus.size() >= names.size()) { + List<String> nameList = vtdus.stream().map(Vtdu::getName) + .filter(item -> !names.contains(item)) + .collect(Collectors.toList()); + return nameList; + } else { + List<String> nameList = names.stream().filter(item -> !vtdus.stream().map(Vtdu::getName).collect(Collectors.toList()).contains(item)) + .collect(Collectors.toList()); + return nameList; + } + } + + //闇�瑕佹柊澧炵殑锛堟祦濯掍綋涓皯鐨勶級 + @Override + public List<Vtdu> diffListToAdd(List<Vtdu> vtdus, List<String> names) { + return vtdus.stream().filter(vtdu -> !names.contains(vtdu.getName())).collect(Collectors.toList()); + } + + /** + * @return + * @Author 鍒樿嫃涔� + * @Description 鍚屾鏈湴vtdu搴撳拰娴佸獟浣撲腑鐨勬暟鎹� + * @Date 2024/7/10 15:26 + * @Param vtdus vtdu搴撶殑闆嗗悎 + * @Param names 娴佸獟浣撶殑name闆嗗悎 + */ + @Override + public void asyncVtdu(List<Vtdu> vtdus, List<String> names) { + //闇�瑕佹洿鏂扮殑鏁版嵁,鍙傛暟椤哄簭娉ㄦ剰 + sameList(vtdus, names).stream().forEach(vtdu -> { + StreamInfo streamInfo = mediaService.getPathInfo(vtdu.getName()); + if (!streamInfo.getRtspSource().equals(vtdu.getRtspSource())) { + mediaService.editPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode()); + } + }); + //闇�瑕佸垹闄ょ殑鏁版嵁 + diffListToDel(vtdus, names).stream().forEach(name -> { + mediaService.removePath(name); + }); + //闇�瑕佹柊澧炵殑鏁版嵁 + diffListToAdd(vtdus, names).stream().forEach(vtdu -> { + mediaService.addPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode()); + }); + } + @Override + public void addChanToVtdu(ArdCameras camera, ArdChannel channel) { + String name = camera.getId() + "_" + channel.getChanNo(); + String rtspSource=""; + switch (camera.getFactory()) + { + case "1": rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/h264/ch" + channel.getChanNo() + "/main/av_stream";break; + case "2": rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/cam/realmonitor?channel=" + channel.getChanNo() + "&subtype=0";break; + } + + //鍒犻櫎娴佸獟浣� + if (selectVtduByName(name) != null) { + deleteVtduByName(name); + } + //娣诲姞鍒版祦濯掍綋 + CameraCmd cmd = new CameraCmd(camera.getId(), channel.getChanNo()); + CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(camera.getFactory()); + Map<String, Object> videoCompressionCfg = cameraSDK.getVideoCompressionCfg(cmd); + Vtdu vtdu = new Vtdu(); + if (videoCompressionCfg.get("videoEncType") != null) { + if (videoCompressionCfg.get("videoEncType").equals("鏍囧噯h264")) { + vtdu.setIsCode("0");//榛樿涓嶈浆鐮� + } else { + vtdu.setIsCode("1");//榛樿杞爜 + } + } else { + vtdu.setIsCode("0");//榛樿涓嶈浆鐮� + } + vtdu.setRtspSource(rtspSource); + vtdu.setName(name); + vtdu.setMode("1");//榛樿CPU杞В鐮� + vtdu.setCameraId(camera.getId()); + String rtspUrl = "rtsp://" + mediamtxHost + ":8554/" + name; + String rtmpUrl = "rtmp://" + mediamtxHost + ":1935/" + name; + String webrtcUrl = "http://" + mediamtxHost + ":8889/" + name; + vtdu.setRtmpUrl(rtmpUrl); + vtdu.setWebrtcUrl(webrtcUrl); + vtdu.setRtspUrl(rtspUrl); + insertVtdu(vtdu); + } + } -- Gitblit v1.9.3