Browse Source

自动播放直播流

pull/6/head
吴远 3 months ago
parent
commit
80d7e72bcb
  1. 2
      dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java
  2. 4
      dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java
  3. 43
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java
  4. 20
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java
  5. 11
      dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java
  6. 10
      dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java
  7. 7
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java

2
dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java

@ -39,7 +39,7 @@ public class TakeoffToPointParam {
@Range(min = 2, max = 1500) @Range(min = 2, max = 1500)
@NotNull @NotNull
private Double rthAltitude; private Integer rthAltitude;
@NotNull @NotNull
private RcLostActionEnum rcLostAction; private RcLostActionEnum rcLostAction;

4
dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java

@ -196,9 +196,9 @@ public class ControlServiceImpl implements IControlService {
waylineJobEntity.setBeginTime(new Date()); waylineJobEntity.setBeginTime(new Date());
waylineJobEntity.setStatus(WaylineJobStatusEnum.PENDING.getVal()); waylineJobEntity.setStatus(WaylineJobStatusEnum.PENDING.getVal());
waylineJobEntity.setOutOfControlAction(OutOfControlActionEnum.RETURN_TO_HOME.getAction()); waylineJobEntity.setOutOfControlAction(OutOfControlActionEnum.RETURN_TO_HOME.getAction());
waylineJobEntity.setRthAltitude(Integer.parseInt(param.getRthAltitude().toString())); waylineJobEntity.setRthAltitude(param.getRthAltitude());
waylineJobEntity.setMediaCount(0); waylineJobEntity.setMediaCount(0);
waylineJobEntity.setJobType(WaylineJobTypeEnum.PEOPLE_TASK.getType()); waylineJobEntity.setJobType(WaylineJobTypeEnum.INSTRUCT.getType());
TopicServicesResponse<ServicesReplyData> response = abstractControlService.takeoffToPoint( TopicServicesResponse<ServicesReplyData> response = abstractControlService.takeoffToPoint(
SDKManager.getDeviceSDK(sn), mapper.convertValue(param, TakeoffToPointRequest.class)); SDKManager.getDeviceSDK(sn), mapper.convertValue(param, TakeoffToPointRequest.class));
ServicesReplyData reply = response.getData(); ServicesReplyData reply = response.getData();

43
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java

@ -1,23 +1,28 @@
package org.dromara.sample.manage.service.impl; package org.dromara.sample.manage.service.impl;
import org.dromara.common.rocketmq.producer.MessageProducerUtil;
import org.dromara.common.sdk.cloudapi.device.DeviceDomainEnum; import org.dromara.common.sdk.cloudapi.device.DeviceDomainEnum;
import org.dromara.common.sdk.cloudapi.device.VideoId; import org.dromara.common.sdk.cloudapi.device.VideoId;
import org.dromara.common.sdk.cloudapi.livestream.*; import org.dromara.common.sdk.cloudapi.livestream.*;
import org.dromara.common.sdk.cloudapi.livestream.api.AbstractLivestreamService; import org.dromara.common.sdk.cloudapi.livestream.api.AbstractLivestreamService;
import org.dromara.common.sdk.cloudapi.wayline.FlighttaskProgress;
import org.dromara.common.sdk.common.HttpResultResponse; import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.SDKManager; import org.dromara.common.sdk.common.SDKManager;
import org.dromara.common.sdk.mqtt.services.ServicesReplyData; import org.dromara.common.sdk.mqtt.services.ServicesReplyData;
import org.dromara.common.sdk.mqtt.services.TopicServicesResponse; import org.dromara.common.sdk.mqtt.services.TopicServicesResponse;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.manage.model.dto.*; import org.dromara.sample.manage.model.dto.*;
import org.dromara.sample.manage.model.entity.DeviceEntity;
import org.dromara.sample.manage.model.param.DeviceQueryParam; import org.dromara.sample.manage.model.param.DeviceQueryParam;
import org.dromara.sample.manage.service.*; import org.dromara.sample.manage.service.*;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import org.dromara.sample.wayline.service.IWaylineJobService;
import org.dromara.sample.wayline.service.IWaylineRedisService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.*;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -44,6 +49,16 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
@Autowired @Autowired
private AbstractLivestreamService abstractLivestreamService; private AbstractLivestreamService abstractLivestreamService;
@Autowired
private IPlayTextService playTextService;
@Autowired
private IWaylineRedisService waylineRedisService;
@Autowired
private IWaylineJobService waylineJobService;
@Override @Override
public List<CapacityDeviceDTO> getLiveCapacity(String workspaceId) { public List<CapacityDeviceDTO> getLiveCapacity(String workspaceId) {
@ -68,17 +83,13 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
@Override @Override
public HttpResultResponse liveStart(LiveTypeDTO liveParam) { public HttpResultResponse liveStart(LiveTypeDTO liveParam) {
// Check if this lens is available live. // Check if this lens is available live.
HttpResultResponse<DeviceDTO> responseResult = this.checkBeforeLive(liveParam.getVideoId()); HttpResultResponse<DeviceDTO> responseResult = this.checkBeforeLive(liveParam.getVideoId());
if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) { if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) {
return responseResult; return responseResult;
} }
Boolean flag = deviceRedisService.checkDeviceVideo(liveParam.getVideoId().getDroneSn());
ILivestreamUrl url = LiveStreamProperty.get(liveParam.getUrlType()); ILivestreamUrl url = LiveStreamProperty.get(liveParam.getUrlType());
url = setExt(liveParam.getUrlType(), url, liveParam.getVideoId()); url = setExt(liveParam.getUrlType(), url, liveParam.getVideoId());
if (!flag) {
TopicServicesResponse<ServicesReplyData<String>> response = abstractLivestreamService.liveStartPush( TopicServicesResponse<ServicesReplyData<String>> response = abstractLivestreamService.liveStartPush(
SDKManager.getDeviceSDK(responseResult.getData().getDeviceSn()), SDKManager.getDeviceSDK(responseResult.getData().getDeviceSn()),
new LiveStartPushRequest() new LiveStartPushRequest()
@ -88,6 +99,7 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
.setVideoQuality(liveParam.getVideoQuality())); .setVideoQuality(liveParam.getVideoQuality()));
if (!response.getData().getResult().isSuccess()) { if (!response.getData().getResult().isSuccess()) {
if(response.getData().getResult().getCode() != 513003){
return HttpResultResponse.error(response.getData().getResult()); return HttpResultResponse.error(response.getData().getResult());
} }
} }
@ -116,7 +128,22 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
default: default:
return HttpResultResponse.error(LiveErrorCodeEnum.URL_TYPE_NOT_SUPPORTED); return HttpResultResponse.error(LiveErrorCodeEnum.URL_TYPE_NOT_SUPPORTED);
} }
DeviceEntity deviceBySn = deviceService.getDeviceByChildSn(liveParam.getVideoId().getDroneSn());
if(deviceBySn != null){
Optional<EventsReceiver<FlighttaskProgress>> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceBySn.getDeviceSn());
Map<String,Object> reqMap = new HashMap<>();
if(runningWaylineJob.isPresent()) {
String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId();
Optional<WaylineJobDTO> waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId);
reqMap.put("jobId",waylineJobDTO.get().getJobId());
reqMap.put("jobName",waylineJobDTO.get().getJobName());
reqMap.put("deviceSn",deviceBySn.getDeviceSn());
playTextService.streamType(reqMap);
}
}
// MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStart",liveParam.getVideoId().getDroneSn(),liveParam.getVideoId().toString());
return HttpResultResponse.success(live); return HttpResultResponse.success(live);
} }

