package com.dji.sample.manage.controller; import com.dji.sample.common.model.ResponseResult; import com.dji.sample.component.mqtt.model.ChannelName; import com.dji.sample.manage.model.dto.CapacityCameraDTO; import com.dji.sample.manage.model.dto.CapacityDeviceDTO; import com.dji.sample.manage.model.dto.LiveTypeDTO; import com.dji.sample.manage.model.receiver.LiveCapacityReceiver; import com.dji.sample.manage.service.ILiveStreamService; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.messaging.MessageHeaders; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.List; /** * @author sean.zhou * @version 0.1 * @date 2021/11/19 */ @RestController @Slf4j @RequestMapping("${url.manage.prefix}${url.manage.version}/live") public class LiveStreamController { @Autowired private ILiveStreamService liveStreamService; @Autowired private ObjectMapper mapper; /** * Analyze the live streaming capabilities of drones. * This data is necessary if drones are required for live streaming. * @param liveCapacity the capacity of drone and dock */ @ServiceActivator(inputChannel = ChannelName.INBOUND_STATE_CAPACITY) public void stateCapacity(LiveCapacityReceiver liveCapacity, MessageHeaders headers) { liveStreamService.saveLiveCapacity(liveCapacity, headers.getTimestamp()); } /** * 获取直播地址 * @param workspaceId 项目id * @param sn 设备号 * @return */ @GetMapping("/getLiveUrl/{workspace_id}") public ResponseResult getLiveUrl(@PathVariable("workspace_id") String workspaceId, String sn) { List liveCapacity = liveStreamService.getLiveCapacity(workspaceId,sn); if (null == liveCapacity || liveCapacity.isEmpty()) { return ResponseResult.error(-1,"暂无直播或者设备未开机"); } CapacityDeviceDTO deviceDTO = liveCapacity.get(0); if (null == deviceDTO.getCamerasList() || deviceDTO.getCamerasList().isEmpty()) { return ResponseResult.error(-1,"暂无直播地址"); } List camerasList = deviceDTO.getCamerasList(); if (null == camerasList || camerasList.isEmpty()) { return ResponseResult.error(-1,"获取相机信息失败"); } CapacityCameraDTO cameraDTO = camerasList.get(0); String videoIndex = cameraDTO.getVideosList().get(0).getIndex(); LiveTypeDTO liveParam = new LiveTypeDTO(); String videoId = deviceDTO.getSn() + "-" + cameraDTO.getIndex() + "-" + videoIndex; liveParam.setUrl("rtmp://www.ainfo.top:735/uav/" + videoId); liveParam.setUrlType(1); liveParam.setVideoId(deviceDTO.getSn() + "/" + cameraDTO.getIndex() + "/" + videoIndex); liveParam.setVideoQuality(0); return liveStreamService.liveStart(liveParam); } /** * Get live capability data of all drones in the current user's workspace from the database. * 从数据库中获取当前工作区中所有无人机的实时性能数据。 * @param workspaceId * @return live capability */ @GetMapping("/capacity/{workspace_id}") public ResponseResult> getLiveCapacity(@PathVariable("workspace_id") String workspaceId,String sn) { // Get information about the current user. 获取当前登录用户的信息 // CustomClaim customClaim = (CustomClaim)request.getAttribute(TOKEN_CLAIM); List liveCapacity = liveStreamService.getLiveCapacity(workspaceId,sn); return ResponseResult.success(liveCapacity); } /** * Live streaming according to the parameters passed in from the web side. * 根据从web端传入的参数进行直播。 * @param liveParam Live streaming parameters. * @return */ @PostMapping("/streams/start") public ResponseResult liveStart(@RequestBody LiveTypeDTO liveParam) { return liveStreamService.liveStart(liveParam); } @PostMapping("/streams/address") public ResponseResult liveAddress(@RequestParam String deviceSn,@RequestParam String deviceName) throws IOException { return liveStreamService.liveAddress(deviceSn,deviceName); } /** * Stop live streaming according to the parameters passed in from the web side. * 根据从web端传入的参数停止直播。 * @param liveParam Live streaming parameters. * @return */ @PostMapping("/streams/stop") public ResponseResult liveStop(@RequestBody LiveTypeDTO liveParam) { return liveStreamService.liveStop(liveParam.getVideoId()); } /** * 根据从web端传入的参数设置直播的质量。 * @param liveParam 直播参数 * @return */ @PostMapping("/streams/update") public ResponseResult liveSetQuality(@RequestBody LiveTypeDTO liveParam) { return liveStreamService.liveSetQuality(liveParam); } @PostMapping("/streams/switch") public ResponseResult liveLensChange(@RequestBody LiveTypeDTO liveParam) { return liveStreamService.liveLensChange(liveParam); } }