ard-admin/src/main/resources/application-prod.yml
@@ -57,6 +57,9 @@ apiHost: 192.168.1.3 playHost: 192.168.1.3 https: true rtmpPort: 1935 rtspPort: 8554 webrtcPort: 8889 # mqtt配置 mqtt: ard-device/src/main/java/com/ard/device/channel/service/impl/ArdChannelServiceImpl.java
@@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; @@ -34,6 +35,7 @@ private IArdVtduService ardVtduService; @Resource private MediamtxConfig mediamtxConfig; /** * 查询通道管理 * @@ -105,12 +107,13 @@ * 清空通道 * * @author 刘苏义 * @date 2024/8/10 11:18 * @date 2024/8/10 11:18 */ @Override public int clearArdChannel(){ public int clearArdChannel() { return ardChannelMapper.clearArdChannel(); } /** * 删除通道管理信息 * @@ -121,6 +124,7 @@ public int deleteArdChannelByDeviceId(String deviceId) { return ardChannelMapper.deleteArdChannelByDeviceId(deviceId); } /** * 校验相机通道是否唯一 * @@ -130,8 +134,7 @@ @Override public boolean checkArdChannelUnique(ArdChannel channel) { ArdChannel info = ardChannelMapper.checkArdChannelUnique(channel); if (info != null && !Objects.equals(info.getId(), channel.getId())) { if (info != null && !Objects.equals(info.getId(), channel.getId())) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -143,7 +146,7 @@ log.debug("定时同步Vtdu任务"); List<ArdChannel> channels = this.selectArdChannelList(new ArdChannel()); if (channels == null || channels.isEmpty()) { // log.warn("没有获取到通道数据,退出同步"); // log.warn("没有获取到通道数据,退出同步"); return; } List<ArdVtdu> ardVtduList = ardVtduService.selectArdVtduList(new ArdVtdu()); @@ -156,10 +159,16 @@ String name = channel.getDeviceId() + "_" + channel.getChanNo(); // 生成媒体表的 name String cameraId = channel.getDeviceId(); // cameraId 就是通道的 deviceId String rtspSourceUrl = getRtspSource(channel); String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554" + "/" + name; // 拼接 webrtcUrl String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935" + "/" + name; // 拼接 webrtcUrl String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + name; // // 拼接 webrtcUrl String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + name; // 拼接 // webrtcUrl String protocol = mediamtxConfig.isHttps() ? "https://" : "http://"; String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889" + "/" + name; // 拼接 webrtcUrl String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + name; // 拼接 webrtcUrl // 先检查媒体表是否已有此记录 Optional<ArdVtdu> existingMedia = ardVtduList.stream() @@ -212,7 +221,7 @@ // 根据通道信息获取rtsp源地址 private String getRtspSource(ArdChannel channel) { String rtspSource = ""; ArdCamera ardCamera =ardCameraService.selectArdCameraById(channel.getDeviceId()); ArdCamera ardCamera = ardCameraService.selectArdCameraById(channel.getDeviceId()); if (ardCamera != null) { switch (ardCamera.getFactory()) { case "1": ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java
@@ -81,7 +81,7 @@ @Override public void saveLiveCapacity(LiveCapacityReceiver liveCapacityReceiver, Long timestamp) { // Solve timing problems if(liveCapacityReceiver==null){ if (liveCapacityReceiver == null) { //2025-10-28 zwy,这里有个空指针异常问题,如果liveCapacityReceiver为空,则不应该执行下面的代码。 //机场设备在刚开机时,发送的state状态时,直播能力前三次发送的是空,可能是由于刚开机,等待各设备开机,第四次为正常数据。 return; @@ -100,7 +100,8 @@ @Override public ResponseResult liveStart(LiveTypeDTO liveParam) { String rtmpPublishUrl = "rtmp://" + mediamtxConfig.getApiHost() + ":1935/" + liveParam.getVideoId(); String rtmpPublishUrl = "rtmp://" + mediamtxConfig.getApiHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + liveParam.getVideoId(); liveParam.setUrl(rtmpPublishUrl); // Check if this lens is available live. ResponseResult responseResult = this.checkBeforeLive(liveParam.getVideoId()); @@ -125,13 +126,20 @@ case RTMP: String name = liveParam.getVideoId(); // 拼接地址 String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554" + "/" + name; // 拼接 webrtcUrl String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935" + "/" + name; // 拼接 webrtcUrl String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + name; // // 拼接 webrtcUrl String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + name; // // 拼接 webrtcUrl String protocol = mediamtxConfig.isHttps() ? "https://" : "http://"; String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889" + "/" + name; // 拼接 webrtcUrl String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + name; // 拼接 // webrtcUrl // 如果没有,插入新的记录 ArdVtdu vtdu = ArdVtdu.builder().name(name).rtspSource("publisher").rtspUrl(rtspUrl).rtmpUrl(rtmpUrl).webrtcUrl(webrtcUrl).build(); ArdVtdu vtdu = ArdVtdu.builder().name(name).rtspSource("publisher").rtspUrl(rtspUrl).rtmpUrl(rtmpUrl).webrtcUrl(webrtcUrl).build(); int i = ardVtduService.insertArdVtdu(vtdu); // 保存到媒体表 if (i > 0) { live.setRtmpUrl(rtmpUrl); ard-vtdu/src/main/java/com/ard/vtdu/config/MediamtxConfig.java
@@ -17,4 +17,7 @@ private String apiHost; private String playHost; private boolean isHttps; private Integer rtmpPort; private Integer rtspPort; private Integer webrtcPort; } ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java
@@ -51,10 +51,13 @@ @Override public ArdVtdu addPath(ArdVtdu ardVtdu) { try { String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554/" + ardVtdu.getName(); String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935/" + ardVtdu.getName(); String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + ardVtdu.getName(); String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + ardVtdu.getName(); String protocol = mediamtxConfig.isHttps() ? "https://" : "http://"; String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889/" + ardVtdu.getName(); String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + ardVtdu.getName(); Conf conf = new Conf(); conf.setSource(ardVtdu.getRtspSource()); @@ -82,10 +85,13 @@ @Override public ArdVtdu editPath(ArdVtdu ardVtdu) { try { String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554/" + ardVtdu.getName(); String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935/" + ardVtdu.getName(); String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + ardVtdu.getName(); String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + ardVtdu.getName(); String protocol = mediamtxConfig.isHttps() ? "https://" : "http://"; String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889/" + ardVtdu.getName(); String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + ardVtdu.getName(); Conf conf = new Conf(); conf.setSource(ardVtdu.getRtspSource()); @@ -199,14 +205,15 @@ //源 info.setRtspSource(conf.getSource()); //RTMP播放地址 String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935/" + name; String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + name; info.setRtmpUrl(rtmpUrl); //RTSP播放地址 String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554/" + name; String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + name; info.setRtspUrl(rtspUrl); //WEBRTC播放地址 String protocol = mediamtxConfig.isHttps() ? "https://" : "http://"; String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889/" + name; String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + name; info.setWebrtcUrl(webrtcUrl); //上行流量