From 20082441ef5f6d62b93d572cc5dfebb3616bea9a Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期三, 24 十一月 2021 15:09:43 +0800 Subject: [PATCH] 拉流代理接口添加无人观看则自动移除参数,拉流代理返回值增加流地址信息 --- src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 105 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java index 511ce85..90ecfd4 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java @@ -9,6 +9,7 @@ import com.genersoft.iot.vmp.service.bean.SSRCInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.service.IPlayService; +import com.genersoft.iot.vmp.vmanager.gb28181.session.InfoCseqCache; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -76,9 +77,9 @@ if (logger.isDebugEnabled()) { logger.debug(String.format("璁惧鍥炴斁 API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId)); } - UUID uuid = UUID.randomUUID(); + String uuid = UUID.randomUUID().toString(); + String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId; DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(30000L); - Device device = storager.queryVideoDevice(deviceId); if (device == null) { result.setResult(new ResponseEntity<>(HttpStatus.BAD_REQUEST)); @@ -91,7 +92,8 @@ result.onTimeout(()->{ logger.warn(String.format("璁惧鍥炴斁瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId)); RequestMessage msg = new RequestMessage(); - msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid); + msg.setId(uuid); + msg.setKey(key); msg.setData("Timeout"); resultHolder.invokeResult(msg); }); @@ -101,12 +103,13 @@ // 鍋滄涔嬪墠鐨勫洖鏀� cmder.streamByeCmd(deviceId, channelId); } - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid, result); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId, uuid, result); if (newMediaServerItem == null) { logger.warn(String.format("璁惧鍥炴斁瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId)); RequestMessage msg = new RequestMessage(); - msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid); + msg.setId(uuid); + msg.setKey(key); msg.setData("Timeout"); resultHolder.invokeResult(msg); return result; @@ -116,10 +119,10 @@ logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString()); playService.onPublishHandlerForPlayBack(mediaServerItem, response, deviceId, channelId, uuid.toString()); }, event -> { - Response response = event.getResponse(); RequestMessage msg = new RequestMessage(); - msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid); - msg.setData(String.format("鍥炴斁澶辫触锛� 閿欒鐮侊細 %s, %s", response.getStatusCode(), response.getReasonPhrase())); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("鍥炴斁澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); resultHolder.invokeResult(msg); }); @@ -150,4 +153,98 @@ return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR); } } + + @ApiOperation("鍥炴斁鏆傚仠") + @ApiImplicitParams({ + @ApiImplicitParam(name = "streamId", value = "鍥炴斁娴両D", dataTypeClass = String.class), + }) + @GetMapping("/pause/{streamId}") + public ResponseEntity<String> playPause(@PathVariable String streamId) { + logger.info("playPause: "+streamId); + JSONObject json = new JSONObject(); + StreamInfo streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId); + if (null == streamInfo) { + json.put("msg", "streamId涓嶅瓨鍦�"); + logger.warn("streamId涓嶅瓨鍦�!"); + return new ResponseEntity<String>(json.toString(), HttpStatus.BAD_REQUEST); + } + setCseq(streamId); + Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); + cmder.playPauseCmd(device, streamInfo); + json.put("msg", "ok"); + return new ResponseEntity<String>(json.toString(), HttpStatus.OK); + } + + @ApiOperation("鍥炴斁鎭㈠") + @ApiImplicitParams({ + @ApiImplicitParam(name = "streamId", value = "鍥炴斁娴両D", dataTypeClass = String.class), + }) + @GetMapping("/resume/{streamId}") + public ResponseEntity<String> playResume(@PathVariable String streamId) { + logger.info("playResume: "+streamId); + JSONObject json = new JSONObject(); + StreamInfo streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId); + if (null == streamInfo) { + json.put("msg", "streamId涓嶅瓨鍦�"); + logger.warn("streamId涓嶅瓨鍦�!"); + return new ResponseEntity<String>(json.toString(), HttpStatus.BAD_REQUEST); + } + setCseq(streamId); + Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); + cmder.playResumeCmd(device, streamInfo); + json.put("msg", "ok"); + return new ResponseEntity<String>(json.toString(), HttpStatus.OK); + } + + @ApiOperation("鍥炴斁鎷栧姩鎾斁") + @ApiImplicitParams({ + @ApiImplicitParam(name = "streamId", value = "鍥炴斁娴両D", dataTypeClass = String.class), + @ApiImplicitParam(name = "seekTime", value = "鎷栧姩鍋忕Щ閲忥紝鍗曚綅s", dataTypeClass = Long.class), + }) + @GetMapping("/seek/{streamId}/{seekTime}") + public ResponseEntity<String> playSeek(@PathVariable String streamId, @PathVariable long seekTime) { + logger.info("playSeek: "+streamId+", "+seekTime); + JSONObject json = new JSONObject(); + StreamInfo streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId); + if (null == streamInfo) { + json.put("msg", "streamId涓嶅瓨鍦�"); + logger.warn("streamId涓嶅瓨鍦�!"); + return new ResponseEntity<String>(json.toString(), HttpStatus.BAD_REQUEST); + } + setCseq(streamId); + Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); + cmder.playSeekCmd(device, streamInfo, seekTime); + json.put("msg", "ok"); + return new ResponseEntity<String>(json.toString(), HttpStatus.OK); + } + + @ApiOperation("鍥炴斁鍊嶉�熸挱鏀�") + @ApiImplicitParams({ + @ApiImplicitParam(name = "streamId", value = "鍥炴斁娴両D", dataTypeClass = String.class), + @ApiImplicitParam(name = "speed", value = "鍊嶉�� 1銆�2銆�4", dataTypeClass = String.class), + }) + @GetMapping("/speed/{streamId}/{speed}") + public ResponseEntity<String> playSpeed(@PathVariable String streamId, @PathVariable String speed) { + logger.info("playSpeed: "+streamId+", "+speed); + JSONObject json = new JSONObject(); + StreamInfo streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId); + if (null == streamInfo) { + json.put("msg", "streamId涓嶅瓨鍦�"); + logger.warn("streamId涓嶅瓨鍦�!"); + return new ResponseEntity<String>(json.toString(), HttpStatus.BAD_REQUEST); + } + setCseq(streamId); + Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); + cmder.playSpeedCmd(device, streamInfo, speed); + json.put("msg", "ok"); + return new ResponseEntity<String>(json.toString(), HttpStatus.OK); + } + + public void setCseq(String streamId) { + if (InfoCseqCache.CSEQCACHE.containsKey(streamId)) { + InfoCseqCache.CSEQCACHE.put(streamId, InfoCseqCache.CSEQCACHE.get(streamId) + 1); + } else { + InfoCseqCache.CSEQCACHE.put(streamId, 2L); + } + } } -- Gitblit v1.8.0