367 lines
9.6 KiB
Vue
367 lines
9.6 KiB
Vue
<template>
|
|
<view>
|
|
<view class="status_bar">
|
|
<div class="item" @click="goBack">
|
|
<u-icon name="arrow-left"></u-icon>
|
|
</div>
|
|
<div class="item">视频监控</div>
|
|
<div class="item"></div>
|
|
</view>
|
|
<!-- 视频监控 -->
|
|
<div class="video">
|
|
<video v-if="type === 0" id="videoPlayer" ref="videoPlayer" class="video-player" autoplay controls="controls"
|
|
@click="checkVideo(1)" />
|
|
<video
|
|
v-if="type === 1"
|
|
id="myVideo"
|
|
ref="myVideo"
|
|
src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/wap2appvsnative.mp4"
|
|
controls
|
|
></video>
|
|
</div>
|
|
<div class="action">
|
|
<u-tabs
|
|
:list="tabList"
|
|
@click="clickTab"
|
|
:current="currentIndex"
|
|
:activeStyle="{ fontWeight: 500, fontSize: '14px', color: '#0F274B' }"
|
|
:inactiveStyle="{ fontWeight: 400, fontSize: '12px', color: 'rgba(15, 39, 75, 0.5)' }"
|
|
/>
|
|
<div class="action-item">
|
|
<div class="top" @click="handleCloud('top')">
|
|
<u-icon name="arrow-up"></u-icon>
|
|
</div>
|
|
<div class="center">
|
|
<div class="w-h" @click="handleCloud('left')">
|
|
<u-icon name="arrow-left"></u-icon>
|
|
</div>
|
|
<div class="w-h circle" @click="handleCloud('center')"></div>
|
|
<div class="w-h">
|
|
<u-icon name="arrow-right" @click="handleCloud('right')"></u-icon>
|
|
</div>
|
|
</div>
|
|
<div class="bottom" @click="handleCloud('bottom')">
|
|
<u-icon name="arrow-down"></u-icon>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- 底部操作栏 -->
|
|
<u-tabbar :fixed="true" :placeholder="false" activeColor="">
|
|
<u-tabbar-item text="拍照" icon="/static/images/imgs/film.png" @click="clickTabItem(1)"></u-tabbar-item>
|
|
<u-tabbar-item text="全屏" icon="/static/images/imgs/full-screen.png" @click="clickTabItem(2)"></u-tabbar-item>
|
|
<div class="talk-back" @click="clickTabItem(3)">
|
|
<u-icon name="/static/images/imgs/talkback.png"></u-icon>
|
|
</div>
|
|
<u-tabbar-item text="放大" icon="/static/images/imgs/enlargement.png" @click="clickTabItem(4)"></u-tabbar-item>
|
|
<u-tabbar-item text="缩小" icon="/static/images/imgs/lessen.png" @click="clickTabItem(5)"></u-tabbar-item>
|
|
</u-tabbar>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
// import FlvJs from 'flv.js'
|
|
import CryptoJS from 'crypto-js'
|
|
let _cf = {
|
|
ver: 'debug',
|
|
q2http_url: 'http://112.31.70.193:1854/icvs/',
|
|
websocket_url: 'ws://112.31.70.193:9580/wss',
|
|
// - 配置登录参数
|
|
connParams: {
|
|
// - 登录平台IP
|
|
address: '112.31.70.193',
|
|
port: '9988',
|
|
// - 登录平台用户名
|
|
user: 'bns3',
|
|
// - 登录平台密码
|
|
password: 'Bns@admin**',
|
|
// - 登录平台企业ID
|
|
epid: 'system',
|
|
// - 登录平台是否通过网闸模式
|
|
bfix: 1
|
|
}
|
|
}
|
|
var loginToken = ''
|
|
var puId = ''
|
|
export default {
|
|
data() {
|
|
return {
|
|
type: 0,
|
|
tabBarValue: 0,
|
|
currentIndex: 0,
|
|
tabList: [{ name: '实时视频' }, { name: '历史录像' }],
|
|
video: null,
|
|
isPlaying: false,
|
|
// 视频播放实例
|
|
videoPlayer: null,
|
|
classStyle: 'ball-content'
|
|
}
|
|
},
|
|
async mounted() {
|
|
console.log('------mounted')
|
|
this.connect()
|
|
console.log('loginToken', loginToken)
|
|
setTimeout(() => {
|
|
console.log('loginToken', loginToken)
|
|
this.initVideo('201115203294827151')
|
|
}, 500)
|
|
},
|
|
methods: {
|
|
goBack() {
|
|
if (getCurrentPages().length == 1) {
|
|
this.$tab.reLaunch('/pages/index')
|
|
} else {
|
|
uni.navigateBack()
|
|
}
|
|
},
|
|
changeTabBar(value) {
|
|
console.log('changeTabBar', value)
|
|
this.tabBarValue = value
|
|
},
|
|
clickTab(val) {
|
|
this.currentIndex = val.index
|
|
console.log('clickTab', val, this.currentIndex)
|
|
},
|
|
clickTabItem(val) {
|
|
console.log('clickTabItem', val)
|
|
// val 1 拍照 2 全屏 3 对讲 4 放大 5 缩小
|
|
// val = 2 全屏播放视频
|
|
if (val === 2) {
|
|
this.video.requestFullScreen()
|
|
}
|
|
},
|
|
handleCloud(val) {
|
|
console.log('handleCloud', val)
|
|
// val top 上 left 左 center 中 right 右 bottom 下
|
|
if (val === 'center') {
|
|
if (this.isPlaying) {
|
|
this.video.pause()
|
|
} else {
|
|
this.video.play()
|
|
}
|
|
this.isPlaying = !this.isPlaying
|
|
}
|
|
},
|
|
|
|
|
|
checkVideo(index) {
|
|
console.log(index)
|
|
},
|
|
//加密
|
|
videoEncrypt(word) {
|
|
var key = CryptoJS.enc.Utf8.parse('297796CCB81D2553')
|
|
var srcs = CryptoJS.enc.Utf8.parse(word)
|
|
var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
|
|
return encrypted.toString()
|
|
},
|
|
// 请求
|
|
requestPost(router, params, callback) {
|
|
uni.request({
|
|
method: 'post',
|
|
url: _cf.q2http_url + router,
|
|
data: params,
|
|
dataType: 'json',
|
|
async: false,
|
|
complete: function(rv) {
|
|
if (typeof callback == 'function') callback(rv)
|
|
}
|
|
})
|
|
|
|
|
|
// $.ajax({
|
|
// type: 'post',
|
|
// url: _cf.q2http_url + router,
|
|
// data: params,
|
|
// traditional: true,
|
|
// dataType: 'json',
|
|
// async: false,
|
|
// complete: function (rv) {
|
|
// if (typeof callback == 'function') callback(rv)
|
|
// }
|
|
// })
|
|
},
|
|
//连接
|
|
connect() {
|
|
console.log('connect')
|
|
var allDataParams = 'address=' + _cf.connParams.address + '&port=' + _cf.connParams.port +
|
|
'&user=' + _cf.connParams.user + '&password=' + _cf.connParams.password + '&epid=' + _cf.connParams.epid + '&fixaddr=' + _cf.connParams.bfix
|
|
let params = {
|
|
'params': this.videoEncrypt(allDataParams)
|
|
}
|
|
// console.log(params)
|
|
this.requestPost('login2', params, function(rv) {
|
|
console.log('rv=============', rv)
|
|
console.log('rv.data=============', rv.data)
|
|
console.log('rv.statusCode=============', rv.statusCode)
|
|
|
|
let result = {
|
|
errcode: -1,
|
|
token: ''
|
|
}
|
|
// let respJSON = JSON.parse(rv.responseText);
|
|
// console.log("respJSON=============",respJSON)
|
|
if (rv.hasOwnProperty('errcode')) {
|
|
result.errcode = rv.errcode
|
|
} else if (rv.hasOwnProperty('statusCode')) {
|
|
result.token = rv.data.token
|
|
result.errcode = 0
|
|
loginToken = result.token//获取Token
|
|
console.log('loginToken', loginToken)
|
|
}
|
|
// if (rv.hasOwnProperty('token')) {
|
|
// result.token = respJSON.token;
|
|
// result.errcode = 0;
|
|
// loginToken = result.token;//获取Token
|
|
// }
|
|
})
|
|
},
|
|
// 初始化视频监控
|
|
initVideo(devId) {
|
|
puId = devId
|
|
console.log('=============intiVideo')
|
|
console.log(puId)
|
|
console.log(loginToken)
|
|
this.$nextTick(() => {
|
|
const videoElement = this.$refs.videoPlayer
|
|
const url = `${_cf.q2http_url}/stream.flv?puid=${puId}&idx=0&stream=0&token=${loginToken}`
|
|
console.log('url', url)
|
|
try {
|
|
this.videoPlayer = FlvJs.createPlayer({
|
|
type: 'flv',
|
|
url: url,
|
|
isLive: true,
|
|
hasAudio: false
|
|
}, {
|
|
enableWorker: true,
|
|
enableStashBuffer: true,
|
|
})
|
|
this.videoPlayer.attachMediaElement(videoElement)
|
|
this.videoPlayer.load()
|
|
|
|
setTimeout(() => {
|
|
this.videoPlayer.play()
|
|
}, 200)
|
|
} catch (err) {
|
|
console.log(err)
|
|
}
|
|
})
|
|
},
|
|
// 销毁视频监控
|
|
closeVideo() {
|
|
if (this.videoPlayer) {
|
|
// this.videoPlayer.pause()
|
|
this.videoPlayer.unload()
|
|
this.videoPlayer.detachMediaElement()
|
|
this.videoPlayer.destroy()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.status_bar_placeholder {
|
|
height: 105px;
|
|
width: 100%;
|
|
}
|
|
|
|
.status_bar {
|
|
padding: 0 25px;
|
|
width: 100%;
|
|
height: 106px;
|
|
border: 0;
|
|
background-color: transparent;
|
|
position: fixed;
|
|
z-index: 99;
|
|
display: flex;
|
|
justify-content: center;
|
|
flex-direction: space-between;
|
|
align-items: center;
|
|
font-weight: 500;
|
|
font-size: 16px;
|
|
color: #0f274b;
|
|
|
|
.item {
|
|
width: 33%;
|
|
text-align: center;
|
|
color: #fff;
|
|
}
|
|
}
|
|
|
|
.video {
|
|
height: 60vh;
|
|
background-color: #d9d9d9;
|
|
|
|
/deep/ uni-video {
|
|
width: 100%;
|
|
height: 98%;
|
|
// z-index: 1;
|
|
}
|
|
}
|
|
|
|
.action {
|
|
height: 350px;
|
|
transform: translateY(-10px);
|
|
background-color: #fff;
|
|
border-radius: 12px 12px 0px 0px;
|
|
z-index: 9 !important;
|
|
|
|
.action-item {
|
|
margin: 0 auto;
|
|
width: 220px;
|
|
height: 220px;
|
|
background: url('/static/images/imgs/bg-3.png');
|
|
background-size: 100% 100%;
|
|
|
|
// 统一宽高
|
|
.w-h {
|
|
width: 52px;
|
|
height: 52px;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
.top,
|
|
.bottom {
|
|
width: 52px;
|
|
height: 52px;
|
|
margin: 0 auto;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
.center {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
transform: translateY(60%);
|
|
|
|
.circle {
|
|
width: 52px;
|
|
height: 52px;
|
|
border-radius: 50%;
|
|
background: linear-gradient(180deg, #8ebcff 0%, #3888ff 100%);
|
|
box-shadow: 0px 2px 7px 0px rgba(56, 136, 255, 0.5);
|
|
}
|
|
}
|
|
|
|
.bottom {
|
|
transform: translateY(130%);
|
|
}
|
|
}
|
|
}
|
|
|
|
.talk-back {
|
|
width: 52px;
|
|
height: 52px;
|
|
background: linear-gradient(180deg, #8ebcff 0%, #3888ff 100%);
|
|
box-shadow: 0px 2px 7px 0px rgba(56, 136, 255, 0.5);
|
|
border-radius: 50%;
|
|
transform: translateY(-50%);
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
</style>
|