| | |
| | | </DockControlPanel> |
| | | </div> |
| | | </div> |
| | | <a-row class="p5" v-if="showMonitor"> |
| | | <a-row class="p5" v-if="showMonitor" justify="center" align="middle"> |
| | | <!-- <a-spin :spinning="spinning"> --> |
| | | <Jessibuca v-if="airPortUrl" :videoUrl="airPortUrl" width="100%" height="300px" /> |
| | | <!-- </a-spin> --> |
| | |
| | | {{ !deviceInfo.device ? EModeText[EModeCode.Disconnected] : EModeText[deviceInfo.device?.mode_code] |
| | | }}</a-col> |
| | | <a-col span="15"> |
| | | <a-select :showArrow="false" :bordered="false" :placeholder="EModeCode.Disconnected==14?'N/A':'请选择'" :disabled="EModeCode.Disconnected==14?true:false" size="small" style="width:100%;background-color: #5d5f61;color: #fff;"></a-select> |
| | | <a-select :showArrow="false" v-model:value="aircraSelected" :bordered="false" :options="aircraftList" :placeholder="aircraftList.length==0?'N/A':'请选择'" :disabled="aircraftList.length==0?true:false" size="small" style="width:100%;background-color: #5d5f61;color: #fff;" @change="selectChange"></a-select> |
| | | </a-col> |
| | | </a-row> |
| | | <a-row align="middle" justify="center"> |
| | | <a-col span="24"> <div style="color:#494949;" class="flex-display flex-justify-center mt5 mb5">当前设备已关机,无法进行直播</div> </a-col> |
| | | <a-col span="24"> <div v-if="deviceInfo.device?.mode_code == 14 || !deviceInfo.device" style="color:#494949;" class="flex-display flex-justify-center mt5 mb5">当前设备已关机,无法进行直播</div> </a-col> |
| | | </a-row> |
| | | <a-row align="middle" justify="center"> |
| | | <a-col span="24"> |
| | | <a-button :class="[showFly?'active-color':'unactive-color']" class="width-100" type="primary" size="small"> |
| | | <a-button :disabled="deviceInfo.device?.mode_code == 14 || !deviceInfo.device?true:false" :class="[showAircraft?'active-color':'unactive-color']" class="width-100" type="primary" size="small" @click="openAircra"> |
| | | 飞行控制 |
| | | </a-button> |
| | | </a-col> |
| | | </a-row> |
| | | </div> |
| | | </div> |
| | | <!-- 飞机直播 --> |
| | | <a-row class="p5" v-if="showAircraft"> |
| | | <!-- <a-spin :spinning="spinning"> --> |
| | | <Jessibuca v-if="aircraftUrl" :videoUrl="aircraftUrl" width="100%" height="300px" /> |
| | | <!-- </a-spin> --> |
| | | </a-row> |
| | | <!-- 飞机图标信息 --> |
| | | <div class="osd-info flex-1"> |
| | | <!-- <a-row align="middle"> |
| | |
| | | </a-row> |
| | | </div> |
| | | <!-- 飞行控制 --> |
| | | <div class="fly-control flex-display"> |
| | | <!-- <div class="fly-control flex-display"> |
| | | <div class="flex-column flex-align-stretch flex-justify-center" style="width: 100px; background: #2d2d2d;"> |
| | | <div style="cursor: pointer;" class="p10 flex-column flex-align-center flex-justify-center"> |
| | | <span><a-image :src="M30" :preview="false" /></span> |
| | | <span>一键起飞</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> --> |
| | | <div class="battery-slide" v-if="deviceInfo.device && deviceInfo.device.battery.remain_flight_time !== 0" |
| | | style="border: 1px solid red"> |
| | | <div style="background: #535759;" class="width-100"></div> |
| | |
| | | generatePointContent, |
| | | generatePolyContent |
| | | } from '../utils/map-layer-utils' |
| | | import { message } from 'ant-design-vue' |
| | | import { postElementsReq } from '/@/api/layer' |
| | | import { MapDoodleType, MapElementEnum } from '/@/constants/map' |
| | | import { useGMapManage } from '/@/hooks/use-g-map' |
| | |
| | | const videoList = ref() |
| | | const videoIndex = ref(0) |
| | | // 机场加载值 |
| | | // const spinning = ref(false) |
| | | |
| | | // 飞机视频播放地址 |
| | | const aircraftUrl = ref('') |
| | | const showAircraft = ref(false) |
| | | // 飞机视频列表 |
| | | const aircraftList = ref([]) |
| | | const aircraSelected = ref('') |
| | | const state = reactive({ |
| | | currentType: '', |
| | | coverIndex: 0 |
| | |
| | | onClose() |
| | | } |
| | | } |
| | | // 打开飞机监控 |
| | | const openAircra = () => { |
| | | showAircraft.value = !showAircraft.value |
| | | if (showAircraft.value) { |
| | | loadDroneVideo() |
| | | } else { |
| | | closeFly() |
| | | } |
| | | } |
| | | // 加载该设备的视频信息 |
| | | const loadVideo = async () => { |
| | | droneList.value = [] |
| | |
| | | resData.forEach((ele: any) => { |
| | | temp.push({ label: ele.name, value: ele.sn, more: ele.cameras_list }) |
| | | }) |
| | | // 设备列表 |
| | | droneList.value = temp.filter(v => v.value === sn.value) |
| | | if (droneList.value[0].more.length <= 0) return |
| | | cameraList.value = droneList.value[droneIndex.value].more.map((v: { name: any; index: any; videos_list: any }) => { |
| | | return { |
| | | label: v.name, |
| | | value: v.index, |
| | | more: v.videos_list |
| | | } |
| | | }) |
| | | videoList.value = cameraList.value[cameraIndex.value].more.map((v) => { |
| | | return { |
| | | label: v.type, |
| | | value: v.index, |
| | | } |
| | | }) |
| | | onStart() |
| | | // 设备直播处理 |
| | | if (droneList.value[0].more && droneList.value[0].more.length > 0) { |
| | | cameraList.value = droneList.value[droneIndex.value].more.map((v: { name: any; index: any; videos_list: any }) => { |
| | | return { |
| | | label: v.name, |
| | | value: v.index, |
| | | more: v.videos_list |
| | | } |
| | | }) |
| | | videoList.value = cameraList.value[cameraIndex.value].more.map((v) => { |
| | | return { |
| | | label: v.type, |
| | | value: v.index, |
| | | } |
| | | }) |
| | | onStart() |
| | | } else { |
| | | showMonitor.value = false |
| | | message.error('该设备暂无直播设备开启') |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | // message.error(error) |
| | | console.error(error) |
| | | message.error(error) |
| | | }) |
| | | } |
| | | // 加载无人机的视频信息 |
| | | const loadDroneVideo = async () => { |
| | | aircraftList.value = [] |
| | | await getLiveCapacity({}) |
| | | .then(res => { |
| | | if (res.code === 0) { |
| | | if (res.data === null) { |
| | | console.warn('warning: get live capacity is null!!!') |
| | | return |
| | | } |
| | | const resData: Array<[]> = res.data |
| | | const temp: Array<SelectOption> = [] |
| | | if (resData) { |
| | | resData.forEach((ele: any) => { |
| | | temp.push({ label: ele.name, value: ele.sn, more: ele.cameras_list }) |
| | | }) |
| | | // 无人机列表 |
| | | const airList = temp.filter(v => v.value === deviceInfo.dock.basic_osd?.sub_device?.device_sn) |
| | | // 无人机设备处理 |
| | | if (airList[0].more && airList[0].more.length > 0) { |
| | | aircraftList.value = airList[0].more.map(v => { |
| | | return { |
| | | label: v.name, |
| | | value: v.index, |
| | | vadeosList: v.videos_list |
| | | } |
| | | }) |
| | | aircraSelected.value = aircraftList.value[0].value |
| | | console.log(aircraftList.value, 'aircraftList.value') |
| | | flyOnStart() |
| | | } else { |
| | | showAircraft.value = false |
| | | message.error('该无人机暂无直播设备开启') |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | message.error(error) |
| | | }) |
| | | } |
| | | // 设备开始播放 |
| | |
| | | }) |
| | | .then(res => { |
| | | if (res.code !== 0) return |
| | | console.log(res, 'res') |
| | | airPortUrl.value = res.data.url |
| | | console.log(airPortUrl.value, 'airPortUrl') |
| | | }) |
| | | } |
| | | // 下拉框选择变化 |
| | | const selectChange = async (e) => { |
| | | await closeFly() |
| | | setTimeout(async () => { |
| | | await flyOnStart() |
| | | }, 500) |
| | | } |
| | | // 关闭设备直播 |
| | | const onClose = async () => { |
| | |
| | | video_id: videoId |
| | | }).then(res => { |
| | | if (res.code === 0) { |
| | | console.log('stop play livestream') |
| | | airPortUrl.value = '' |
| | | } |
| | | }) |
| | | } |
| | | // 飞机设备播放 |
| | | const flyOnStart = async () => { |
| | | const videoId = deviceInfo.dock.basic_osd?.sub_device?.device_sn + '/' + aircraSelected.value + '/' + 'normal-0' |
| | | const streamId = deviceInfo.dock.basic_osd?.sub_device?.device_sn + '-' + aircraSelected.value + '-' + 'normal-0' |
| | | const liveURL = config.rtmpURL + streamId |
| | | await startLivestream({ |
| | | url: liveURL, |
| | | video_id: videoId, |
| | | url_type: 1, |
| | | video_quality: 0 |
| | | }) |
| | | .then(res => { |
| | | if (res.code !== 0) return |
| | | aircraftUrl.value = res.data.url |
| | | }) |
| | | } |
| | | // 飞行设备关闭 |
| | | const closeFly = async () => { |
| | | const videoId = deviceInfo.dock.basic_osd?.sub_device?.device_sn + '/' + aircraSelected.value + '/' + 'normal-0' |
| | | aircraftList.value = [] |
| | | aircraSelected.value = '' |
| | | stopLivestream({ |
| | | video_id: videoId |
| | | }).then(res => { |
| | | if (res.code === 0) { |
| | | aircraftUrl.value = '' |
| | | } |
| | | }) |
| | | } |
| | |
| | | showFly, |
| | | airPortUrl, |
| | | openMonitor, |
| | | droneIndex, |
| | | openAircra, |
| | | showAircraft, |
| | | aircraftUrl, |
| | | aircraftList, |
| | | aircraSelected, |
| | | selectChange |
| | | } |
| | | } |
| | | }) |