摄像头-预览-调整按钮样式

This commit is contained in:
1378012178@qq.com 2025-10-29 13:55:40 +08:00
parent 82ad11d3c4
commit 8ee2cf6d3d
2 changed files with 946 additions and 872 deletions

View File

@ -6,25 +6,25 @@
<div id="videview" style="height:0px;"></div> <div id="videview" style="height:0px;"></div>
</a-col> </a-col>
<!-- <a-col :span="24" style="margin-top: -120px;margin-left:40px;" v-show="formData.ptz == '1'"> --> <!-- <a-col :span="24" style="margin-top: -120px;margin-left:40px;" v-show="formData.ptz == '1'"> -->
<a-col :span="24" style="margin-top: -120px " > <a-col :span="24" style="margin-top: -120px ">
<table style="width: 130px;height:96px;margin: 5px 0px 5px 0px;"> <table style="width: 130px;height:96px;margin: 5px 0px 5px 0px;">
<tbody> <tbody>
<tr> <tr>
<td></td> <td></td>
<td style="width:100px;text-align:center;"> <td style="width:100px;text-align:center;">
<div class="fxjImgUp" @mousedown="moveCtrl(1,1,1)" @mouseup="moveCtrl(1,0,1)"></div> <div class="fxjImgUp" @mousedown="moveCtrl(1, 1, 1)" @mouseup="moveCtrl(1, 0, 1)"></div>
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td style="width:90px;text-align:center;"> <td style="width:90px;text-align:center;">
<div class="fxjImgLeft" @mousedown="moveCtrl(3,1,1)" @mouseup="moveCtrl(3,0,1)"></div> <div class="fxjImgLeft" @mousedown="moveCtrl(3, 1, 1)" @mouseup="moveCtrl(3, 0, 1)"></div>
</td> </td>
<td style="width:100px;text-align:center;"> <td style="width:100px;text-align:center;">
<div class="fxjImgDown" @mousedown="moveCtrl(7,1,1)" @mouseup="moveCtrl(7,0,1)"></div> <div class="fxjImgDown" @mousedown="moveCtrl(7, 1, 1)" @mouseup="moveCtrl(7, 0, 1)"></div>
</td> </td>
<td style="width:100px;text-align:center;"> <td style="width:100px;text-align:center;">
<div class="fxjImgRight" @mousedown="moveCtrl(5,1,1)" @mouseup="moveCtrl(5,0,1)"></div> <div class="fxjImgRight" @mousedown="moveCtrl(5, 1, 1)" @mouseup="moveCtrl(5, 0, 1)"></div>
</td> </td>
</tr> </tr>
</tbody> </tbody>
@ -50,9 +50,9 @@
<div class="selectDiv" @click="setFishEyeDisplayMode('FISHEYE_LONGITUDE')">全景拉伸</div> <div class="selectDiv" @click="setFishEyeDisplayMode('FISHEYE_LONGITUDE')">全景拉伸</div>
</div> </div>
</template> </template>
<span class="buttonSpan fpImg"><span style="margin-left:30px;">分屏</span></span> <span class="buttonSpan fpImg"><span style="margin-left:30px;">分屏</span></span>
</a-popover> </a-popover>
<a-popover> <a-popover>
<template #content> <template #content>
<div style="text-align: center;"> <div style="text-align: center;">
<div class="selectDiv" @click="changeSwitch('flip_type','off')">关闭</div> <div class="selectDiv" @click="changeSwitch('flip_type','off')">关闭</div>
@ -62,8 +62,8 @@
</div> </div>
</template> </template>
<span class="buttonSpan hmxzImg"><span style="margin-left:30px;">画面旋转</span></span> <span class="buttonSpan hmxzImg"><span style="margin-left:30px;">画面旋转</span></span>
</a-popover> </a-popover>
</a-col> --> </a-col> -->
<!-- <a-popover title="变焦"> <!-- <a-popover title="变焦">
<template #content> <template #content>
<div style="line-height: 50px;"> <div style="line-height: 50px;">
@ -160,37 +160,37 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue'; import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
import { defHttp } from '/@/utils/http/axios'; import { defHttp } from '/@/utils/http/axios';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { getValueType } from '/@/utils'; import { getValueType } from '/@/utils';
import { Form } from 'ant-design-vue'; import { Form } from 'ant-design-vue';
import { import {
getImageCommon, getImageCommon,
getMultitransUrl, getMultitransUrl,
getPreviewUrl, getPreviewUrl,
setImageCommon, setImageCommon,
testAudio, testAudio,
motionCtrl motionCtrl
} from "../camera.api"; } from "../camera.api";
const props = defineProps({ const props = defineProps({
formDisabled: { type: Boolean, default: false }, formDisabled: { type: Boolean, default: false },
formData: { type: Object, default: () => ({})}, formData: { type: Object, default: () => ({}) },
formBpm: { type: Boolean, default: true } formBpm: { type: Boolean, default: true }
}); });
const formRef = ref(); const formRef = ref();
const player = ref(); const player = ref();
const resolution = ref<string>('流畅'); const resolution = ref<string>('流畅');
const izPlaying = ref<boolean>(true); const izPlaying = ref<boolean>(true);
const izRecording = ref<boolean>(false); const izRecording = ref<boolean>(false);
const izPhone = ref<boolean>(false); const izPhone = ref<boolean>(false);
const fishEyeDisplayMode = ref<string>('ORIGIN'); const fishEyeDisplayMode = ref<string>('ORIGIN');
const flipType = ref<string>('off'); const flipType = ref<string>('off');
const useForm = Form.useForm; const useForm = Form.useForm;
const emit = defineEmits(['register', 'ok']); const emit = defineEmits(['register', 'ok']);
const formData = reactive<Record<string, any>>({ const formData = reactive<Record<string, any>>({
// //
deviceIndex: '',// deviceIndex: '',//
@ -204,42 +204,42 @@
flip_type: '',// "off"// "left_and_right"// "up_and_down"// "center"// flip_type: '',// "off"// "left_and_right"// "up_and_down"// "center"//
zoom: 1, // zoom: 1, //
sliderValue : 1,// sliderValue: 1,//
ptz : 0,// ptz: 0,//
smartCode : 0,// smartCode: 0,//
}); });
const { createMessage } = useMessage(); const { createMessage } = useMessage();
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } }); const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } }); const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
const confirmLoading = ref<boolean>(false); const confirmLoading = ref<boolean>(false);
// //
const validatorRules = reactive({ const validatorRules = reactive({
}); });
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false }); const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
// //
const disabled = computed(()=>{ const disabled = computed(() => {
if(props.formBpm === true){ if (props.formBpm === true) {
if(props.formData.disabled === false){ if (props.formData.disabled === false) {
return false; return false;
}else{ } else {
return true; return true;
} }
} }
return props.formDisabled; return props.formDisabled;
}); });
/** /**
* 详情 * 详情
*/ */
async function edit(record) { async function edit(record) {
await nextTick(() => { await nextTick(() => {
confirmLoading.value=true; confirmLoading.value = true;
resetFields(); resetFields();
const tmpData = {}; const tmpData = {};
Object.keys(formData).forEach((key) => { Object.keys(formData).forEach((key) => {
if(record.hasOwnProperty(key)){ if (record.hasOwnProperty(key)) {
tmpData[key] = record[key] tmpData[key] = record[key]
} }
}) })
@ -248,20 +248,20 @@
}); });
createPreview(); createPreview();
getSwitch(); getSwitch();
} }
/** /**
* 创建预览 * 创建预览
*/ */
async function createPreview(){ async function createPreview() {
await getPreviewUrl({"deviceIndex":formData.deviceIndex,"streamType":formData.streamType}).then(res=>{ await getPreviewUrl({ "deviceIndex": formData.deviceIndex, "streamType": formData.streamType }).then(res => {
formData.url = res.url; formData.url = res.url;
formData.backupUrl = res.backupUrl; formData.backupUrl = res.backupUrl;
formData.wsUrl = res.wsUrl; formData.wsUrl = res.wsUrl;
formData.wssUrl = res.wssUrl; formData.wssUrl = res.wssUrl;
confirmLoading.value=false; confirmLoading.value = false;
}); });
if (player.value){ if (player.value) {
player.value.destroy().then(() => { player.value.destroy().then(() => {
}); // }); //
player.value = null; player.value = null;
@ -286,129 +286,129 @@
} }
izPlaying.value = true; izPlaying.value = true;
} }
} }
/** /**
* 切换超清/流程 * 切换超清/流程
*/ */
function switchResolution(){ function switchResolution() {
if(formData.streamType == 0){ if (formData.streamType == 0) {
resolution.value = '流畅'; resolution.value = '流畅';
formData.streamType = 1; formData.streamType = 1;
}else{ } else {
resolution.value = '超清'; resolution.value = '超清';
formData.streamType = 0; formData.streamType = 0;
} }
createMessage.info('正在切换至'+resolution.value); createMessage.info('正在切换至' + resolution.value);
createPreview(); createPreview();
} }
/** /**
* 播放 * 播放
*/ */
function play(){ function play() {
izPlaying.value = true; izPlaying.value = true;
player.value.play(); player.value.play();
} }
/** /**
* 暂停 * 暂停
*/ */
function pause(){ function pause() {
izPlaying.value = false; izPlaying.value = false;
player.value.pause(); player.value.pause();
} }
/** /**
* 截屏 * 截屏
*/ */
function screenshot(){ function screenshot() {
player.value.screenshot(); player.value.screenshot();
} }
/** /**
* 鱼眼画面显示模式 * 鱼眼画面显示模式
*/ */
function setFishEyeDisplayMode(value){ function setFishEyeDisplayMode(value) {
player.value.setFishEyeDisplayMode(value); player.value.setFishEyeDisplayMode(value);
} }
/** /**
* 获取画面翻转 * 获取画面翻转
*/ */
function getSwitch(){ function getSwitch() {
if(formData.deviceIndex==null){ if (formData.deviceIndex == null) {
return return
} }
getImageCommon({ getImageCommon({
"deviceIndex": formData.deviceIndex, "deviceIndex": formData.deviceIndex,
"type": "switch" "type": "switch"
}).then(res=>{ }).then(res => {
formData.flip_type = res.flip_type; // formData.flip_type = res.flip_type; //
}); });
} }
/** /**
* 画面翻转 * 画面翻转
*/ */
function changeSwitch(attr,value){ function changeSwitch(attr, value) {
let param = {}; let param = {};
param[attr] = value; param[attr] = value;
setImageCommon({ setImageCommon({
"deviceIndex": formData.deviceIndex, "deviceIndex": formData.deviceIndex,
"type": "switch", "type": "switch",
"param": param "param": param
}).then(res=>{ }); }).then(res => { });
} }
/** /**
* 手动报警 * 手动报警
*/ */
function manualAlarm(){ function manualAlarm() {
let params = { let params = {
"deviceIndex": formData.deviceIndex, "deviceIndex": formData.deviceIndex,
"force": 1, "force": 1,
"id": '0' "id": '0'
}; };
testAudio(params); testAudio(params);
} }
/** /**
* 开始录制 * 开始录制
*/ */
function recordingStart(){ function recordingStart() {
izRecording.value = true; izRecording.value = true;
player.value.startRecording({micStream:true}).then((res) => { player.value.startRecording({ micStream: true }).then((res) => {
// resolve // resolve
}).catch((errData) => { }).catch((errData) => {
// //
// errData.error_code // errData.error_code
createMessage.error('录制错误,'+errData.msg); createMessage.error('录制错误,' + errData.msg);
}); });
} }
/** /**
* 结束录制 * 结束录制
*/ */
function recordingEnd(){ function recordingEnd() {
izRecording.value = false; izRecording.value = false;
let fileName = formData.deviceIndex+'-'+(new Date().getTime()); let fileName = formData.deviceIndex + '-' + (new Date().getTime());
player.value.stopRecording(fileName, true).then((res) => { player.value.stopRecording(fileName, true).then((res) => {
// resolve // resolve
}).catch((errData) => { }).catch((errData) => {
// //
// errData.error_code // errData.error_code
createMessage.error('录制错误,'+errData.msg); createMessage.error('录制错误,' + errData.msg);
}); });
} }
/** /**
* 开始电话 * 开始电话
*/ */
function startPhone(){ function startPhone() {
getMultitransUrl({ getMultitransUrl({
"videoDevId":formData.deviceIndex "videoDevId": formData.deviceIndex
}).then(res=>{ }).then(res => {
player.value.startVoiceIntercom({ player.value.startVoiceIntercom({
"url": res.url, // url "url": res.url, // url
"wssUrl": res.wssUrl, "wssUrl": res.wssUrl,
@ -416,54 +416,54 @@
}); });
izPhone.value = true; izPhone.value = true;
}); });
} }
/** /**
* 结束电话 * 结束电话
*/ */
function stopPhone(){ function stopPhone() {
player.value.stopVoiceIntercom(); player.value.stopVoiceIntercom();
izPhone.value = false; izPhone.value = false;
} }
/** /**
* 缩放 * 缩放
*/ */
function zoomInOut(type){ function zoomInOut(type) {
let delayTime = 6000; let delayTime = 6000;
if(type == 'in'){ if (type == 'in') {
formData.zoom = formData.zoom+0.4; formData.zoom = formData.zoom + 0.4;
if(formData.zoom > 4){ if (formData.zoom > 4) {
formData.zoom = 4; formData.zoom = 4;
} }
formData.sliderValue = formData.zoom; formData.sliderValue = formData.zoom;
moveCtrl(10,1,1); moveCtrl(10, 1, 1);
if(formData.sliderValue<=2){ if (formData.sliderValue <= 2) {
delayTime = 0.4*6000; delayTime = 0.4 * 6000;
}else{ } else {
delayTime = 0.2*6000; delayTime = 0.2 * 6000;
} }
delayExecute(moveCtrl,[10,0,1],delayTime); delayExecute(moveCtrl, [10, 0, 1], delayTime);
}else{ } else {
formData.zoom = formData.zoom-0.4; formData.zoom = formData.zoom - 0.4;
if(formData.zoom < 1){ if (formData.zoom < 1) {
formData.zoom = 1; formData.zoom = 1;
} }
formData.sliderValue = formData.zoom; formData.sliderValue = formData.zoom;
moveCtrl(9,1,1); moveCtrl(9, 1, 1);
if(formData.sliderValue<=2){ if (formData.sliderValue <= 2) {
delayTime = 0.4*6000; delayTime = 0.4 * 6000;
}else{ } else {
delayTime = 0.2*6000; delayTime = 0.2 * 6000;
}
delayExecute(moveCtrl,[9,0,1],delayTime);
} }
delayExecute(moveCtrl, [9, 0, 1], delayTime);
} }
}
/** /**
* 控制球机 * 控制球机
*/ */
function moveCtrl(direction,startOrNot,speed){ function moveCtrl(direction, startOrNot, speed) {
let params = { let params = {
"deviceIndex": formData.deviceIndex, "deviceIndex": formData.deviceIndex,
"direction": direction, "direction": direction,
@ -471,145 +471,189 @@
"speed": speed, "speed": speed,
}; };
motionCtrl(params); motionCtrl(params);
} }
function delayExecute(fn, args, delay) { function delayExecute(fn, args, delay) {
setTimeout(() => { setTimeout(() => {
fn.apply(this,args) // 使apply fn.apply(this, args) // 使apply
}, delay) }, delay)
} }
/** /**
* 销毁 * 销毁
*/ */
function destroy(){ function destroy() {
if (player){ if (player) {
player.value.destroy().then(() => { player.value.destroy().then(() => {
}); // }); //
player.value = null; player.value = null;
} }
} }
defineExpose({ defineExpose({
edit, edit,
destroy destroy
}); });
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.antd-modal-form { .antd-modal-form {
padding: 14px; padding: 14px;
} }
#video-container {
#video-container {
padding: 0px 25px; padding: 0px 25px;
width: 600px; width: 600px;
height: 500px; height: 500px;
background: #1a1a1a; background: #1a1a1a;
} }
.buttonSpan{
display: inline-flex; align-items: flex-end; .buttonSpan {
display: inline-flex;
align-items: flex-end;
margin-left: 20px; margin-left: 20px;
border: 1px solid #f6faff; border: 1px solid #f6faff;
padding: 5px 10px; padding: 5px 10px;
} }
.buttonSpan:hover{
.buttonSpan:hover {
border: 1px solid #1ea0fa; border: 1px solid #1ea0fa;
color: #1ea0fa; color: #1ea0fa;
border-radius: 10px; border-radius: 10px;
cursor: pointer; cursor: pointer;
} }
.buttonImg{
width:20px;margin-right:10px;vertical-align: bottom;
}
.fxjImgUp{
width:50px;height: 50px;
margin-right:10px;vertical-align: bottom;
cursor: pointer;
border-radius: 5px;transform: rotate(270deg);
background: url('../../../../../assets/iot/fxj.png') center/contain no-repeat;
}
.fxjImgUp:hover{
background: url('../../../../../assets/iot/fxj_blue.png') center/contain no-repeat;
}
.fxjImgLeft{
width:50px;height: 50px;margin-right:10px;vertical-align: bottom;transform: rotate(180deg);
cursor: pointer;
background: url('../../../../../assets/iot/fxj.png') center/contain no-repeat;
}
.fxjImgLeft:hover{
background: url('../../../../../assets/iot/fxj_blue.png') center/contain no-repeat;
}
.fxjImgDown{
width:50px;height: 50px;margin-right:10px;vertical-align: bottom;transform: rotate(90deg);
cursor: pointer;
background: url('../../../../../assets/iot/fxj.png') center/contain no-repeat;
}
.fxjImgDown:hover{
background: url('../../../../../assets/iot/fxj_blue.png') center/contain no-repeat;
}
.fxjImgRight{
width:50px;height: 50px;margin-right:10px;vertical-align: bottom;
cursor: pointer;
background: url('../../../../../assets/iot/fxj.png') center/contain no-repeat;
}
.fxjImgRight:hover{
background: url('../../../../../assets/iot/fxj_blue.png') center/contain no-repeat;
}
.selectDiv{ .buttonImg {
width: 20px;
margin-right: 10px;
vertical-align: bottom;
}
.fxjImgUp {
width: 50px;
height: 50px;
margin-right: 10px;
vertical-align: bottom;
cursor: pointer;
border-radius: 5px;
transform: rotate(270deg);
background: url('../../../../../assets/iot/fxj.png') center/contain no-repeat;
}
.fxjImgUp:hover {
background: url('../../../../../assets/iot/fxj_blue.png') center/contain no-repeat;
}
.fxjImgLeft {
width: 50px;
height: 50px;
margin-right: 10px;
vertical-align: bottom;
transform: rotate(180deg);
cursor: pointer;
background: url('../../../../../assets/iot/fxj.png') center/contain no-repeat;
}
.fxjImgLeft:hover {
background: url('../../../../../assets/iot/fxj_blue.png') center/contain no-repeat;
}
.fxjImgDown {
width: 50px;
height: 50px;
margin-right: 10px;
vertical-align: bottom;
transform: rotate(90deg);
cursor: pointer;
background: url('../../../../../assets/iot/fxj.png') center/contain no-repeat;
}
.fxjImgDown:hover {
background: url('../../../../../assets/iot/fxj_blue.png') center/contain no-repeat;
}
.fxjImgRight {
width: 50px;
height: 50px;
margin-right: 10px;
vertical-align: bottom;
cursor: pointer;
background: url('../../../../../assets/iot/fxj.png') center/contain no-repeat;
}
.fxjImgRight:hover {
background: url('../../../../../assets/iot/fxj_blue.png') center/contain no-repeat;
}
.selectDiv {
text-align: center; text-align: center;
border: 1px solid #f6faff; border: 1px solid #f6faff;
padding: 3px 10px; padding: 3px 10px;
width: 100px; width: 100px;
margin-top:5px; margin-top: 5px;
} }
.selectDiv:hover{
border: 1px solid #a2a3a3; .selectDiv:hover {
background: #a2a3a3; border: 1px solid #f4f5fa;
color:white; background: #f4f5fa;
color: #037FEA;
border-radius: 10px; border-radius: 10px;
cursor: pointer; cursor: pointer;
} }
.djImg{
.djImg {
background: url('../../../../../assets/iot/monitor_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_1.png') left/contain no-repeat;
} }
.djImg:hover{
.djImg:hover {
background: url('../../../../../assets/iot/monitor_1_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_1_1.png') left/contain no-repeat;
} }
.qxdImg{
.qxdImg {
background: url('../../../../../assets/iot/monitor_5.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_5.png') left/contain no-repeat;
} }
.qxdImg:hover{
.qxdImg:hover {
background: url('../../../../../assets/iot/monitor_5_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_5_1.png') left/contain no-repeat;
} }
.lzImg{
.lzImg {
background: url('../../../../../assets/iot/monitor_4.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_4.png') left/contain no-repeat;
} }
.lzImg:hover{
.lzImg:hover {
background: url('../../../../../assets/iot/monitor_4_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_4_1.png') left/contain no-repeat;
} }
.jtImg{
.jtImg {
background: url('../../../../../assets/iot/monitor_3.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_3.png') left/contain no-repeat;
} }
.jtImg:hover{
.jtImg:hover {
background: url('../../../../../assets/iot/monitor_3_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_3_1.png') left/contain no-repeat;
} }
.bjImg{
.bjImg {
background: url('../../../../../assets/iot/monitor_8.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_8.png') left/contain no-repeat;
} }
.bjImg:hover{
.bjImg:hover {
background: url('../../../../../assets/iot/monitor_8_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_8_1.png') left/contain no-repeat;
} }
.fpImg{
.fpImg {
background: url('../../../../../assets/iot/monitor_6.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_6.png') left/contain no-repeat;
} }
.fpImg:hover{
.fpImg:hover {
background: url('../../../../../assets/iot/monitor_6_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_6_1.png') left/contain no-repeat;
} }
.hmxzImg{
.hmxzImg {
background: url('../../../../../assets/iot/monitor_7.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_7.png') left/contain no-repeat;
} }
.hmxzImg:hover{
.hmxzImg:hover {
background: url('../../../../../assets/iot/monitor_7_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_7_1.png') left/contain no-repeat;
} }
</style> </style>

