| | |
| | | package com.ard.sample.manage.service.impl; |
| | | |
| | | import com.ard.sample.common.error.CommonErrorEnum; |
| | | import com.ard.sample.common.error.LiveErrorEnum; |
| | | import com.ard.sample.common.model.ResponseResult; |
| | | import com.ard.sample.component.mqtt.model.CommonTopicResponse; |
| | |
| | | import com.ard.sample.manage.service.ILiveStreamService; |
| | | import com.ard.vtdu.config.MediamtxConfig; |
| | | import com.ard.vtdu.domain.ArdVtdu; |
| | | import com.ard.vtdu.service.IArdMediaService; |
| | | import com.ard.vtdu.service.IArdVtduService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | */ |
| | | @Slf4j |
| | | @Service |
| | | @Transactional |
| | | //@Transactional |
| | | public class LiveStreamServiceImpl implements ILiveStreamService { |
| | | |
| | | @Autowired |
| | |
| | | return responseResult; |
| | | } |
| | | |
| | | // 将机场推流代码放到入库代码后面。 |
| | | DeviceDTO data = (DeviceDTO) responseResult.getData(); |
| | | // target topic |
| | | String respTopic = THING_MODEL_PRE + PRODUCT + |
| | | data.getDeviceSn() + SERVICES_SUF; |
| | | ServiceReply receiveReply = this.publishLiveStart(respTopic, liveParam); |
| | | ServiceReply receiveReply=new ServiceReply(); |
| | | // ServiceReply receiveReply = this.publishLiveStart(respTopic, liveParam); |
| | | |
| | | if (ResponseResult.CODE_SUCCESS != receiveReply.getResult()) { |
| | | return ResponseResult.error(LiveErrorEnum.find(receiveReply.getResult())); |
| | | } |
| | | // if (ResponseResult.CODE_SUCCESS != receiveReply.getResult()) { |
| | | // log.info("机场直播开启失败,错误码:{},错误描述:{}", receiveReply.getResult(), LiveErrorEnum.find(receiveReply.getResult()).getErrorMsg()); |
| | | // return ResponseResult.error(receiveReply.getResult(), LiveErrorEnum.find(receiveReply.getResult()).getErrorMsg()); |
| | | // } |
| | | |
| | | LiveUrlTypeEnum urlType = LiveUrlTypeEnum.find(liveParam.getUrlType()); |
| | | LiveDTO live = new LiveDTO(); |
| | |
| | | String webrtcUrl = |
| | | protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + name; // 拼接 |
| | | // webrtcUrl |
| | | |
| | | //不管插入数据库成不成功,都返回地址 |
| | | live.setRtmpUrl(rtmpUrl); |
| | | live.setRtspUrl(rtspUrl); |
| | | live.setWebrtcUrl(webrtcUrl); |
| | | |
| | | // 如果没有,插入新的记录 |
| | | ArdVtdu vtdu = |
| | |
| | | // live.setRtspUrl(rtspUrl); |
| | | // live.setWebrtcUrl(webrtcUrl); |
| | | // } |
| | | receiveReply = this.publishLiveStart(respTopic, liveParam); |
| | | |
| | | if (ResponseResult.CODE_SUCCESS != receiveReply.getResult()) { |
| | | log.info("机场直播开启失败,错误码:{},错误描述:{}", receiveReply.getResult(), LiveErrorEnum.find(receiveReply.getResult()).getErrorMsg()); |
| | | return ResponseResult.error(receiveReply.getResult(), LiveErrorEnum.find(receiveReply.getResult()).getErrorMsg()); |
| | | } |
| | | break; |
| | | case RTSP: |
| | | receiveReply = this.publishLiveStart(respTopic, liveParam); |
| | | |
| | | if (ResponseResult.CODE_SUCCESS != receiveReply.getResult()) { |
| | | log.info("机场直播开启失败,错误码:{},错误描述:{}", receiveReply.getResult(), LiveErrorEnum.find(receiveReply.getResult()).getErrorMsg()); |
| | | return ResponseResult.error(receiveReply.getResult(), LiveErrorEnum.find(receiveReply.getResult()).getErrorMsg()); |
| | | } |
| | | Object url = Objects.requireNonNullElse(receiveReply.getOutput(), receiveReply.getInfo()); |
| | | this.resolveUrlUser(String.valueOf(url), live); |
| | | break; |
| | |
| | | return ResponseResult.error(LiveErrorEnum.URL_TYPE_NOT_SUPPORTED); |
| | | } |
| | | |
| | | |
| | | |
| | | // 开始直播时发送机场相机摄像头默认信息(舱外)到所有在线用户,只取机场sn,发机场的摄像头信息 |
| | | if(data.getChildDeviceSn()!=null) { |
| | | String sn = data.getDeviceSn(); |
| | | deviceService.setRedisCameraPosition(sn, 1); |
| | | } |
| | | return ResponseResult.success(live); |
| | | } |
| | | |
| | |
| | | |
| | | ServiceReply receiveReply = this.publishLiveStop(respTopic, videoId); |
| | | if (receiveReply.getResult() != 0) { |
| | | log.info("videoId:{},直播停止失败,错误码:{},错误描述:{}", videoId, receiveReply.getResult(), LiveErrorEnum.find(receiveReply.getResult()).getErrorMsg()); |
| | | return ResponseResult.error(LiveErrorEnum.find(receiveReply.getResult())); |
| | | } |
| | | //注释掉删除流媒体管理库中的信息 |
| | |
| | | |
| | | @Override |
| | | public ResponseResult liveLensChange(LiveTypeDTO liveParam) { |
| | | log.info("切换镜头参数:{}", liveParam); |
| | | ResponseResult<DeviceDTO> responseResult = this.checkBeforeLive(liveParam.getVideoId()); |
| | | if (ResponseResult.CODE_SUCCESS != responseResult.getCode()) { |
| | | return responseResult; |
| | |
| | | ServiceReply receiveReply = this.publishLiveLensChange(respTopic, liveParam); |
| | | |
| | | if (ResponseResult.CODE_SUCCESS != receiveReply.getResult()) { |
| | | Integer code = receiveReply.getResult(); |
| | | if(code == 325003) { |
| | | // 指令响应失败,请重试. 经查询官网,机场3为低配,飞行器不支持红外 |
| | | return ResponseResult.error(325003000,LiveErrorEnum.COMMAND_FAILED.getErrorMsg()+"请确认无人机是否支持此功能!"); |
| | | } |
| | | return ResponseResult.error(LiveErrorEnum.find(receiveReply.getResult())); |
| | | } |
| | | |
| | | return ResponseResult.success(); |
| | | } |
| | | |
| | | @Override |
| | | public ResponseResult<List<String>> getLiveLens(String sn) { |
| | | List<String> videoTypes = new ArrayList<>(); |
| | | // 检查设备是否在线 |
| | | if (!deviceService.checkDeviceOnline(sn)) { |
| | | log.info("SN: {}-设备不在线,请检查网络连接!", sn); |
| | | // 抛弃出异常,给调用者处理 |
| | | //throw new Exception("设备不在线,请检查网络连接!"); |
| | | return ResponseResult.error(CommonErrorEnum.DEVICE_OFFLINE.getErrorCode(),CommonErrorEnum.DEVICE_OFFLINE.getErrorMsg()); |
| | | } |
| | | // 读取直播能力拼接参数 |
| | | List<CapacityDeviceDTO> devicesList = getLiveCapacity(); |
| | | if (devicesList == null || devicesList.isEmpty()) { |
| | | log.info("SN: {}-未获得设备直播能力!", sn); |
| | | // 抛弃出异常,给调用者处理 |
| | | //throw new Exception("未获得设备直播能力!"); |
| | | return ResponseResult.error(22222200,"未获得设备直播能力!"); |
| | | } |
| | | for (CapacityDeviceDTO device : devicesList) { |
| | | if (!device.getSn().equals(sn)) { |
| | | continue; |
| | | } |
| | | List<CapacityCameraDTO> camerasList = device.getCamerasList(); |
| | | for (CapacityCameraDTO camera : camerasList) { |
| | | // 机场3中飞行器,没有name,需要其他条件确定主摄像头参数 |
| | | for (CapacityVideoDTO video : camera.getVideosList()) { |
| | | if (video.getSwitchVideoTypes().size() == 1 && camera.getName() == null) { |
| | | continue; |
| | | } |
| | | videoTypes = video.getSwitchVideoTypes(); |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | return ResponseResult.success(videoTypes); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (ResponseResult.CODE_SUCCESS != receiveReply.getResult()) { |
| | | return ResponseResult.error(LiveErrorEnum.find(receiveReply.getResult())); |
| | | } |
| | | // 将切换相机摄像头信息到redis |
| | | Integer camera_position = liveParam.getCameraPosition(); |
| | | String sn = responseResult.getData().getDeviceSn(); |
| | | deviceService.setRedisCameraPosition(sn, camera_position); |
| | | |
| | | return ResponseResult.success(); |
| | | } |