From b0080159d98cd441175ddaf90a77d30b8264003d Mon Sep 17 00:00:00 2001 From: panlinlin <648540858@qq.com> Date: 星期六, 19 十二月 2020 21:52:20 +0800 Subject: [PATCH] 去除ssrc作为流ID传递,ssrc只作为sdp消息使用。动态端口的情况下支持固定流地址,同时支持未点播时直接播放流地址,代码自动发起点播 --- src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java | 27 ++-- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 23 ++- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java | 6 src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java | 9 - web_src/src/components/gb28181/devicePlayer.vue | 13 +- src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java | 27 ++--- src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java | 2 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java | 4 src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java | 10 +- src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java | 11 +- web_src/src/components/channelList.vue | 6 src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java | 18 +- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 80 ++++++++-------- src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java | 2 src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java | 2 src/main/resources/application-dev.yml | 2 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java | 2 17 files changed, 117 insertions(+), 127 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java index 53bda91..0fb76b9 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java @@ -4,7 +4,6 @@ public class StreamInfo { - private String ssrc; private String streamId; private String deviceID; private String cahnnelId; @@ -19,14 +18,6 @@ private String rtmp; private String rtsp; private JSONArray tracks; - - public String getSsrc() { - return ssrc; - } - - public void setSsrc(String ssrc) { - this.ssrc = ssrc; - } public String getDeviceID() { return deviceID; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java index 810feab..19e9eda 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java @@ -141,7 +141,7 @@ /** * 娴佸敮涓�缂栧彿锛屽瓨鍦ㄨ〃绀烘鍦ㄧ洿鎾� */ - private String ssrc; + private String streamId; /** * 鏄惁鍚湁闊抽 @@ -379,14 +379,6 @@ this.subCount = subCount; } - public String getSsrc() { - return ssrc; - } - - public void setSsrc(String ssrc) { - this.ssrc = ssrc; - } - public boolean isHasAudio() { return hasAudio; } @@ -402,4 +394,12 @@ public void setPlay(boolean play) { this.play = play; } + + public String getStreamId() { + return streamId; + } + + public void setStreamId(String streamId) { + this.streamId = streamId; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index 3d5aacc..097d2b7 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -277,17 +277,22 @@ try { String ssrc = streamSession.createPlaySsrc(); + String streamId = null; + if (rtpEnable) { + streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId); + }else { + streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); + } String streamMode = device.getStreamMode().toUpperCase(); MediaServerConfig mediaInfo = storager.getMediaInfo(); String mediaPort = null; // 浣跨敤鍔ㄦ�乽dp绔彛 if (rtpEnable) { - mediaPort = zlmUtils.getNewRTPPort(ssrc) + ""; + mediaPort = zlmUtils.getNewRTPPort(streamId) + ""; }else { mediaPort = mediaInfo.getRtpProxyPort(); } - String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); // 娣诲姞璁㈤槄 JSONObject subscribeKey = new JSONObject(); subscribeKey.put("app", "rtp"); @@ -330,10 +335,10 @@ Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "live", null, ssrc); ClientTransaction transaction = transmitRequest(device, request); - streamSession.put(ssrc, transaction); + streamSession.put(streamId, transaction); DeviceChannel deviceChannel = storager.queryChannel(device.getDeviceId(), channelId); if (deviceChannel != null) { - deviceChannel.setSsrc(ssrc); + deviceChannel.setStreamId(streamId); storager.updateChannel(device.getDeviceId(), deviceChannel); } @@ -378,7 +383,7 @@ String mediaPort = null; // 浣跨敤鍔ㄦ�乽dp绔彛 if (rtpEnable) { - mediaPort = zlmUtils.getNewRTPPort(ssrc) + ""; + mediaPort = zlmUtils.getNewRTPPort(streamId) + ""; }else { mediaPort = mediaInfo.getRtpProxyPort(); } @@ -412,7 +417,7 @@ Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "playback", null); ClientTransaction transaction = transmitRequest(device, request); - streamSession.put(ssrc, transaction); + streamSession.put(streamId, transaction); } catch ( SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); @@ -424,10 +429,10 @@ * */ @Override - public void streamByeCmd(String ssrc) { + public void streamByeCmd(String streamId) { try { - ClientTransaction transaction = streamSession.get(ssrc); + ClientTransaction transaction = streamSession.get(streamId); if (transaction == null) { return; } @@ -453,7 +458,7 @@ clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest); } dialog.sendRequest(clientTransaction); - streamSession.remove(ssrc); + streamSession.remove(streamId); } catch (TransactionDoesNotExistException e) { e.printStackTrace(); } catch (SipException e) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java index c987f5e..3c90e8e 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java @@ -450,7 +450,7 @@ StreamInfo streamInfo = storager.queryPlaybackByDevice(deviceId, "*"); if (streamInfo != null) { storager.stopPlayback(streamInfo); - cmder.streamByeCmd(streamInfo.getSsrc()); + cmder.streamByeCmd(streamInfo.getStreamId()); } } } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) { diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index 99da624..03031f0 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -4,13 +4,16 @@ import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.MediaServerConfig; +import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import com.genersoft.iot.vmp.utils.IpUtil; +import com.genersoft.iot.vmp.vmanager.service.IPlayService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -44,6 +47,9 @@ private SIPCommander cmder; @Autowired + private IPlayService playService; + + @Autowired private IVideoManagerStorager storager; @Autowired @@ -51,6 +57,9 @@ @Autowired private ZLMHttpHookSubscribe subscribe; + + @Value("${media.autoApplyPlay}") + private boolean autoApplyPlay; @Value("${media.ip}") private String mediaIp; @@ -135,34 +144,6 @@ ZLMHttpHookSubscribe.Event subscribe = this.subscribe.getSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, json); if (subscribe != null) subscribe.response(json); -// if ("rtp".equals(app)) { -// String ssrc = new DecimalFormat("0000000000").format(Integer.parseInt(streamId, 16)); -// StreamInfo streamInfoForPlay = storager.queryPlayBySSRC(ssrc); -// if ("rtp".equals(app) && streamInfoForPlay != null ) { -// MediaServerConfig mediaInfo = storager.getMediaInfo(); -// streamInfoForPlay.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); -// streamInfoForPlay.setWs_flv(String.format("ws://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); -// streamInfoForPlay.setFmp4(String.format("http://%s:%s/rtp/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); -// streamInfoForPlay.setWs_fmp4(String.format("ws://%s:%s/rtp/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); -// streamInfoForPlay.setRtmp(String.format("rtmp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtmpPort(), streamId)); -// streamInfoForPlay.setHls(String.format("http://%s:%s/rtp/%s/hls.m3u8", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); -// streamInfoForPlay.setRtsp(String.format("rtsp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtspPort(), streamId)); -// storager.startPlay(streamInfoForPlay); -// } -// -// StreamInfo streamInfoForPlayBack = storager.queryPlaybackBySSRC(ssrc); -// if ("rtp".equals(app) && streamInfoForPlayBack != null ) { -// MediaServerConfig mediaInfo = storager.getMediaInfo(); -// streamInfoForPlayBack.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); -// streamInfoForPlayBack.setWs_flv(String.format("ws://%s:%s/rtp/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); -// streamInfoForPlayBack.setFmp4(String.format("http://%s:%s/rtp/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); -// streamInfoForPlayBack.setWs_fmp4(String.format("ws://%s:%s/rtp/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); -// streamInfoForPlayBack.setRtmp(String.format("rtmp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtmpPort(), streamId)); -// streamInfoForPlayBack.setHls(String.format("http://%s:%s/rtp/%s/hls.m3u8", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); -// streamInfoForPlayBack.setRtsp(String.format("rtsp://%s:%s/rtp/%s", mediaInfo.getWanIp(), mediaInfo.getRtspPort(), streamId)); -// storager.startPlayback(streamInfoForPlayBack); -// } -// } // TODO Auto-generated method stub @@ -268,14 +249,12 @@ String app = json.getString("app"); String streamId = json.getString("stream"); boolean regist = json.getBoolean("regist"); -// String ssrc = String.format("%10d", Integer.parseInt(streamId, 16)); // ZLM 瑕佹眰澶у啓涓旈浣嶈ˉ闆� - String ssrc = new DecimalFormat("0000000000").format(Integer.parseInt(streamId, 16)); - StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc); + StreamInfo streamInfo = storager.queryPlayByStreamId(streamId); if ("rtp".equals(app) && !regist ) { if (streamInfo!=null){ storager.stopPlay(streamInfo); }else{ - streamInfo = storager.queryPlaybackBySSRC(ssrc); + streamInfo = storager.queryPlaybackByStreamId(streamId); storager.stopPlayback(streamInfo); } } @@ -299,16 +278,14 @@ logger.debug("ZLM HOOK on_stream_none_reader API璋冪敤锛屽弬鏁帮細" + json.toString()); } - BigInteger bigint=new BigInteger(json.getString("stream"), 16); - int numb=bigint.intValue(); - String ssrc = String.format("%010d", numb); - - cmder.streamByeCmd(ssrc); - StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc); + String streamId = json.getString("stream"); + + cmder.streamByeCmd(streamId); + StreamInfo streamInfo = storager.queryPlayByStreamId(streamId); if (streamInfo!=null){ storager.stopPlay(streamInfo); }else{ - streamInfo = storager.queryPlaybackBySSRC(ssrc); + streamInfo = storager.queryPlaybackByStreamId(streamId); storager.stopPlayback(streamInfo); } @@ -330,7 +307,30 @@ logger.debug("ZLM HOOK on_stream_not_found API璋冪敤锛屽弬鏁帮細" + json.toString()); } // TODO Auto-generated method stub - + + if (autoApplyPlay) { + String app = json.getString("app"); + String streamId = json.getString("stream"); + if ("rtp".equals(app) && streamId.indexOf("gb_play") > -1) { + String[] s = streamId.split("_"); + if (s.length == 4) { + String deviceId = s[2]; + String channelId = s[3]; + Device device = storager.queryVideoDevice(deviceId); + if (device != null) { + UUID uuid = UUID.randomUUID(); + cmder.playStreamCmd(device, channelId, (JSONObject response) -> { + logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString()); + playService.onPublishHandlerForPlay(response, deviceId, channelId, uuid.toString()); + }); + } + + } + + } + + } + JSONObject ret = new JSONObject(); ret.put("code", 0); ret.put("msg", "success"); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java index 8195b65..132e1e1 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java @@ -21,8 +21,8 @@ private int currentPort = 0; - public int getNewRTPPort(String ssrc) { - String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); + public int getNewRTPPort(String streamId) { +// String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); Map<String, Object> param = new HashMap<>(); int newPort = getPortFromUdpPortRange(); param.put("port", newPort); @@ -32,7 +32,7 @@ if (jsonObject != null && jsonObject.getInteger("code") == 0) { return newPort; } else { - return getNewRTPPort(ssrc); + return getNewRTPPort(streamId); } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java index fdf4bc3..f427e5e 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java @@ -178,7 +178,7 @@ */ void cleanChannelsForDevice(String deviceId); - StreamInfo queryPlayBySSRC(String ssrc); + StreamInfo queryPlayByStreamId(String streamId); StreamInfo queryPlayByDevice(String deviceId, String code); @@ -190,5 +190,5 @@ StreamInfo queryPlaybackByDevice(String deviceId, String channelId); - StreamInfo queryPlaybackBySSRC(String ssrc); + StreamInfo queryPlaybackByStreamId(String streamId); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java index 75b9c92..3302aa3 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java @@ -178,10 +178,6 @@ return false; } - @Override - public StreamInfo queryPlayBySSRC(String ssrc) { - return null; - } @Override public StreamInfo queryPlayByDevice(String deviceId, String code) { @@ -210,7 +206,12 @@ } @Override - public StreamInfo queryPlaybackBySSRC(String ssrc) { + public StreamInfo queryPlayByStreamId(String streamId) { + return null; + } + + @Override + public StreamInfo queryPlaybackByStreamId(String streamId) { return null; } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java index fe7b8e6..00d41fc 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java @@ -151,7 +151,6 @@ "_" + queryOnline + // 鎼滅储鏄惁鍦ㄧ嚎 "_" + queryHasSubChannel + // 鎼滅储鏄惁鍚湁瀛愯妭鐐� "_" + "*"; -// List<Object> deviceChannelList = redis.keys(queryStr); List<Object> deviceChannelList = redis.scan(queryStr); //瀵规煡璇㈢粨鏋滄帓搴忥紝閬垮厤鍑虹幇閫氶亾鎺掑垪椤哄簭涔卞簭鐨勬儏鍐� Collections.sort(deviceChannelList,new Comparator<Object>(){ @@ -169,7 +168,7 @@ DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i)); StreamInfo streamInfo = stringStreamInfoMap.get(deviceId + "_" + deviceChannel.getChannelId()); deviceChannel.setPlay(streamInfo != null); - if (streamInfo != null) deviceChannel.setSsrc(streamInfo.getSsrc()); + if (streamInfo != null) deviceChannel.setStreamId(streamInfo.getStreamId()); result.add(deviceChannel); } pageResult.setData(result); @@ -384,7 +383,7 @@ */ @Override public boolean startPlay(StreamInfo stream) { - return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, stream.getSsrc(),stream.getDeviceID(), stream.getCahnnelId()), + return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()), stream); } @@ -398,12 +397,12 @@ if (streamInfo == null) return false; DeviceChannel deviceChannel = queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId()); if (deviceChannel != null) { - deviceChannel.setSsrc(null); + deviceChannel.setStreamId(null); deviceChannel.setPlay(false); updateChannel(streamInfo.getDeviceID(), deviceChannel); } return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, - streamInfo.getSsrc(), + streamInfo.getStreamId(), streamInfo.getDeviceID(), streamInfo.getCahnnelId())); } @@ -416,22 +415,20 @@ public StreamInfo queryPlay(StreamInfo streamInfo) { return (StreamInfo)redis.get(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, - streamInfo.getSsrc(), + streamInfo.getStreamId(), streamInfo.getDeviceID(), streamInfo.getCahnnelId())); } @Override - public StreamInfo queryPlayBySSRC(String ssrc) { -// List<Object> playLeys = redis.keys(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, ssrc)); - List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, ssrc)); + public StreamInfo queryPlayByStreamId(String steamId) { + List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, steamId)); if (playLeys == null || playLeys.size() == 0) return null; return (StreamInfo)redis.get(playLeys.get(0).toString()); } @Override - public StreamInfo queryPlaybackBySSRC(String ssrc) { -// List<Object> playLeys = redis.keys(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, ssrc)); - List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAY_BLACK_PREFIX, ssrc)); + public StreamInfo queryPlaybackByStreamId(String steamId) { + List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAY_BLACK_PREFIX, steamId)); if (playLeys == null || playLeys.size() == 0) return null; return (StreamInfo)redis.get(playLeys.get(0).toString()); } @@ -526,7 +523,7 @@ @Override public boolean startPlayback(StreamInfo stream) { - return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, stream.getSsrc(),stream.getDeviceID(), stream.getCahnnelId()), + return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()), stream); } @@ -536,12 +533,12 @@ if (streamInfo == null) return false; DeviceChannel deviceChannel = queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId()); if (deviceChannel != null) { - deviceChannel.setSsrc(null); + deviceChannel.setStreamId(null); deviceChannel.setPlay(false); updateChannel(streamInfo.getDeviceID(), deviceChannel); } return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, - streamInfo.getSsrc(), + streamInfo.getStreamId(), streamInfo.getDeviceID(), streamInfo.getCahnnelId())); } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java index e741b5a..3da666a 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java @@ -80,7 +80,7 @@ playService.onPublishHandlerForPlay(response, deviceId, channelId, uuid.toString()); }); } else { - String streamId = String.format("%08x", Integer.parseInt(streamInfo.getSsrc())).toUpperCase(); + String streamId = streamInfo.getStreamId(); JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); if (rtpInfo.getBoolean("exist")) { RequestMessage msg = new RequestMessage(); @@ -99,21 +99,21 @@ return result; } - @PostMapping("/play/{ssrc}/stop") - public ResponseEntity<String> playStop(@PathVariable String ssrc) { + @PostMapping("/play/{streamId}/stop") + public ResponseEntity<String> playStop(@PathVariable String streamId) { - cmder.streamByeCmd(ssrc); - StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc); + cmder.streamByeCmd(streamId); + StreamInfo streamInfo = storager.queryPlayByStreamId(streamId); if (streamInfo == null) - return new ResponseEntity<String>("ssrc not found", HttpStatus.OK); + return new ResponseEntity<String>("streamId not found", HttpStatus.OK); storager.stopPlay(streamInfo); if (logger.isDebugEnabled()) { - logger.debug(String.format("璁惧棰勮鍋滄API璋冪敤锛宻src锛�%s", ssrc)); + logger.debug(String.format("璁惧棰勮鍋滄API璋冪敤锛宻treamId锛�%s", streamId)); } - if (ssrc != null) { + if (streamId != null) { JSONObject json = new JSONObject(); - json.put("ssrc", ssrc); + json.put("streamId", streamId); return new ResponseEntity<String>(json.toString(), HttpStatus.OK); } else { logger.warn("璁惧棰勮鍋滄API璋冪敤澶辫触锛�"); @@ -123,17 +123,16 @@ /** * 灏嗕笉鏄痟264鐨勮棰戦�氳繃ffmpeg 杞爜涓篽264 + aac - * @param ssrc + * @param streamId 娴両D * @return */ - @PostMapping("/play/{ssrc}/convert") - public ResponseEntity<String> playConvert(@PathVariable String ssrc) { - StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc); + @PostMapping("/play/{streamId}/convert") + public ResponseEntity<String> playConvert(@PathVariable String streamId) { + StreamInfo streamInfo = storager.queryPlayByStreamId(streamId); if (streamInfo == null) { logger.warn("瑙嗛杞爜API璋冪敤澶辫触锛�, 瑙嗛娴佸凡缁忓仠姝�!"); return new ResponseEntity<String>("鏈壘鍒拌棰戞祦淇℃伅, 瑙嗛娴佸彲鑳藉凡缁忓仠姝�", HttpStatus.OK); } - String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); if (!rtpInfo.getBoolean("exist")) { logger.warn("瑙嗛杞爜API璋冪敤澶辫触锛�, 瑙嗛娴佸凡鍋滄鎺ㄦ祦!"); diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java index 2e32b1b..5fbaabf 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java @@ -72,7 +72,7 @@ StreamInfo streamInfo = storager.queryPlaybackByDevice(deviceId, channelId); if (streamInfo != null) { // 鍋滄涔嬪墠鐨勫洖鏀� - cmder.streamByeCmd(streamInfo.getSsrc()); + cmder.streamByeCmd(streamInfo.getStreamId()); } resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid, result); cmder.playbackStreamCmd(device, channelId, startTime, endTime, (JSONObject response) -> { diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java index e9528d1..2800882 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java @@ -61,9 +61,7 @@ public StreamInfo onPublishHandler(JSONObject resonse, String deviceId, String channelId, String uuid) { String streamId = resonse.getString("id"); - String ssrc = new DecimalFormat("0000000000").format(Integer.parseInt(streamId, 16)); StreamInfo streamInfo = new StreamInfo(); - streamInfo.setSsrc(ssrc); streamInfo.setStreamId(streamId); streamInfo.setDeviceID(deviceId); streamInfo.setCahnnelId(channelId); diff --git a/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java b/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java index ce3b7ec..fdb6778 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/ApiDeviceController.java @@ -159,7 +159,7 @@ deviceJOSNChannel.put("PTZType ", deviceChannel.getPTZType()); // 浜戝彴绫诲瀷, 0 - 鏈煡, 1 - 鐞冩満, 2 - 鍗婄悆, // 3 - 鍥哄畾鏋満, 4 - 閬ユ帶鏋満 deviceJOSNChannel.put("CustomPTZType", ""); - deviceJOSNChannel.put("StreamID", deviceChannel.getSsrc()); // StreamID 鐩存挱娴両D, 鏈夊�艰〃绀烘鍦ㄧ洿鎾� + deviceJOSNChannel.put("StreamID", deviceChannel.getStreamId()); // StreamID 鐩存挱娴両D, 鏈夊�艰〃绀烘鍦ㄧ洿鎾� deviceJOSNChannel.put("NumOutputs ", -1); // 鐩存挱鍦ㄧ嚎浜烘暟 channleJSONList.add(deviceJOSNChannel); } diff --git a/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java b/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java index 6180fbb..b3fc247 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java @@ -96,12 +96,12 @@ // streamInfo = cmder.playStreamCmd(device, code); }else { logger.debug("streamInfo 涓嶇瓑浜巒ull, 鍚戞祦濯掍綋鏌ヨ鏄惁姝e湪鎺ㄦ祦"); - String streamId = String.format("%08x", Integer.parseInt(streamInfo.getSsrc())).toUpperCase(); + String streamId = streamInfo.getStreamId(); JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); if (rtpInfo.getBoolean("exist")) { logger.debug("鍚戞祦濯掍綋鏌ヨ姝e湪鎺ㄦ祦, 鐩存帴杩斿洖: " + streamInfo.getRtsp()); JSONObject result = new JSONObject(); - result.put("StreamID", streamInfo.getSsrc()); + result.put("StreamID", streamInfo.getStreamId()); result.put("DeviceID", device.getDeviceId()); result.put("ChannelID", code); result.put("ChannelName", deviceChannel.getName()); @@ -141,7 +141,7 @@ if (logger.isDebugEnabled()) { logger.debug(String.format("璁惧棰勮 API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s",serial, code)); - logger.debug("璁惧棰勮 API璋冪敤锛宻src锛�"+streamInfo.getSsrc()+",ZLMedia streamId:"+Integer.toHexString(Integer.parseInt(streamInfo.getSsrc()))); + logger.debug("璁惧棰勮 API璋冪敤锛宻treamId锛�"+streamInfo.getStreamId()); } boolean lockFlag = true; long startTime = System.currentTimeMillis(); @@ -173,7 +173,7 @@ } if(streamInfo!=null) { JSONObject result = new JSONObject(); - result.put("StreamID", streamInfo.getSsrc()); + result.put("StreamID", streamInfo.getStreamId()); result.put("DeviceID", device.getDeviceId()); result.put("ChannelID", code); result.put("ChannelName", deviceChannel.getName()); @@ -234,7 +234,7 @@ result.put("error","鏈壘鍒版祦淇℃伅"); return result; } - cmder.streamByeCmd(streamInfo.getSsrc()); + cmder.streamByeCmd(streamInfo.getStreamId()); storager.stopPlay(streamInfo); return null; } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index b58c063..868298a 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -74,6 +74,8 @@ # 璁句负false鍙互鑾峰緱鏇村ソ鐨勫吋瀹规��,淇濊瘉杩斿洖鍚庢祦灏卞彲浠ユ挱鏀�, # 璁句负true鍙互蹇�熸墦寮�鎾斁绐楀彛,鍙互鑾峰緱鏇村ソ鐨勪綋楠� closeWaitRTPInfo: false + # [鍙�塢 鑷姩鐐规挱锛� 浣跨敤鍥哄畾娴佸湴鍧�杩涜鎾斁鏃讹紝濡傛灉鏈偣鎾垯鑷姩杩涜鐐规挱 + autoApplyPlay: true # 鍚敤udp澶氱鍙fā寮�, 璇︾粏瑙i噴鍙傝��: https://github.com/xia-chu/ZLMediaKit/wiki/GB28181%E6%8E%A8%E6%B5%81 涓嬬殑楂橀樁浣跨敤 rtp: # [鍙�塢 鏄惁鍚敤udp澶氱鍙fā寮�, 寮�鍚悗浼氬湪udpPortRange鑼冨洿鍐呴�夋嫨绔彛鐢ㄤ簬濯掍綋娴佷紶杈� diff --git a/web_src/src/components/channelList.vue b/web_src/src/components/channelList.vue index 4c39a3f..738012d 100644 --- a/web_src/src/components/channelList.vue +++ b/web_src/src/components/channelList.vue @@ -187,9 +187,9 @@ url: '/api/play/' + deviceId + '/' + channelId + '?getEncoding=' + getEncoding }).then(function (res) { console.log(res.data) - let ssrc = res.data.ssrc; + let streamId = res.data.streamId; that.isLoging = false; - if (!!ssrc) { + if (!!streamId) { // that.$refs.devicePlayer.play(res.data, deviceId, channelId, itemData.hasAudio); that.$refs.devicePlayer.openDialog("media", deviceId, channelId, { streamInfo: res.data, @@ -212,7 +212,7 @@ var that = this; this.$axios({ method: 'post', - url: '/api/play/' + itemData.ssrc + '/stop' + url: '/api/play/' + itemData.streamId + '/stop' }).then(function (res) { console.log(JSON.stringify(res)); that.initData(); diff --git a/web_src/src/components/gb28181/devicePlayer.vue b/web_src/src/components/gb28181/devicePlayer.vue index 8442a82..ed8464a 100644 --- a/web_src/src/components/gb28181/devicePlayer.vue +++ b/web_src/src/components/gb28181/devicePlayer.vue @@ -158,7 +158,6 @@ searchHistoryResult: [] //濯掍綋娴佸巻鍙茶褰曟悳绱㈢粨鏋� }, showVideoDialog: false, - ssrc: '', streamId: '', convertKey: '', deviceId: '', @@ -210,7 +209,6 @@ this.tabActiveName = tab; this.channelId = channelId; this.deviceId = deviceId; - this.ssrc = ""; this.streamId = ""; this.videoUrl = "" if (!!this.$refs.videoPlayer) { @@ -238,7 +236,6 @@ this.hasaudio = hasAudio; this.isLoging = false; this.videoUrl = streamInfo.ws_flv; - this.ssrc = streamInfo.ssrc; this.streamId = streamInfo.streamId; this.playFromStreamInfo(false, streamInfo) }, @@ -248,7 +245,7 @@ this.$refs.videoPlayer.pause() that.$axios({ method: 'post', - url: '/api/play/' + that.ssrc + '/convert' + url: '/api/play/' + that.streamId + '/convert' }).then(function (res) { if (res.data.code == 0) { that.convertKey = res.data.key; @@ -368,9 +365,9 @@ }, playRecord: function (row) { let that = this; - if (that.ssrc != "") { + if (that.streamId != "") { that.stopPlayRecord(function () { - that.ssrc = "", + that.streamId = "", that.playRecord(row); }) } else { @@ -380,7 +377,7 @@ row.endTime }).then(function (res) { var streamInfo = res.data; - that.ssrc = streamInfo.ssrc; + that.streamId = streamInfo.streamId; that.videoUrl = streamInfo.ws_flv; }); } @@ -390,7 +387,7 @@ this.videoUrl = ''; this.$axios({ method: 'get', - url: '/api/playback/' + this.ssrc + '/stop' + url: '/api/playback/' + this.streamId + '/stop' }).then(function (res) { if (callback) callback() }); -- Gitblit v1.8.0