增加喊话功能

This commit is contained in:
BianLzhaoMin 2025-08-12 11:18:05 +08:00
parent bc65a8ceae
commit 86a82f12d4
3 changed files with 202 additions and 26 deletions

View File

@ -39,3 +39,11 @@ export const stopDeviceCameraZoomApi = (data) => {
export const stopDeviceCameraApi = (data) => { export const stopDeviceCameraApi = (data) => {
return service.post('/ptz/stop/turn', data) return service.post('/ptz/stop/turn', data)
} }
// 开启喊话
export const openDeviceMKApi = (data) => {
return service.post('/icvs/audio/startCall?token=' + data.token, data)
}
// 关闭喊话
export const stopDeviceMKApi = (data) => {
return service.post('/icvs/audio/stopTalk?token=' + data.token, data)
}

View File

@ -185,36 +185,36 @@
<n-grid-item :span="3"> <n-grid-item :span="3">
<div> <div>
<n-radio <n-radio
value="关" value="关"
name="basic-demo" name="basic-demo"
@change="handleChange1" @change="handleChange1"
:checked="checkedValue === '关'" :checked="checkedValue === '关'"
> >
</n-radio> </n-radio>
</div> </div>
</n-grid-item> </n-grid-item>
<n-grid-item :span="3"> <n-grid-item :span="3">
<div> <div>
<n-radio <n-radio
value="闪烁" value="开启"
name="basic-demo" name="basic-demo"
@change="handleChange2" @change="handleChange2"
:checked="checkedValue === '闪烁'" :checked="checkedValue === '开启'"
> >
闪烁 开启
</n-radio> </n-radio>
</div> </div>
</n-grid-item> </n-grid-item>
<n-grid-item :span="3"> <n-grid-item :span="3">
<div class="row-4-item"> <div class="row-4-item">
<n-radio <n-radio
value="运动时闪烁" value="自动"
name="basic-demo" name="basic-demo"
@change="handleChange3" @change="handleChange3"
:checked="checkedValue === '运动时闪烁'" :checked="checkedValue === '自动'"
> >
运动时闪烁 自动
</n-radio> </n-radio>
</div> </div>
</n-grid-item> </n-grid-item>
@ -320,7 +320,18 @@
</n-grid-item> </n-grid-item>
<n-grid-item :span="3"> <n-grid-item :span="3">
<div class="row-6-item-1"> <div class="row-6-item-1">
<img src="@/assets/home-imgs/control-3-mk.png" alt="" /> <!-- 开启麦克风 -->
<img
alt=""
v-if="!isOpenMK"
@click="onHandleOpenOrCloseMK(1)"
src="@/assets/home-imgs/control-3-mk.png"
/>
<!-- 关闭麦克风 -->
<span v-else style="cursor: pointer" @click="onHandleOpenOrCloseMK(2)"
>结束喊话</span
>
</div> </div>
</n-grid-item> </n-grid-item>
</n-grid> </n-grid>
@ -386,6 +397,7 @@ import {
BatteryFullSharp, BatteryFullSharp,
BatteryChargingSharp, BatteryChargingSharp,
} from '@vicons/ionicons5' } from '@vicons/ionicons5'
import { openDeviceMKApi, stopDeviceMKApi } from '@/utils/initLogin'
import { useMessage, useDialog, NRadio, NRadioGroup, NInputNumber, NSpace } from 'naive-ui' import { useMessage, useDialog, NRadio, NRadioGroup, NInputNumber, NSpace } from 'naive-ui'
import { debounce } from 'lodash' import { debounce } from 'lodash'
@ -404,7 +416,7 @@ const isDragging = ref(false)
const currentTop = ref(0) const currentTop = ref(0)
const startY = ref(0) const startY = ref(0)
const startTop = ref(0) const startTop = ref(0)
const checkedValue = ref('') const checkedValue = ref('关闭')
const selectValue = ref('') const selectValue = ref('')
const deviceToken = ref('') const deviceToken = ref('')
const deviceInfo = ref({}) const deviceInfo = ref({})
@ -603,16 +615,41 @@ onMounted(() => {
}) })
const handleChange1 = (e) => { const handleChange1 = (e) => {
console.log(e)
checkedValue.value = e.target.value checkedValue.value = e.target.value
handleChangeLight(checkedValue.value)
} }
const handleChange2 = (e) => { const handleChange2 = (e) => {
console.log(e)
checkedValue.value = e.target.value checkedValue.value = e.target.value
handleChangeLight(checkedValue.value)
} }
const handleChange3 = (e) => { const handleChange3 = (e) => {
checkedValue.value = e.target.value checkedValue.value = e.target.value
handleChangeLight(checkedValue.value)
} }
//
const handleChangeLight = async (value) => {
const lightMap = {
关闭: 'OFF',
开启: 'ON',
自动: 'AUTO',
}
const { data: res } = await handleRobotActionApi({
puId: robotData.robotInfo?.puId,
type: '19',
value: lightMap[value],
})
if (res.code == 200) {
message.success('操作成功')
} else {
message.error('操作失败')
checkedValue.value = '关闭'
}
}
const handleChange4 = (e) => { const handleChange4 = (e) => {
checkedValue.value = e.target.value checkedValue.value = e.target.value
} }
@ -775,6 +812,55 @@ const handleChangeVolume = debounce(async (value) => {
} }
}, 1000) }, 1000)
const isOpenMK = ref(false)
const onHandleOpenOrCloseMK = async (type) => {
if (type === 1) {
// MK
try {
//
const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
//
const audioTracks = stream.getAudioTracks()
if (audioTracks.length > 0) {
audioTracks.forEach((track) => track.stop())
//
const { data: res } = await openDeviceMKApi({
token: deviceToken.value,
puId: robotData.robotInfo?.puId,
idx: 0,
})
if (res.code == 200) {
message.success('麦克风开启成功')
isOpenMK.value = true
} else {
message.error('麦克风开启失败')
}
} else {
message.error('未检测到音频输入设备')
}
} catch (error) {
message.error('麦克风访问被拒绝或不可用,请检查麦克风权限')
}
} else {
//
const { data: res } = await stopDeviceMKApi({
token: deviceToken.value,
puid: deviceInfo.value?.puId,
idx: 0,
})
if (res.code == 200) {
message.success('麦克风已关闭')
isOpenMK.value = false
} else {
message.error('麦克风关闭失败')
}
}
}
onMounted(async () => { onMounted(async () => {
const token = await getRobotTokenFn() // token const token = await getRobotTokenFn() // token
const device = await getRobotDeviceListFn() // const device = await getRobotDeviceListFn() //

View File

@ -185,36 +185,36 @@
<n-grid-item :span="3"> <n-grid-item :span="3">
<div> <div>
<n-radio <n-radio
value="关" value="关"
name="basic-demo" name="basic-demo"
@change="handleChange1" @change="handleChange1"
:checked="checkedValue === '关'" :checked="checkedValue === '关'"
> >
</n-radio> </n-radio>
</div> </div>
</n-grid-item> </n-grid-item>
<n-grid-item :span="3"> <n-grid-item :span="3">
<div> <div>
<n-radio <n-radio
value="闪烁" value="开启"
name="basic-demo" name="basic-demo"
@change="handleChange2" @change="handleChange2"
:checked="checkedValue === '闪烁'" :checked="checkedValue === '开启'"
> >
闪烁 开启
</n-radio> </n-radio>
</div> </div>
</n-grid-item> </n-grid-item>
<n-grid-item :span="3"> <n-grid-item :span="3">
<div class="row-4-item"> <div class="row-4-item">
<n-radio <n-radio
value="运动时闪烁" value="自动"
name="basic-demo" name="basic-demo"
@change="handleChange3" @change="handleChange3"
:checked="checkedValue === '运动时闪烁'" :checked="checkedValue === '自动'"
> >
运动时闪烁 自动
</n-radio> </n-radio>
</div> </div>
</n-grid-item> </n-grid-item>
@ -320,7 +320,15 @@
</n-grid-item> </n-grid-item>
<n-grid-item :span="3"> <n-grid-item :span="3">
<div class="row-6-item-1"> <div class="row-6-item-1">
<img src="@/assets/home-imgs/control-3-mk.png" alt="" /> <img
alt=""
v-if="!isOpenMK"
@click="onHandleOpenOrCloseMK(1)"
src="@/assets/home-imgs/control-3-mk.png"
/>
<span v-else style="cursor: pointer" @click="onHandleOpenOrCloseMK(2)">
结束喊话
</span>
</div> </div>
</n-grid-item> </n-grid-item>
</n-grid> </n-grid>
@ -386,6 +394,7 @@ import {
BatteryFullSharp, BatteryFullSharp,
BatteryChargingSharp, BatteryChargingSharp,
} from '@vicons/ionicons5' } from '@vicons/ionicons5'
import { openDeviceMKApi, stopDeviceMKApi } from '@/utils/initLogin'
import { useMessage, useDialog, NRadio, NRadioGroup, NInputNumber, NSpace } from 'naive-ui' import { useMessage, useDialog, NRadio, NRadioGroup, NInputNumber, NSpace } from 'naive-ui'
import { debounce } from 'lodash' import { debounce } from 'lodash'
@ -404,7 +413,7 @@ const isDragging = ref(false)
const currentTop = ref(0) const currentTop = ref(0)
const startY = ref(0) const startY = ref(0)
const startTop = ref(0) const startTop = ref(0)
const checkedValue = ref('') const checkedValue = ref('关闭')
const selectValue = ref('') const selectValue = ref('')
const deviceToken = ref('') const deviceToken = ref('')
const deviceInfo = ref({}) const deviceInfo = ref({})
@ -627,15 +636,39 @@ onMounted(() => {
}) })
const handleChange1 = (e) => { const handleChange1 = (e) => {
console.log(e)
checkedValue.value = e.target.value checkedValue.value = e.target.value
handleChangeLight(checkedValue.value)
} }
const handleChange2 = (e) => { const handleChange2 = (e) => {
console.log(e)
checkedValue.value = e.target.value checkedValue.value = e.target.value
handleChangeLight(checkedValue.value)
} }
const handleChange3 = (e) => { const handleChange3 = (e) => {
checkedValue.value = e.target.value checkedValue.value = e.target.value
handleChangeLight(checkedValue.value)
}
//
const handleChangeLight = async (value) => {
const lightMap = {
关闭: 'OFF',
开启: 'ON',
自动: 'AUTO',
}
const { data: res } = await handleRobotActionApi({
puId: robotData.robotInfo?.puId,
type: '19',
value: lightMap[value],
})
if (res.code == 200) {
message.success('操作成功')
} else {
message.error('操作失败')
checkedValue.value = '关闭'
}
} }
const handleChange4 = (e) => { const handleChange4 = (e) => {
checkedValue.value = e.target.value checkedValue.value = e.target.value
@ -711,6 +744,55 @@ const handleChangeZoomCamera = async (motion) => {
} }
} }
const isOpenMK = ref(false)
const onHandleOpenOrCloseMK = async (type) => {
if (type === 1) {
// MK
try {
//
const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
//
const audioTracks = stream.getAudioTracks()
if (audioTracks.length > 0) {
audioTracks.forEach((track) => track.stop())
//
const { data: res } = await openDeviceMKApi({
token: deviceToken.value,
puId: robotData.robotInfo?.puId,
idx: 0,
})
if (res.code == 200) {
message.success('麦克风开启成功')
isOpenMK.value = true
} else {
message.error('麦克风开启失败')
}
} else {
message.error('未检测到音频输入设备')
}
} catch (error) {
message.error('麦克风访问被拒绝或不可用,请检查麦克风权限')
}
} else {
//
const { data: res } = await stopDeviceMKApi({
token: deviceToken.value,
puid: deviceInfo.value?.puId,
idx: 0,
})
if (res.code == 200) {
message.success('麦克风已关闭')
isOpenMK.value = false
} else {
message.error('麦克风关闭失败')
}
}
}
// //
const handleChangeRobot = debounce(async (type) => { const handleChangeRobot = debounce(async (type) => {
const isInspection = await handleInspection() const isInspection = await handleInspection()