<template>
|
<WebViewPlus :src="`${viewUrl}`" @webMessage="onPostMessage"/>
|
<up-toast ref="uNotifyRef"></up-toast>
|
</template>
|
<script setup>
|
import {onHide, onLoad, onShow} from "@dcloudio/uni-app";
|
import WebViewPlus from "@/components/WebViewPlus.vue";
|
import {getEnvObj, getWebViewUrl} from "@/utils/index.js";
|
import Recorder from "js-audio-recorder";
|
import dayjs from "dayjs";
|
import {useUserStore} from "@/store/index.js";
|
|
const wayLineJodInfoId = ref(null)
|
const startState = ref('0')
|
let recorder
|
const soundVideoName = ref('') // 喊话名称
|
soundVideoName.value = `${dayjs().format('YYYYMMDDHHmmss')}实时喊话`
|
const droneHornState = ref('0')
|
const updateKey = ref(0)
|
const uNotifyRef = ref(null)
|
|
const viewUrl = computed(() => {
|
return getWebViewUrl('/DroneConsole', {
|
wayLineJodInfoId: wayLineJodInfoId.value,
|
startState: startState.value,
|
droneHornState: droneHornState.value,
|
updateKey: updateKey.value
|
})
|
})
|
|
function onPostMessage(data) {
|
if (data.type === 'record') {
|
startState.value = '1'
|
recorder = new Recorder({
|
sampleBits: 16, // 采样位数,支持8或16,默认16
|
sampleRate: 16000, // 采样率,支持11025、16000、22050、24000、44100、48000
|
numChannels: 1, // 声道,支持1或2,默认1
|
})
|
nextTick(() => {
|
recorder.start().then(() => {
|
recorder.onprocess = duration => {
|
}
|
})
|
})
|
} else if (data.type === 'stopRecord') {
|
startState.value = '2'
|
recorder.stop()
|
} else if (data.type === 'trialListening') {
|
recorder.play()
|
} else if (data.type === 'resetRecording') {
|
startState.value = '0'
|
droneHornState.value = '0'
|
recorder?.destroy().then(() => {
|
recorder = null // 释放资源
|
})
|
} else if (data.type === 'pushToDrone') {
|
pushToDrone(data)
|
} else if (data.type === 'saveSound') {
|
saveSound(data)
|
}
|
}
|
|
const {VITE_API_BASE_URL} = getEnvObj()
|
|
function uploadUtil(options) {
|
const {formData, file, url} = options
|
return new Promise((resolve, reject) => {
|
let accessToken = useUserStore()?.$state?.userInfo?.access_token;
|
const file = new File([recorder.getWAVBlob()], '.wav')
|
uni.uploadFile({
|
url: `${VITE_API_BASE_URL}${url}`,
|
name: 'file',
|
header: {'Blade-Auth': 'bearer ' + accessToken},
|
file,
|
formData,
|
success: (res) => {
|
const resData = JSON.parse(res.data)
|
if (resData.code === 200 || resData.code === 0) {
|
resolve(res)
|
} else {
|
showToast(resData.message)
|
reject(res)
|
}
|
},
|
fail: (err) => {
|
reject(err)
|
}
|
});
|
})
|
}
|
|
function showToast(message) {
|
uNotifyRef.value.show({
|
type: 'default',
|
message,
|
});
|
}
|
|
|
// 保存喊话至广播列表内
|
function saveSound(data) {
|
const file = new File([recorder.getWAVBlob()], '.wav')
|
uploadUtil({
|
file,
|
formData: {
|
fileName: data.soundName,
|
sn: data.dockSn
|
},
|
url: '/drone-device-core/speak/api/v1/uploadSpeak'
|
}).then(res => {
|
showToast('保存成功')
|
})
|
}
|
|
// 无人机开始喊话
|
function pushToDrone(data) {
|
const wavBlob = recorder.getWAVBlob()
|
const file = new File([wavBlob], new Date().getTime() + '.wav')
|
uploadUtil({
|
file,
|
formData: {
|
name: data.soundName,
|
sn: data.dockSn,
|
psdk_index: 2,
|
volumn: 100,
|
},
|
url: '/drone-device-core/speak/api/v1/startVoice'
|
}).then(res => {
|
droneHornState.value = '1'
|
showToast('播放成功')
|
}).catch(() => {
|
droneHornState.value = '0'
|
}).finally(() => {
|
updateKey.value += 1
|
})
|
}
|
|
onLoad((options) => {
|
wayLineJodInfoId.value = options.wayLineJodInfoId
|
})
|
|
|
// onShow(() => {
|
// // #ifdef APP-PLUS
|
// plus.screen.lockOrientation("landscape-primary");
|
// // #endif
|
// });
|
//
|
// onHide(() => {
|
// // #ifdef APP-PLUS
|
// plus.screen.lockOrientation("portrait-primary");
|
// // #endif
|
// });
|
</script>
|
<style scoped lang="scss">
|
|
</style>
|