20
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java

@ -181,15 +181,23 @@ public class SDKDeviceService extends AbstractDeviceService {
@Override @Override
public void dockLiveStatusUpdate(TopicStateRequest<DockLiveStatus> request, MessageHeaders headers){ public void dockLiveStatusUpdate(TopicStateRequest<DockLiveStatus> request, MessageHeaders headers){
Optional<DeviceDTO> dockOnline = deviceRedisService.getDeviceOnline(request.getGateway()); /*Optional<DeviceDTO> dockOnline = deviceRedisService.getDeviceOnline(request.getGateway());
Optional<DeviceDTO> deviceOnline = deviceRedisService.getDeviceOnline(dockOnline.get().getChildDeviceSn()); Optional<DeviceDTO> deviceOnline = deviceRedisService.getDeviceOnline(dockOnline.get().getChildDeviceSn());
Optional<OsdDock> deviceOsd = deviceRedisService.getDeviceOsd(dockOnline.get().getDeviceSn(), OsdDock.class);
if(deviceOsd.get().getModeCode().getCode() != 4){
return;
}
if(!RedisOpsUtils.checkExist("video"+deviceOnline.get().getDeviceSn())){
return;
}
RedisOpsUtils.set("video"+deviceOnline.get().getDeviceSn(),60);
if(deviceOnline.isEmpty()){ if(deviceOnline.isEmpty()){
return; return;
} }
if(request.getData().getLiveStatus().size() == 0 ){ if(request.getData().getLiveStatus().size() == 0 ){
String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice(); String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice();
deviceRedisService.delDeviceVideo(deviceOnline.get().getDeviceSn()); deviceRedisService.delDeviceVideo(deviceOnline.get().getDeviceSn());
VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL + DASH+DeviceTypeVideoEnum.ZERO.getVideoType()); VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType());
MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString()); MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString());
} }
@ -197,10 +205,10 @@ public class SDKDeviceService extends AbstractDeviceService {
item.getVideoId().getDroneSn().equals(dockOnline.get().getChildDeviceSn()) && item.getStatus() == true).collect(Collectors.toList()); item.getVideoId().getDroneSn().equals(dockOnline.get().getChildDeviceSn()) && item.getStatus() == true).collect(Collectors.toList());
if(dockLiveStatusDataList.size() == 0){ if(dockLiveStatusDataList.size() == 0){
String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice(); String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice();
VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL + DASH+DeviceTypeVideoEnum.ZERO.getVideoType()); VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType());
deviceRedisService.delDeviceVideo(deviceOnline.get().getDeviceSn()); deviceRedisService.delDeviceVideo(deviceOnline.get().getDeviceSn());
MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString()); MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString());
} }*/
} }
@Override @Override
@ -221,11 +229,11 @@ public class SDKDeviceService extends AbstractDeviceService {
} }
DeviceDTO device = deviceOpt.get(); DeviceDTO device = deviceOpt.get();
String deviceVideoEnum = DeviceVideoEnum.find(device.getDeviceName()).getDevice(); /*String deviceVideoEnum = DeviceVideoEnum.find(device.getDeviceName()).getDevice();
if(!deviceRedisService.checkDeviceVideo(device.getDeviceSn())){ if(!deviceRedisService.checkDeviceVideo(device.getDeviceSn())){
VideoId videoId = new VideoId(device.getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType()); VideoId videoId = new VideoId(device.getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType());
MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStart",device.getDeviceSn(),videoId.toString()); MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStart",device.getDeviceSn(),videoId.toString());
} }*/
deviceRedisService.setDeviceOnline(device); deviceRedisService.setDeviceOnline(device);
deviceRedisService.setDeviceOsd(from, request.getData()); deviceRedisService.setDeviceOsd(from, request.getData());
deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, request.getData()); deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, request.getData());

