增加喊话功能

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) => {
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">
<div>
<n-radio
value="关"
value="关"
name="basic-demo"
@change="handleChange1"
:checked="checkedValue === '关'"
:checked="checkedValue === '关'"
>
</n-radio>
</div>
</n-grid-item>
<n-grid-item :span="3">
<div>
<n-radio
value="闪烁"
value="开启"
name="basic-demo"
@change="handleChange2"
:checked="checkedValue === '闪烁'"
:checked="checkedValue === '开启'"
>
闪烁
开启
</n-radio>
</div>
</n-grid-item>
<n-grid-item :span="3">
<div class="row-4-item">
<n-radio
value="运动时闪烁"
value="自动"
name="basic-demo"
@change="handleChange3"
:checked="checkedValue === '运动时闪烁'"
:checked="checkedValue === '自动'"
>
运动时闪烁
自动
</n-radio>
</div>
</n-grid-item>
@ -320,7 +320,18 @@
</n-grid-item>
<n-grid-item :span="3">
<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>
</n-grid-item>
</n-grid>
@ -386,6 +397,7 @@ import {
BatteryFullSharp,
BatteryChargingSharp,
} from '@vicons/ionicons5'
import { openDeviceMKApi, stopDeviceMKApi } from '@/utils/initLogin'
import { useMessage, useDialog, NRadio, NRadioGroup, NInputNumber, NSpace } from 'naive-ui'
import { debounce } from 'lodash'
@ -404,7 +416,7 @@ const isDragging = ref(false)
const currentTop = ref(0)
const startY = ref(0)
const startTop = ref(0)
const checkedValue = ref('')
const checkedValue = ref('关闭')
const selectValue = ref('')
const deviceToken = ref('')
const deviceInfo = ref({})
@ -603,16 +615,41 @@ onMounted(() => {
})
const handleChange1 = (e) => {
console.log(e)
checkedValue.value = e.target.value
handleChangeLight(checkedValue.value)
}
const handleChange2 = (e) => {
console.log(e)
checkedValue.value = e.target.value
handleChangeLight(checkedValue.value)
}
const handleChange3 = (e) => {
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) => {
checkedValue.value = e.target.value
}
@ -775,6 +812,55 @@ const handleChangeVolume = debounce(async (value) => {
}
}, 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 () => {
const token = await getRobotTokenFn() // token
const device = await getRobotDeviceListFn() //

View File

@ -185,36 +185,36 @@
<n-grid-item :span="3">
<div>
<n-radio
value="关"
value="关"
name="basic-demo"
@change="handleChange1"
:checked="checkedValue === '关'"
:checked="checkedValue === '关'"
>
</n-radio>
</div>
</n-grid-item>
<n-grid-item :span="3">
<div>
<n-radio
value="闪烁"
value="开启"
name="basic-demo"
@change="handleChange2"
:checked="checkedValue === '闪烁'"
:checked="checkedValue === '开启'"
>
闪烁
开启
</n-radio>
</div>
</n-grid-item>
<n-grid-item :span="3">
<div class="row-4-item">
<n-radio
value="运动时闪烁"
value="自动"
name="basic-demo"
@change="handleChange3"
:checked="checkedValue === '运动时闪烁'"
:checked="checkedValue === '自动'"
>
运动时闪烁
自动
</n-radio>
</div>
</n-grid-item>
@ -320,7 +320,15 @@
</n-grid-item>
<n-grid-item :span="3">
<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>
</n-grid-item>
</n-grid>
@ -386,6 +394,7 @@ import {
BatteryFullSharp,
BatteryChargingSharp,
} from '@vicons/ionicons5'
import { openDeviceMKApi, stopDeviceMKApi } from '@/utils/initLogin'
import { useMessage, useDialog, NRadio, NRadioGroup, NInputNumber, NSpace } from 'naive-ui'
import { debounce } from 'lodash'
@ -404,7 +413,7 @@ const isDragging = ref(false)
const currentTop = ref(0)
const startY = ref(0)
const startTop = ref(0)
const checkedValue = ref('')
const checkedValue = ref('关闭')
const selectValue = ref('')
const deviceToken = ref('')
const deviceInfo = ref({})
@ -627,15 +636,39 @@ onMounted(() => {
})
const handleChange1 = (e) => {
console.log(e)
checkedValue.value = e.target.value
handleChangeLight(checkedValue.value)
}
const handleChange2 = (e) => {
console.log(e)
checkedValue.value = e.target.value
handleChangeLight(checkedValue.value)
}
const handleChange3 = (e) => {
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) => {
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 isInspection = await handleInspection()