zhgdyunapp/pages/videoManage/playVideo.vue
2025-07-24 16:53:08 +08:00

538 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="fullHeight">
<headers :showBack="true">
<view class="headerName">
视频播放
</view>
</headers>
<!-- <video class="videoBox" id="myVideo" :custom-cache="false" :src="url" controls autoplay></video> -->
<!-- APP环境使用web-view -->
<!-- #ifdef APP-PLUS -->
<video v-if="!isYsy" class="videoBox" id="myVideo" :custom-cache="false"
:src="playUrlFilter" controls autoplay></video>
<!-- #endif -->
<!-- H5环境使用ezuikit -->
<!-- #ifdef H5 -->
<my-player-m3u8 v-if="!isYsy && playUrlFilter" :showMask="true" :src="playUrlFilter" :autoplay="true" />
<!-- #endif -->
<view v-if="isYsy && playUrlFilter && accessToken" :style="{width: '100%', height: '225px'}">
<!-- H5环境使用ezuikit -->
<!-- #ifdef H5 -->
<iframe :src="ysyPlayUrl" :style="webviewStyles" frameborder="0" :scrolling="'no'"></iframe>
<!-- #endif -->
<!-- APP环境使用web-view -->
<!-- #ifdef APP-PLUS -->
<web-view :src="ysyPlayUrl" :style="webviewStyles" :webview-styles="webviewConfig"></web-view>
<!-- #endif -->
</view>
<view class="videoName">
{{videoInfo.videoName}}
<button v-if="videoInfo.videoType==3" type="primary" class="changeBtn btn"
@click="changeStreamFn">{{streamType==1?'切换到主码流':'切换到子码流'}}</button>
</view>
<view class="videoOperateBox">
<text class="desc">当前云台速度{{ this.opSize }}</text>
<view class="box">
<image src="../../static/videoControlIcon/bg.png" class="bg"></image>
<view class="pic top"
:style="{backgroundImage: typeName == 'UP' && videoFlag?'url(../../static/videoControlIcon/top-active.png)':'url(../../static/videoControlIcon/top.png)'}"
@click="controlVideoFn(0,0.2,0,'UP')"></view>
<view class="pic left"
:style="{backgroundImage: typeName == 'LEFT' && videoFlag?'url(../../static/videoControlIcon/left-active.png)':'url(../../static/videoControlIcon/left.png)'}"
@click="controlVideoFn(-0.2,0,0,'LEFT')"></view>
<view class="pic bottom"
:style="{backgroundImage: typeName == 'DOWN' && videoFlag?'url(../../static/videoControlIcon/bottom-active.png)':'url(../../static/videoControlIcon/bottom.png)'}"
@click="controlVideoFn(0,-0.2,0,'DOWN')"></view>
<view class="pic right"
:style="{backgroundImage: typeName == 'RIGHT' && videoFlag?'url(../../static/videoControlIcon/right-active.png)':'url(../../static/videoControlIcon/right.png)'}"
@click="controlVideoFn(0.2,0,0,'RIGHT')"></view>
<!-- <view class="pic center" @click="stop()"></view> -->
</view>
<view class="box2">
<view class="zoom zoomin"
:style="{backgroundImage: typeName == 'ZOOM_OUT' && videoFlag?'url(../../static/videoControlIcon/2.png)':'url(../../static/videoControlIcon/1.png)'}"
@click="controlVideoFn(0,0,-0.2,'ZOOM_OUT')"></view>
<view class="zoom zoomout"
:style="{backgroundImage: typeName == 'ZOOM_IN' && videoFlag?'url(../../static/videoControlIcon/4.png)':'url(../../static/videoControlIcon/3.png)'}"
@click="controlVideoFn(0,0,0.2,'ZOOM_IN')"></view>
</view>
<view class="video-playback" v-if="videoConfig.videoType != 1" @click="toBackList">
视频回放
</view>
<view class="set-speed">
<u-button @click="setSpeed" type="primary">设置球机转动速度</u-button>
</view>
</view>
<uni-popup ref="speedPopup" type="center">
<view class="speed_wrap">
<text class="s_title">设置球机转动速度</text>
<UNumberBox :value="opSize" :inputHeight="70" @change="changeSpeed" />
<u-button class="s_btn" @click="handleSaveSpeed">确认</u-button>
</view>
</uni-popup>
</view>
</template>
<script>
import headers from '../../components/headers/headers.vue'
import UNumberBox from "../../components/u-number-box/u-number-box.vue"
import MyPlayerM3u8 from '@/components/my-player-m3u8/my-player-m3u8.vue';
export default {
components: {
headers,
UNumberBox,
MyPlayerM3u8
},
data() {
return {
url: '', //rtsp://admin:jxj12345@192.168.0.64:554/h264/ch1/main/av_stream
videoInfo: {
videoName: '',
videoType: null
},
streamType: 1, //1是子码流 2是主码流
opSize: 20,
videoResponseInfo: {},
videoFlag: false,
typeName: "",
videoConfig: {},
projectSn: "",
tempSpeed: 20,
};
},
onLoad(options) {
this.projectSn = JSON.parse(uni.getStorageSync('projectDetail')).projectSn;
//videoType 1萤石云2乐橙3ISC4大华5宇视6国标
// this.url = options.url
this.videoInfo = uni.getStorageSync('videoInfo');
this.projectSn = JSON.parse(uni.getStorageSync('projectDetail')).projectSn;
this.opSize = Number(uni.getStorageSync('videoOpSize') || 20);
if (this.videoInfo.videoType == 2) {
this.url = this.videoInfo.liveRadioUrl
} else {
this.getPlayUrl()
}
this.getUseProjectVideoConfig();
},
onReady() {
// this.$nextTick(() => {
// this.setHeight()
// })
},
computed: {
playUrlFilter() {
//
// let url = "";
// if(this.videoConfig && this.videoConfig.videoType == 1) {
// url = this.url
// } else if (this.url) {
// url = 'rtsp://42.180.188.17' + this.url.substring(20);
// }
// console.log(url);
return this.url
},
isYsy() {
console.info(this.videoInfo?.videoType, '======')
return this.videoInfo?.videoType == 1
},
ysyPlayUrl() {
// 萤石云播放地址
return `https://open.ys7.com/ezopen/h5/iframe?url=${this.playUrlFilter}&template=simple&autoplay=1&accessToken=${this.accessToken}`
}
},
methods: {
handleSaveSpeed() {
this.opSize = this.tempSpeed
this.$refs.speedPopup.close()
uni.setStorageSync('videoOpSize', this.opSize)
},
changeSpeed(data) {
console.info(data, this.opSize)
this.tempSpeed = data.value
},
setSpeed() {
this.tempSpeed = this.opSize
this.$refs.speedPopup.open()
},
getUseProjectVideoConfig() {
var that = this
let requestData = {
projectSn: this.projectSn
}
this.sendRequest({
url: "xmgl/projectVideoConfig/getUseProjectVideoConfig",
data: requestData,
method: "POST",
success(res) {
console.log('找封面', res)
that.videoConfig = res.result;
}
})
},
// 跳转到录像回放列表
toBackList() {
uni.navigateTo({
url: './playBackList?obj=' + JSON.stringify({
...this.videoResponseInfo,
...this.videoInfo
})
})
},
changeStreamFn() {
if (this.streamType == 1) {
this.streamType = 2
} else {
this.streamType = 1
}
this.getPlayUrl()
},
getPlayUrl() {
var that = this
var json = {
itemId: this.videoInfo.itemId
}
if (this.videoInfo.videoType == 3) {
json.streamType = this.streamType
json.type = 'rtsp' //rtsp或者hls
}
this.sendRequest({
url: "xmgl/videoItem/getVideoItemInfo",
data: json,
method: "post",
success(res) {
switch (that.videoInfo.videoType) {
case 1:
// that.url=res.result.videoInfo.hdFlvAddress
that.url = res.result.videoInfo
that.accessToken = res.result.accessToken
break;
default:
that.url = res.result.videoInfo.url
break;
}
// console.log(that.url,res.result.videoInfo.hdFlvAddress,that.videoInfo.videoType,res.result.projectVideoConfig.videoType)
that.videoResponseInfo = {
...res.result.projectVideoConfig,
...res.result.videoInfo
};
for (let i in that.videoResponseInfo) {
if (!that.videoResponseInfo[i]) {
delete that.videoResponseInfo[i]
}
}
}
})
},
controlVideoFn(pan, tilt, zoom, opType) {
this.typeName = opType
if (this.videoFlag) {
uni.showToast({
title: '不要重复点击',
icon: 'none'
})
return
}
if (this.videoInfo.deviceType != 2) {
uni.showToast({
title: '该设备不是球机,不支持此操作',
icon: 'none'
})
return false
}
switch (this.videoInfo.videoType) {
case 3:
this.videoFlag = true;
this.controlVideoFn_isc(opType)
break;
case 4:
this.videoFlag = true;
this.controlVideoFn_dh(pan, tilt, zoom)
break;
default:
uni.showToast({
title: '暂不支持',
icon: 'none'
})
break;
}
},
controlVideoFn_isc(opType) {
let json = {
// cameraId: this.videoInfo.deviceSerial,
itemId: this.videoInfo.itemId,
opType: opType,
opSize: this.opSize,
opCode: 1
};
var that = this
this.sendRequest({
url: "xmgl/videoItem/getHikPtzControl",
data: json,
method: "post",
success(res) {
uni.showToast({
title: '控制成功',
icon: 'none'
})
},
complete() {
that.videoFlag = false;
}
})
},
controlVideoFn_dh(pan, tilt, zoom) {
var code = '';
var jsonStr = {
pan: pan,
tilt: tilt,
zoom: zoom,
duration: 100
};
let json = {
ip: this.videoInfo.ip,
port: this.videoInfo.port,
username: this.videoInfo.username,
password: this.videoInfo.password,
chnnelcode: this.videoInfo.chnnelcode,
jsonStr: JSON.stringify(jsonStr),
data: new Date()
};
var that = this
this.sendRequest({
url: "xmgl/video/putPTZ",
data: json,
method: "get",
success(res) {
uni.showToast({
title: '控制成功',
icon: 'none'
})
},
complete() {
that.videoFlag = false;
}
})
}
}
}
</script>
<style lang="scss" scoped>
/deep/ .m3u8-player,
.player-m3u8{
width: 100%;
height: 420rpx;
}
/* #ifdef H5 */
.fullHeight {
background-color: #F4F5FD;
height: 100vh;
}
/* #endif */
/* #ifdef MP-WEIXIN */
.fullHeight {
background-color: #F4F5FD;
height: 100vh;
}
/* #endif */
/* #ifdef APP-PLUS */
.fullHeight {
background-color: #F4F5FD;
height: auto;
padding-bottom: 60rpx;
}
/* #endif */
.videoBox {
width: 100%;
}
.videoName {
font-size: 16px;
color: $uni-text-color;
font-weight: bold;
margin: 10px 15px;
position: relative;
.changeBtn {
position: absolute;
right: 0;
top: 0;
font-size: 12px;
}
}
.set-speed {
margin: 48rpx 96rpx;
height: 108rpx;
}
.video-playback {
width: 454rpx;
height: 108rpx;
background: #FFFFFF;
border-radius: 31rpx;
text-align: center;
line-height: 108rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 40rpx;
color: #8D8D8D;
margin: 0 auto;
margin-top: 80rpx;
// position: fixed;
// bottom: 80rpx;
// left: 145rpx;
}
.videoOperateBox {
position: relative;
text-align: center;
padding-top: 10px;
.bg {
width: 220px;
height: 220px;
}
}
.videoOperateBox .box {
position: relative;
display: inline-block;
margin: auto;
height: 220px;
}
.videoOperateBox .pic {
position: absolute;
cursor: pointer;
}
.videoOperateBox .zoom {
width: 106px;
height: 69px;
display: inline-block;
cursor: pointer;
}
.videoOperateBox .zoomin:hover {
background: url("../../static/videoControlIcon/4.png");
}
.videoOperateBox .zoomout:hover {
background: url("../../static/videoControlIcon/2.png");
}
.videoOperateBox .zoomin {
background: url("../../static/videoControlIcon/3.png");
}
.videoOperateBox .zoomout {
background: url("../../static/videoControlIcon/1.png");
}
.videoOperateBox .left {
width: 28px;
height: 33px;
background: url("../../static/videoControlIcon/left.png");
left: 25px;
top: 50%;
margin-top: -16px;
}
.videoOperateBox .left:hover {
background: url("../../static/videoControlIcon/left-active.png");
}
.videoOperateBox .right:hover {
background: url("../../static/videoControlIcon/right-active.png");
}
.videoOperateBox .top:hover {
background: url("../../static/videoControlIcon/top-active.png");
}
.videoOperateBox .bottom:hover {
background: url("../../static/videoControlIcon/bottom-active.png");
}
// .videoOperateBox .center:hover {
// background: url("../../static/videoControlIcon/center-active.png");
// }
.videoOperateBox .right {
width: 28px;
height: 33px;
background: url("../../static/videoControlIcon/right.png");
right: 25px;
top: 50%;
margin-top: -16px;
}
.videoOperateBox .top {
width: 33px;
height: 28px;
background: url("../../static/videoControlIcon/top.png");
top: 25px;
left: 50%;
margin-left: -16px;
}
.videoOperateBox .bottom {
width: 33px;
height: 28px;
background: url("../../static/videoControlIcon/bottom.png");
bottom: 25px;
left: 50%;
margin-left: -16px;
}
// .videoOperateBox .center {
// width: 44px;
// height: 40px;
// background: url("../../static/videoControlIcon/center.png");
// left: 50%;
// top: 50%;
// margin-top: -20px;
// margin-left: -22px;
// }
.desc {
text-align: right;
position: absolute;
top: -12rpx;
font-size: 32rpx;
left: 28rpx;
}
.speed_wrap {
width: 550rpx;
height: 300rpx;
background-color: #FFFFFF;
border-radius: 16rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
.s_title {
color: #000;
font-weight: 600;
line-height: 40rpx;
font-size: 36rpx;
margin: 24rpx 0;
}
.s_btn {
width: 100%;
&:after {
border-radius: 0;
}
}
}
</style>