| | |
| | | @Component |
| | | public class LiveStreamHandler { |
| | | @Autowired |
| | | protected ObjectMapper _objectMapper; |
| | | @Autowired |
| | | private IDeviceService _deviceService; |
| | | |
| | | @Autowired |
| | | private ILiveStreamService _liveStreamService; |
| | | |
| | | @Autowired |
| | | private DockWebSocketHandler _dockWebSocketHandler; |
| | | |
| | | @Autowired |
| | | protected ObjectMapper _objectMapper; |
| | | |
| | | /** |
| | | * 开启直播 |
| | | */ |
| | | public void StartLiveStreaming(String sn, String videotype ) { |
| | | // 检查设备是否在线 |
| | | if (!_deviceService.checkDeviceOnline(sn)) { |
| | | String jsonString = getResult(sn, "设备不在线,请检查网络连接!"); |
| | | log.info("SN: {}-设备不在线,请检查网络连接!", sn); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.LIVESTREAM.getType(), jsonString); |
| | | return; |
| | | } |
| | | // 读取直播能力拼接参数 |
| | | List<CapacityDeviceDTO> devicesList = _liveStreamService.getLiveCapacity(); |
| | | if (devicesList == null || devicesList.isEmpty()) { |
| | | String jsonString = getResult(sn, "未获得设备直播能力!"); |
| | | log.info("SN: {}-未获得设备直播能力!", sn); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.LIVESTREAM.getType(), jsonString); |
| | | return; |
| | | } |
| | | for (CapacityDeviceDTO device : devicesList) { |
| | | if (!device.getSn().equals(sn)) { |
| | | continue; |
| | | } |
| | | List<CapacityCameraDTO> camerasList = device.getCamerasList(); |
| | | for (CapacityCameraDTO camera : camerasList) { |
| | | if (camera.getName()==null || camera.getName().isEmpty()) { |
| | | continue; |
| | | } |
| | | LiveTypeDTO param = new LiveTypeDTO(); |
| | | String videoid = device.getSn() + "/" + camera.getIndex(); |
| | | List<CapacityVideoDTO> videosList = camera.getVideosList(); |
| | | for (CapacityVideoDTO video : videosList) { |
| | | videoid = videoid + "/" + video.getIndex(); |
| | | param.setUrlType(1); |
| | | param.setUrl(""); |
| | | param.setVideoId(videoid); |
| | | param.setVideoQuality(1); |
| | | param.setVideoType(videotype); |
| | | //调用开始直播 |
| | | ResponseResult rlive = null; |
| | | String resultLive = ""; |
| | | try { |
| | | rlive = _liveStreamService.liveStart(param); |
| | | if (rlive != null) { |
| | | // if (rlive.getCode() == 513003) { |
| | | while (rlive.getCode() == 513003) { |
| | | //Thread.sleep(200); |
| | | _liveStreamService.liveStop(param.getVideoId()); |
| | | //System.out.println("相机已经在直播中,关闭直播后重启直播!"); |
| | | log.info("SN: {}-相机已经在直播中,关闭直播后重启直播!", sn); |
| | | rlive = _liveStreamService.liveStart(param); |
| | | } |
| | | if(rlive.getCode() == 0){ |
| | | // 直播成功后,在redis中存一个标记,将videoid保留,留给停止直播使用 |
| | | //System.out.println("开启直播成功!"); |
| | | log.info("SN: {}-开启直播成功!", sn); |
| | | RedisOpsUtils.setWithExpire(RedisConst.WEBSOCKET_VideoId_PREFIX + sn, param.getVideoId(), RedisConst.WEBSOCKET_ALIVE_SECOND); |
| | | } |
| | | rlive.setGateway(sn); |
| | | rlive.setType(MessageType.LIVESTREAM.getType()); |
| | | resultLive = _objectMapper.writeValueAsString(rlive); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.LIVESTREAM.getType(), resultLive); |
| | | log.info("SN: {}-直播地址:{}", sn, resultLive); |
| | | break; |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | public void StartLiveStreaming(String sn) { |
| | | //调用开始直播 |
| | | ResponseResult rlive = null; |
| | | String resultLive = ""; |
| | | try { |
| | | // 获取直播参数 |
| | | LiveTypeDTO param = getLiveParam(sn); |
| | | // 如果存在直播则读取直播地址返回 |
| | | if (RedisOpsUtils.checkExist(RedisConst.WEBSOCKET_VIDEO_ADDRESS_PREFIX + sn)) { |
| | | resultLive = String.valueOf(RedisOpsUtils.get(RedisConst.WEBSOCKET_VIDEO_ADDRESS_PREFIX + sn)); |
| | | } else { |
| | | log.info("SN: {}-redis中未找到相机的播放地址信息!停止直播后再开启直播", sn); |
| | | StopLiveStreaming(sn); |
| | | // 如果不存在直播,则开始直播,并返回直播地址 |
| | | rlive = _liveStreamService.liveStart(param); |
| | | if (rlive.getCode() == 0) { |
| | | // 直播成功后,在redis中存一个标记,将videoid保留,留给停止直播使用 |
| | | log.info("SN: {}-开启直播成功!", sn); |
| | | rlive.setGateway(sn); |
| | | rlive.setType(MessageType.LIVESTREAM.getType()); |
| | | resultLive = _objectMapper.writeValueAsString(rlive); |
| | | RedisOpsUtils.set(RedisConst.WEBSOCKET_VIDEO_ADDRESS_PREFIX + sn, resultLive); |
| | | |
| | | _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.LIVESTREAM.getType(), resultLive); |
| | | log.info("SN: {}-直播地址:{}", sn, resultLive); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | log.info("SN: {}-开启直播失败!原因:{}", sn, e.getMessage()); |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | public void StopLiveStreaming(String sn) { |
| | | // 停止直播逻辑 |
| | | ResponseResult rlive = null; |
| | | String resultLive = ""; |
| | | // System.out.println("关闭直播"); |
| | | String videoid = ""; |
| | | if(!RedisOpsUtils.checkExist(RedisConst.WEBSOCKET_VideoId_PREFIX + sn)){ |
| | | resultLive = getResult(sn, "未找到正在直播的相机!"); |
| | | // String resultLive = ""; |
| | | try { |
| | | // 获取直播参数 |
| | | LiveTypeDTO param = getLiveParam(sn); |
| | | // 停止直播逻辑 |
| | | rlive = _liveStreamService.liveStop(param.getVideoId()); |
| | | // rlive.setGateway(sn); |
| | | // rlive.setType(MessageType.LIVESTREAM.getType()); |
| | | // resultLive = _objectMapper.writeValueAsString(rlive); |
| | | RedisOpsUtils.del(RedisConst.WEBSOCKET_VIDEO_ADDRESS_PREFIX + sn); |
| | | log.info("SN: {}-停止直播,并删除redis直播信息!", sn); |
| | | } catch (Exception e) { |
| | | log.info("SN: {}-停止直播时发生异常,原因:{}", sn,e.getMessage()); |
| | | e.printStackTrace(); |
| | | } |
| | | else { |
| | | videoid = String.valueOf(RedisOpsUtils.get(RedisConst.WEBSOCKET_VideoId_PREFIX + sn)); |
| | | try { |
| | | rlive = _liveStreamService.liveStop(videoid); |
| | | rlive.setGateway(sn); |
| | | resultLive = _objectMapper.writeValueAsString(rlive); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.LIVESTREAM.getType(), resultLive); |
| | | // 停止直播不返回数据,直接删除redis中的直播地址标记即可;并且方法在websocket连接断开后执行。 |
| | | } |
| | | |
| | | public String getResult(String sn, String msg) { |
| | |
| | | |
| | | return jsonString; |
| | | } |
| | | |
| | | /** |
| | | * 获取直播参数 |
| | | */ |
| | | public LiveTypeDTO getLiveParam(String sn) throws Exception { |
| | | LiveTypeDTO param = new LiveTypeDTO(); |
| | | // 检查设备是否在线 |
| | | if (!_deviceService.checkDeviceOnline(sn)) { |
| | | log.info("SN: {}-设备不在线,请检查网络连接!", sn); |
| | | // 抛弃出异常,给调用者处理 |
| | | throw new Exception("设备不在线,请检查网络连接!"); |
| | | } |
| | | // 读取直播能力拼接参数 |
| | | List<CapacityDeviceDTO> devicesList = _liveStreamService.getLiveCapacity(); |
| | | if (devicesList == null || devicesList.isEmpty()) { |
| | | log.info("SN: {}-未获得设备直播能力!", sn); |
| | | // 抛弃出异常,给调用者处理 |
| | | throw new Exception("未获得设备直播能力!"); |
| | | } |
| | | for (CapacityDeviceDTO device : devicesList) { |
| | | if (!device.getSn().equals(sn)) { |
| | | continue; |
| | | } |
| | | List<CapacityCameraDTO> camerasList = device.getCamerasList(); |
| | | for (CapacityCameraDTO camera : camerasList) { |
| | | if (camera.getName() == null || camera.getName().isEmpty()) { |
| | | continue; |
| | | } |
| | | String videoid = device.getSn() + "/" + camera.getIndex(); |
| | | List<CapacityVideoDTO> videosList = camera.getVideosList(); |
| | | for (CapacityVideoDTO video : videosList) { |
| | | videoid = videoid + "/" + video.getIndex(); |
| | | param.setUrlType(1); |
| | | param.setUrl(""); |
| | | param.setVideoId(videoid); |
| | | param.setVideoQuality(1); |
| | | param.setVideoType(video.getSwitchVideoTypes().get(0)); |
| | | } |
| | | } |
| | | } |
| | | return param; |
| | | } |
| | | } |