View File

@ -3,7 +3,8 @@
<a-drawer :title="title" :width="width" v-model:visible="visible" :closable="true" <a-drawer :title="title" :width="width" v-model:visible="visible" :closable="true"
:footer-style="{ textAlign: 'right' }" @close="handleCancel"> :footer-style="{ textAlign: 'right' }" @close="handleCancel">
<div v-if="showCamera"> <div v-if="showCamera">
<CameraPreviewForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></CameraPreviewForm> <CameraPreviewForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false">
</CameraPreviewForm>
</div> </div>
@ -13,17 +14,22 @@
<a-col :span="20" style="text-align: center;margin-top: 15px;margin-bottom: 15px;"> <a-col :span="20" style="text-align: center;margin-top: 15px;margin-bottom: 15px;">
<!-- 对讲停止对讲 切换 --> <!-- 对讲停止对讲 切换 -->
<!-- <img src="../../../../../assets/iot/monitor_1.png" class="buttonImg"/> --> <!-- <img src="../../../../../assets/iot/monitor_1.png" class="buttonImg"/> -->
<span class="buttonSpan djImg" @click="startPhone" v-show="!izPhone"><span style="margin-left:30px;">对讲</span></span> <span class="buttonSpan djImg" @click="startPhone" v-show="!izPhone"><span
<span class="buttonSpan djImg" @click="stopPhone" v-show="izPhone"><span style="margin-left:30px;">结束</span></span> style="margin-left:30px;">对讲</span></span>
<span class="buttonSpan djImg" @click="stopPhone" v-show="izPhone"><span
style="margin-left:30px;">结束</span></span>
<!-- 流畅超清 切换 --> <!-- 流畅超清 切换 -->
<span class="buttonSpan qxdImg" @click="switchResolution"><span style="margin-left:30px;">{{ resolution }}</span></span> <span class="buttonSpan qxdImg" @click="switchResolution"><span style="margin-left:30px;">{{ resolution
}}</span></span>
<!-- 录制结束录制 切换 --> <!-- 录制结束录制 切换 -->
<span class="buttonSpan lzImg" @click="recordingStart" v-show="!izRecording"><span style="margin-left:30px;">录制</span></span> <span class="buttonSpan lzImg" @click="recordingStart" v-show="!izRecording"><span
<span class="buttonSpan lzImg" @click="recordingEnd" v-show="izRecording"><span style="margin-left:30px;">结束</span></span> style="margin-left:30px;">录制</span></span>
<span class="buttonSpan lzImg" @click="recordingEnd" v-show="izRecording"><span
style="margin-left:30px;">结束</span></span>
<span class="buttonSpan jtImg" @click="screenshot"><span style="margin-left:30px;">截图</span></span> <span class="buttonSpan jtImg" @click="screenshot"><span style="margin-left:30px;">截图</span></span>
<span class="buttonSpan bjImg" @click="manualAlarm"><span style="margin-left:30px;">报警</span></span> <span class="buttonSpan bjImg" @click="manualAlarm"><span style="margin-left:30px;">报警</span></span>
<a-popover > <a-popover>
<template #content> <template #content>
<div style="text-align: center;"> <div style="text-align: center;">
<div class="selectDiv" @click="setFishEyeDisplayMode('ORIGIN')">原图</div> <div class="selectDiv" @click="setFishEyeDisplayMode('ORIGIN')">原图</div>
@ -38,10 +44,10 @@
<a-popover> <a-popover>
<template #content> <template #content>
<div style="text-align: center;"> <div style="text-align: center;">
<div class="selectDiv" @click="changeSwitch('flip_type','off')">关闭</div> <div class="selectDiv" @click="changeSwitch('flip_type', 'off')">关闭</div>
<div class="selectDiv" @click="changeSwitch('flip_type','left_and_right')">左右</div> <div class="selectDiv" @click="changeSwitch('flip_type', 'left_and_right')">左右</div>
<div class="selectDiv" @click="changeSwitch('flip_type','up_and_down')">上下</div> <div class="selectDiv" @click="changeSwitch('flip_type', 'up_and_down')">上下</div>
<div class="selectDiv" @click="changeSwitch('flip_type','center')">中心</div> <div class="selectDiv" @click="changeSwitch('flip_type', 'center')">中心</div>
</div> </div>
</template> </template>
<span class="buttonSpan hmxzImg"><span style="margin-left:30px;">画面旋转</span></span> <span class="buttonSpan hmxzImg"><span style="margin-left:30px;">画面旋转</span></span>
@ -56,47 +62,47 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import CameraPreviewForm from './CameraPreviewForm.vue' import CameraPreviewForm from './CameraPreviewForm.vue'
import JModal from '/@/components/Modal/src/JModal/JModal.vue'; import JModal from '/@/components/Modal/src/JModal/JModal.vue';
const title = ref<string>(''); const title = ref<string>('');
const width = ref<string>('70%'); const width = ref<string>('70%');
const visible = ref<boolean>(false); const visible = ref<boolean>(false);
const showCamera = ref<boolean>(false); const showCamera = ref<boolean>(false);
const disableSubmit = ref<boolean>(false); const disableSubmit = ref<boolean>(false);
const registerForm = ref(); const registerForm = ref();
const emit = defineEmits(['register', 'success', 'ok']); const emit = defineEmits(['register', 'success', 'ok']);
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue'; import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
import { defHttp } from '@/utils/http/axios'; import { defHttp } from '@/utils/http/axios';
import { useMessage } from '@/hooks/web/useMessage'; import { useMessage } from '@/hooks/web/useMessage';
import { getValueType } from '@/utils'; import { getValueType } from '@/utils';
import { Form } from 'ant-design-vue'; import { Form } from 'ant-design-vue';
import { import {
getImageCommon, getImageCommon,
getMultitransUrl, getMultitransUrl,
getPreviewUrl, getPreviewUrl,
setImageCommon, setImageCommon,
testAudio, testAudio,
motionCtrl motionCtrl
} from "../camera.api"; } from "../camera.api";
const props = defineProps({ const props = defineProps({
formDisabled: { type: Boolean, default: false }, formDisabled: { type: Boolean, default: false },
formData: { type: Object, default: () => ({})}, formData: { type: Object, default: () => ({}) },
formBpm: { type: Boolean, default: true } formBpm: { type: Boolean, default: true }
}); });
const formRef = ref(); const formRef = ref();
const player = ref(); const player = ref();
const resolution = ref<string>('流畅'); const resolution = ref<string>('流畅');
const izPlaying = ref<boolean>(true); const izPlaying = ref<boolean>(true);
const izRecording = ref<boolean>(false); const izRecording = ref<boolean>(false);
const izPhone = ref<boolean>(false); const izPhone = ref<boolean>(false);
const fishEyeDisplayMode = ref<string>('ORIGIN'); const fishEyeDisplayMode = ref<string>('ORIGIN');
const flipType = ref<string>('off'); const flipType = ref<string>('off');
const useForm = Form.useForm; const useForm = Form.useForm;
const formData = reactive<Record<string, any>>({ const formData = reactive<Record<string, any>>({
// //
deviceIndex: '',// deviceIndex: '',//
@ -110,28 +116,28 @@
flip_type: '',// "off"// "left_and_right"// "up_and_down"// "center"// flip_type: '',// "off"// "left_and_right"// "up_and_down"// "center"//
zoom: 1, // zoom: 1, //
sliderValue : 1,// sliderValue: 1,//
ptz : 0,// ptz: 0,//
smartCode : 0,// smartCode: 0,//
}); });
const { createMessage } = useMessage(); const { createMessage } = useMessage();
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } }); const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } }); const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
const confirmLoading = ref<boolean>(false); const confirmLoading = ref<boolean>(false);
// //
const validatorRules = reactive({ const validatorRules = reactive({
}); });
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false }); const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
/** /**
* 编辑 * 编辑
* @param record * @param record
*/ */
async function edit(record) { async function edit(record) {
title.value = record.deviceName; title.value = record.deviceName;
showCamera.value = true; showCamera.value = true;
visible.value = true; visible.value = true;
@ -139,11 +145,11 @@
registerForm.value.edit(record); registerForm.value.edit(record);
}); });
await nextTick(() => { await nextTick(() => {
confirmLoading.value=true; confirmLoading.value = true;
resetFields(); resetFields();
const tmpData = {}; const tmpData = {};
Object.keys(formData).forEach((key) => { Object.keys(formData).forEach((key) => {
if(record.hasOwnProperty(key)){ if (record.hasOwnProperty(key)) {
tmpData[key] = record[key] tmpData[key] = record[key]
} }
}) })
@ -152,39 +158,39 @@
}); });
createPreview(); createPreview();
getSwitch(); getSwitch();
} }
/** /**
* 确定按钮点击事件 * 确定按钮点击事件
*/ */
function handleOk() { function handleOk() {
registerForm.value.submitForm(); registerForm.value.submitForm();
} }
/** /**
* form保存回调事件 * form保存回调事件
*/ */
function submitCallback() { function submitCallback() {
handleCancel(); handleCancel();
} }
/** /**
* 取消按钮回调事件 * 取消按钮回调事件
*/ */
function handleCancel() { function handleCancel() {
visible.value = false; visible.value = false;
nextTick(() => { nextTick(() => {
registerForm.value.destroy(); registerForm.value.destroy();
showCamera.value = false; showCamera.value = false;
}); });
} }
/** /**
* 开始电话 * 开始电话
*/ */
function startPhone(){ function startPhone() {
getMultitransUrl({ getMultitransUrl({
"videoDevId":formData.deviceIndex "videoDevId": formData.deviceIndex
}).then(res=>{ }).then(res => {
player.value.startVoiceIntercom({ player.value.startVoiceIntercom({
"url": res.url, // url "url": res.url, // url
"wssUrl": res.wssUrl, "wssUrl": res.wssUrl,
@ -192,29 +198,29 @@
}); });
izPhone.value = true; izPhone.value = true;
}); });
} }
/** /**
* 结束电话 * 结束电话
*/ */
function stopPhone(){ function stopPhone() {
player.value.stopVoiceIntercom(); player.value.stopVoiceIntercom();
izPhone.value = false; izPhone.value = false;
} }
/** /**
* 创建预览 * 创建预览
*/ */
async function createPreview(){ async function createPreview() {
await getPreviewUrl({"deviceIndex":formData.deviceIndex,"streamType":formData.streamType}).then(res=>{ await getPreviewUrl({ "deviceIndex": formData.deviceIndex, "streamType": formData.streamType }).then(res => {
formData.url = res.url; formData.url = res.url;
formData.backupUrl = res.backupUrl; formData.backupUrl = res.backupUrl;
formData.wsUrl = res.wsUrl; formData.wsUrl = res.wsUrl;
formData.wssUrl = res.wssUrl; formData.wssUrl = res.wssUrl;
confirmLoading.value=false; confirmLoading.value = false;
}); });
if (player.value){ if (player.value) {
player.value.destroy().then(() => { player.value.destroy().then(() => {
}); // }); //
player.value = null; player.value = null;
@ -239,200 +245,224 @@
} }
izPlaying.value = true; izPlaying.value = true;
} }
} }
/** /**
* 切换超清/流程 * 切换超清/流程
*/ */
function switchResolution(){ function switchResolution() {
if(formData.streamType == 0){ if (formData.streamType == 0) {
resolution.value = '流畅'; resolution.value = '流畅';
formData.streamType = 1; formData.streamType = 1;
}else{ } else {
resolution.value = '超清'; resolution.value = '超清';
formData.streamType = 0; formData.streamType = 0;
} }
createMessage.info('正在切换至'+resolution.value); createMessage.info('正在切换至' + resolution.value);
createPreview(); createPreview();
} }
/** /**
* 播放 * 播放
*/ */
function play(){ function play() {
izPlaying.value = true; izPlaying.value = true;
player.value.play(); player.value.play();
} }
/** /**
* 暂停 * 暂停
*/ */
function pause(){ function pause() {
izPlaying.value = false; izPlaying.value = false;
player.value.pause(); player.value.pause();
} }
/** /**
* 截屏 * 截屏
*/ */
function screenshot(){ function screenshot() {
player.value.screenshot(); player.value.screenshot();
} }
/** /**
* 鱼眼画面显示模式 * 鱼眼画面显示模式
*/ */
function setFishEyeDisplayMode(value){ function setFishEyeDisplayMode(value) {
player.value.setFishEyeDisplayMode(value); player.value.setFishEyeDisplayMode(value);
} }
/** /**
* 获取画面翻转 * 获取画面翻转
*/ */
function getSwitch(){ function getSwitch() {
if(formData.deviceIndex==null){ if (formData.deviceIndex == null) {
return return
} }
getImageCommon({ getImageCommon({
"deviceIndex": formData.deviceIndex, "deviceIndex": formData.deviceIndex,
"type": "switch" "type": "switch"
}).then(res=>{ }).then(res => {
formData.flip_type = res.flip_type; // formData.flip_type = res.flip_type; //
}); });
} }
/** /**
* 画面翻转 * 画面翻转
*/ */
function changeSwitch(attr,value){ function changeSwitch(attr, value) {
let param = {}; let param = {};
param[attr] = value; param[attr] = value;
setImageCommon({ setImageCommon({
"deviceIndex": formData.deviceIndex, "deviceIndex": formData.deviceIndex,
"type": "switch", "type": "switch",
"param": param "param": param
}).then(res=>{ }); }).then(res => { });
} }
/** /**
* 手动报警 * 手动报警
*/ */
function manualAlarm(){ function manualAlarm() {
let params = { let params = {
"deviceIndex": formData.deviceIndex, "deviceIndex": formData.deviceIndex,
"force": 1, "force": 1,
"id": '0' "id": '0'
}; };
testAudio(params); testAudio(params);
} }
/** /**
* 开始录制 * 开始录制
*/ */
function recordingStart(){ function recordingStart() {
izRecording.value = true; izRecording.value = true;
player.value.startRecording({micStream:true}).then((res) => { player.value.startRecording({ micStream: true }).then((res) => {
// resolve // resolve
}).catch((errData) => { }).catch((errData) => {
// //
// errData.error_code // errData.error_code
createMessage.error('录制错误,'+errData.msg); createMessage.error('录制错误,' + errData.msg);
}); });
} }
/** /**
* 结束录制 * 结束录制
*/ */
function recordingEnd(){ function recordingEnd() {
izRecording.value = false; izRecording.value = false;
let fileName = formData.deviceIndex+'-'+(new Date().getTime()); let fileName = formData.deviceIndex + '-' + (new Date().getTime());
player.value.stopRecording(fileName, true).then((res) => { player.value.stopRecording(fileName, true).then((res) => {
// resolve // resolve
}).catch((errData) => { }).catch((errData) => {
// //
// errData.error_code // errData.error_code
createMessage.error('录制错误,'+errData.msg); createMessage.error('录制错误,' + errData.msg);
}); });
} }
defineExpose({ defineExpose({
edit, edit,
disableSubmit, disableSubmit,
}); });
</script> </script>
<style lang="less"> <style lang="less">
/**隐藏样式-modal确定按钮 */ /**隐藏样式-modal确定按钮 */
.jee-hidden { .jee-hidden {
display: none !important; display: none !important;
} }
.ant-modal-body { .ant-modal-body {
height: auto !important; height: auto !important;
overflow: hidden !important; overflow: hidden !important;
} }
</style> </style>
<style lang="less" scoped> <style lang="less" scoped>
.selectDiv{ .selectDiv {
text-align: center; text-align: center;
border: 1px solid #f6faff; border: 1px solid white;
padding: 3px 10px; padding: 3px 10px;
width: 100px; width: 100px;
margin-top:5px; margin-top: 5px;
} }
.selectDiv:hover{
border: 1px solid #a2a3a3; .selectDiv:hover {
background: #a2a3a3; border: 1px solid #f4f5fa;
color:white; background: #f4f5fa;
color: #037FEA;
border-radius: 10px; border-radius: 10px;
cursor: pointer; cursor: pointer;
} }
.buttonSpan{
.buttonSpan {
display: inline-flex; display: inline-flex;
align-items: flex-end; align-items: flex-end;
margin-left: 20px; margin-left: 20px;
//border: 1px solid #f6faff;
padding: 6px 6px; padding: 6px 6px;
} }
.djImg{
.buttonSpan:hover {
//border: 1px solid #1ea0fa;
color: #1ea0fa;
border-radius: 10px;
cursor: pointer;
}
.djImg {
background: url('../../../../../assets/iot/monitor_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_1.png') left/contain no-repeat;
} }
.djImg:hover{
.djImg:hover {
background: url('../../../../../assets/iot/monitor_1_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_1_1.png') left/contain no-repeat;
} }
.qxdImg{
.qxdImg {
background: url('../../../../../assets/iot/monitor_5.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_5.png') left/contain no-repeat;
} }
.qxdImg:hover{
.qxdImg:hover {
background: url('../../../../../assets/iot/monitor_5_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_5_1.png') left/contain no-repeat;
} }
.lzImg{
.lzImg {
background: url('../../../../../assets/iot/monitor_4.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_4.png') left/contain no-repeat;
} }
.lzImg:hover{
.lzImg:hover {
background: url('../../../../../assets/iot/monitor_4_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_4_1.png') left/contain no-repeat;
} }
.jtImg{
.jtImg {
background: url('../../../../../assets/iot/monitor_3.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_3.png') left/contain no-repeat;
} }
.jtImg:hover{
.jtImg:hover {
background: url('../../../../../assets/iot/monitor_3_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_3_1.png') left/contain no-repeat;
} }
.bjImg{
.bjImg {
background: url('../../../../../assets/iot/monitor_8.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_8.png') left/contain no-repeat;
} }
.bjImg:hover{
.bjImg:hover {
background: url('../../../../../assets/iot/monitor_8_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_8_1.png') left/contain no-repeat;
} }
.fpImg{
.fpImg {
background: url('../../../../../assets/iot/monitor_6.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_6.png') left/contain no-repeat;
} }
.fpImg:hover{
.fpImg:hover {
background: url('../../../../../assets/iot/monitor_6_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_6_1.png') left/contain no-repeat;
} }
.hmxzImg{
.hmxzImg {
background: url('../../../../../assets/iot/monitor_7.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_7.png') left/contain no-repeat;
} }
.hmxzImg:hover{
.hmxzImg:hover {
background: url('../../../../../assets/iot/monitor_7_1.png') left/contain no-repeat; background: url('../../../../../assets/iot/monitor_7_1.png') left/contain no-repeat;
} }
</style> </style>