From 2eb1ca2d94a09c2d3ced69de28de72d2d6d77d8e Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期四, 03 三月 2022 15:57:28 +0800 Subject: [PATCH] 国标录像支持多端同时播放 --- src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java | 52 +++++++++++++++++++++++++++++++++------------------- 1 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java index 8ebd8ed..853ec56 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java @@ -1,18 +1,20 @@ package com.genersoft.iot.vmp.web.gb28181; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.conf.UserSetup; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; +import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; +import com.genersoft.iot.vmp.service.IPlayService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.vmanager.gb28181.play.PlayController; +import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; @@ -34,15 +36,13 @@ private IVideoManagerStorager storager; @Autowired - private IRedisCatchStorage redisCatchStorage; - - - // @Autowired - // private ZLMRESTfulUtils zlmresTfulUtils; - + private UserSetup userSetup; @Autowired - private PlayController playController; + private IRedisCatchStorage redisCatchStorage; + + @Autowired + private IPlayService playService; /** * 瀹炴椂鐩存挱 - 寮�濮嬬洿鎾� @@ -69,7 +69,7 @@ @RequestParam(required = false)String timeout ){ - DeferredResult<JSONObject> resultDeferredResult = new DeferredResult<JSONObject>(); + DeferredResult<JSONObject> resultDeferredResult = new DeferredResult<>(userSetup.getPlayTimeout() + 10); Device device = storager.queryVideoDevice(serial); if (device == null ) { JSONObject result = new JSONObject(); @@ -99,13 +99,11 @@ result.put("error","channel[ " + code + " ]offline"); resultDeferredResult.setResult(result); } - DeferredResult<ResponseEntity<String>> play = playController.play(serial, code); - - play.setResultHandler((Object o)->{ - ResponseEntity<String> responseEntity = (ResponseEntity)o; - StreamInfo streamInfo = JSON.parseObject(responseEntity.getBody(), StreamInfo.class); + MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device); + PlayResult play = playService.play(newMediaServerItem, serial, code, (mediaServerItem, response)->{ + StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(serial, code); JSONObject result = new JSONObject(); - result.put("StreamID", streamInfo.getStreamId()); + result.put("StreamID", streamInfo.getStream()); result.put("DeviceID", device.getDeviceId()); result.put("ChannelID", code); result.put("ChannelName", deviceChannel.getName()); @@ -134,7 +132,23 @@ result.put("NumOutputs", ""); result.put("CascadeSize", ""); result.put("RelaySize", ""); - result.put("ChannelPTZType", 0); + result.put("ChannelPTZType", "0"); + resultDeferredResult.setResult(result); +// Class<?> aClass = responseEntity.getClass().getSuperclass(); +// Field body = null; +// try { +// // 浣跨敤鍙嶅皠鍔ㄦ�佷慨鏀硅繑鍥炵殑body +// body = aClass.getDeclaredField("body"); +// body.setAccessible(true); +// body.set(responseEntity, result); +// } catch (NoSuchFieldException e) { +// e.printStackTrace(); +// } catch (IllegalAccessException e) { +// e.printStackTrace(); +// } + }, (eventResult) -> { + JSONObject result = new JSONObject(); + result.put("error", "channel[ " + code + " ] " + eventResult.msg); resultDeferredResult.setResult(result); }); return resultDeferredResult; @@ -163,7 +177,7 @@ result.put("error","鏈壘鍒版祦淇℃伅"); return result; } - cmder.streamByeCmd(serial, code); + cmder.streamByeCmd(serial, code, streamInfo.getStream()); redisCatchStorage.stopPlay(streamInfo); storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); return null; -- Gitblit v1.8.0