11
dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java

@ -3,6 +3,7 @@ package org.dromara.sample.media.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.dromara.common.core.constant.DeviceQrtzConstants; import org.dromara.common.core.constant.DeviceQrtzConstants;
import org.dromara.common.sdk.cloudapi.device.OsdDock;
import org.dromara.common.sdk.cloudapi.media.*; import org.dromara.common.sdk.cloudapi.media.*;
import org.dromara.common.sdk.cloudapi.media.api.AbstractMediaService; import org.dromara.common.sdk.cloudapi.media.api.AbstractMediaService;
import org.dromara.common.sdk.mqtt.MqttReply; import org.dromara.common.sdk.mqtt.MqttReply;
@ -113,9 +114,17 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ
String jobId = callback.getFile().getExt().getFlightId(); String jobId = callback.getFile().getExt().getFlightId();
Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(request.getGateway()); Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(request.getGateway());
if(deviceRedisService.getDeviceOsd(request.getGateway(), OsdDock.class).get().getModeCode().getCode() == 4){
DeviceDTO device = deviceOpt.get();
boolean isSave = parseMediaFile(callback, device);
if (!isSave) {
log.error("将文件保存到数据库失败,请手动检查数据。");
return null;
}
return new TopicEventsResponse<MqttReply>().setData(MqttReply.success());
}
MediaFileCountDTO mediaFileCount = mediaRedisService.getMediaCount(request.getGateway(), jobId); MediaFileCountDTO mediaFileCount = mediaRedisService.getMediaCount(request.getGateway(), jobId);
List<DeviceQrtzFileEntity> deviceQrtzFileEntities = deviceQrtzFileMapper.selectList(new LambdaQueryWrapper<DeviceQrtzFileEntity>().eq(DeviceQrtzFileEntity::getDeviceSn, request.getGateway()).eq(DeviceQrtzFileEntity::getStatus, DeviceQrtzConstants.QRTZ_FILE_STATUS_2).eq(DeviceQrtzFileEntity::getWaylineId, mediaFileCount.getFileId())); List<DeviceQrtzFileEntity> deviceQrtzFileEntities = deviceQrtzFileMapper.selectList(new LambdaQueryWrapper<DeviceQrtzFileEntity>().eq(DeviceQrtzFileEntity::getDeviceSn, request.getGateway()).eq(DeviceQrtzFileEntity::getStatus, DeviceQrtzConstants.QRTZ_FILE_STATUS_2).eq(DeviceQrtzFileEntity::getWaylineId, mediaFileCount.getFileId()));
// duplicate data // duplicate data
if (deviceOpt.isEmpty() if (deviceOpt.isEmpty()
|| (Objects.nonNull(mediaFileCount) && request.getBid().equals(mediaFileCount.getBid()) || (Objects.nonNull(mediaFileCount) && request.getBid().equals(mediaFileCount.getBid())

10
dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java

@ -72,14 +72,8 @@ public class RocketMqConsum implements RocketMQListener<MessageExt> {
Optional<WaylineJobDTO> waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId); Optional<WaylineJobDTO> waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId);
reqMap.put("jobId",waylineJobDTO.get().getJobId()); reqMap.put("jobId",waylineJobDTO.get().getJobId());
reqMap.put("jobName",waylineJobDTO.get().getJobName()); reqMap.put("jobName",waylineJobDTO.get().getJobName());
reqMap.put("deviceSn",videoId.getDroneSn());
playTextService.streamType(reqMap);
} }
liveStreamService.liveStop(videoId);
HttpResultResponse httpResultResponse = liveStreamService.liveStart(liveTypeDTO);
if (httpResultResponse.getCode() == 0 || httpResultResponse.getCode() == 513012 || httpResultResponse.getCode() == 513003){
reqMap.put("deviceSn:",videoId.getDroneSn());
// playTextService.streamType(reqMap);
}
deviceRedisService.setDeviceVideo(videoId.getDroneSn(),videoId);
} }
} }

7
dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java

@ -15,6 +15,7 @@ import org.dromara.common.sdk.common.PaginationData;
import org.dromara.sample.component.mqtt.model.EventsReceiver; import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.media.model.MediaFileDTO; import org.dromara.sample.media.model.MediaFileDTO;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO; import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import org.dromara.sample.wayline.model.enums.WaylineTaskStatusEnum;
import org.dromara.sample.wayline.model.param.CreateJobParam; import org.dromara.sample.wayline.model.param.CreateJobParam;
import org.dromara.sample.wayline.model.param.UpdateJobParam; import org.dromara.sample.wayline.model.param.UpdateJobParam;
import org.dromara.sample.wayline.service.IFlightTaskService; import org.dromara.sample.wayline.service.IFlightTaskService;
@ -120,6 +121,12 @@ public class WaylineJobController {
return HttpResultResponse.success(); return HttpResultResponse.success();
} }
public static void main(String[] args) {
WaylineTaskStatusEnum pause = WaylineTaskStatusEnum.RESUME;
System.out.println(pause.getVal());
}
@GetMapping("/{workspace_id}/getJobFileUrlByDeviceSn") @GetMapping("/{workspace_id}/getJobFileUrlByDeviceSn")
@Operation(summary = "根据设备查询飞行任务。", description = "根据设备查询飞行任务。") @Operation(summary = "根据设备查询飞行任务。", description = "根据设备查询飞行任务。")

Loading…
Cancel
Save