238 lines
6.0 KiB
Vue
238 lines
6.0 KiB
Vue
<template>
|
||
<web-view :src="webviewSrc" ref="webview" @onPostMessage="handlePostMessage"
|
||
@message="handlePostMessage"></web-view>
|
||
</template>
|
||
|
||
<script>
|
||
const WEBVIEW_URL = 'https://xaznkj.cn/';
|
||
import {
|
||
ptzdirection,
|
||
ptzscale
|
||
} from '@/apis/modules/sip';
|
||
import {
|
||
startPlay,
|
||
playback,
|
||
closeStream,
|
||
playbackSeek,
|
||
playbackSpeed,
|
||
getDevRecord,
|
||
getPushUrl,
|
||
startBroadcast,
|
||
stopBroadcast,
|
||
startDownloadRecord
|
||
} from '@/apis/modules/player';
|
||
export default {
|
||
name: 'devicePlayerWebView',
|
||
data() {
|
||
return {
|
||
// 设备信息
|
||
deviceId: '',
|
||
channelId: '',
|
||
streamId: '',
|
||
webviewSrc: '',
|
||
playurl: '',
|
||
playing: false,
|
||
queryDate: '',
|
||
videoVod: false,
|
||
vodData: {},
|
||
hisData: [],
|
||
}
|
||
},
|
||
onLoad(option) {
|
||
this.deviceId = option.deviceId;
|
||
this.channelId = option.channelSipId;
|
||
if (option.videoVod) {
|
||
this.videoVod = option.videoVod;
|
||
this.loadDevRecord();
|
||
} else {
|
||
this.sendDevicePush();
|
||
}
|
||
this.webviewSrc = WEBVIEW_URL + 'js/video.html';
|
||
},
|
||
methods: {
|
||
closeWebview() {
|
||
this.webviewSrc = ''; // 清空当前页面
|
||
this.$nextTick(() => {
|
||
this.webviewSrc = WEBVIEW_URL + 'js/video.html';
|
||
});
|
||
},
|
||
cleanPlayer(stop) {
|
||
if (stop) {
|
||
this.stopPlay()
|
||
}
|
||
this.closeWebview();
|
||
this.playing = false
|
||
},
|
||
|
||
//直播控制
|
||
sendDevicePush: function() {
|
||
console.log("通知设备推流1:" + this.deviceId + " : " + this.channelId);
|
||
if (this.channelId) {
|
||
startPlay(this.deviceId, this.channelId).then((response) => {
|
||
console.log("开始播放:" + this.deviceId + " : " + this.channelId);
|
||
let res = response.data;
|
||
this.streamId = res.streamId;
|
||
this.playurl = res.playurl;
|
||
console.log(this.$refs.webview);
|
||
//this.$refs.webview.clear();
|
||
var timestamp = new Date().getTime();
|
||
this.webviewSrc = WEBVIEW_URL + 'js/video.html?data=' +
|
||
encodeURIComponent(JSON.stringify({
|
||
"type": "play",
|
||
"playUrl": this.playurl,
|
||
"time": timestamp
|
||
}));
|
||
this.playing = true;
|
||
});
|
||
}
|
||
},
|
||
stopPlay() {
|
||
if (this.streamId && this.playing) {
|
||
closeStream(this.deviceId, this.channelId, this.streamId).then(res => {
|
||
this.playing = false
|
||
this.streamId = '';
|
||
this.playurl = '';
|
||
})
|
||
}
|
||
},
|
||
handlePtz(arrow) {
|
||
let leftRight = 0;
|
||
let upDown = 0;
|
||
if (arrow === 'left') {
|
||
leftRight = 2;
|
||
} else if (arrow === 'right') {
|
||
leftRight = 1;
|
||
} else if (arrow === 'up') {
|
||
upDown = 1;
|
||
} else if (arrow === 'down') {
|
||
upDown = 2;
|
||
}
|
||
var data = {
|
||
leftRight: leftRight,
|
||
upDown: upDown,
|
||
moveSpeed: 125
|
||
};
|
||
ptzdirection(this.deviceId, this.channelId, data).then(async response => {
|
||
console.log("云台方向控制:" + JSON.stringify(response));
|
||
});
|
||
},
|
||
handlePtzScale(inOut) {
|
||
console.log('云台缩放:' + inOut);
|
||
var data = {
|
||
inOut: inOut,
|
||
scaleSpeed: 30
|
||
}
|
||
ptzscale(this.deviceId, this.channelId, data);
|
||
// 放大/缩小后自动关闭
|
||
setTimeout(() => {
|
||
ptzscale(this.deviceId, this.channelId, {
|
||
inOut: 0,
|
||
scaleSpeed: 30
|
||
})
|
||
}, 800);
|
||
},
|
||
//录像控制
|
||
loadDevRecord() {
|
||
if (this.deviceId && this.channelId) {
|
||
const date = this.queryDate ? new Date(new Date(this.queryDate).toLocaleDateString()).getTime() :
|
||
new Date(new Date().toLocaleDateString()).getTime()
|
||
const start = date / 1000
|
||
const end = Math.floor((date + 24 * 60 * 60 * 1000 - 1) / 1000)
|
||
const query = {
|
||
start: start,
|
||
end: end,
|
||
}
|
||
getDevRecord(this.deviceId, this.channelId, query).then(async (response) => {
|
||
if (response.data != null && response.data.recordItems != null) {
|
||
this.hisData = response.data.recordItems
|
||
const len = this.hisData.length
|
||
if (len > 0) {
|
||
if (this.hisData[0].start < start) {
|
||
this.vodData = {
|
||
start: start,
|
||
end: end,
|
||
base: start
|
||
}
|
||
this.hisData[0].start = start
|
||
} else {
|
||
this.vodData = {
|
||
start: this.hisData[0].start,
|
||
end: end,
|
||
base: start
|
||
}
|
||
}
|
||
this.playback(this.hisData)
|
||
} else {
|
||
this.$u.toast('当前通道没有录像');
|
||
}
|
||
} else {
|
||
this.$u.toast('当前通道没有录像');
|
||
}
|
||
})
|
||
}
|
||
},
|
||
|
||
//录像播放
|
||
playback(playTimes) {
|
||
if (this.deviceId && this.channelId) {
|
||
if (this.streamId) {
|
||
closeStream(this.deviceId, this.channelId, this.streamId).then(res => {
|
||
const query = {
|
||
start: this.vodData.start,
|
||
end: this.vodData.end,
|
||
}
|
||
playback(this.deviceId, this.channelId, query).then(res => {
|
||
this.playing = true
|
||
this.streamId = res.data.streamId
|
||
this.playurl = res.data.playurl
|
||
}).finally(() => {
|
||
this.triggerPlay(playTimes)
|
||
})
|
||
})
|
||
} else {
|
||
const query = {
|
||
start: this.vodData.start,
|
||
end: this.vodData.end,
|
||
}
|
||
playback(this.deviceId, this.channelId, query).then(res => {
|
||
this.playing = true
|
||
this.streamId = res.data.streamId
|
||
this.playurl = res.data.playurl
|
||
}).finally(() => {
|
||
this.triggerPlay(playTimes)
|
||
})
|
||
}
|
||
}
|
||
},
|
||
triggerPlay(playTimes) {
|
||
if (this.playing && this.videoVod) {
|
||
// this.closeWebview();
|
||
this.$nextTick(() => {
|
||
this.webviewSrc = WEBVIEW_URL + 'js/video.html?data=' +
|
||
encodeURIComponent(JSON.stringify({
|
||
"type": "playback",
|
||
"playUrl": this.playurl,
|
||
"playTimes": playTimes
|
||
}));
|
||
});
|
||
}
|
||
},
|
||
seekPlay(s) {
|
||
const curTime = this.vodData.base + s.hour * 3600 + s.min * 60 + s.second
|
||
const seekRange = curTime - this.vodData.start
|
||
if (this.streaminfo.ssrc && this.playing) {
|
||
const query = {
|
||
seek: seekRange,
|
||
}
|
||
}
|
||
},
|
||
onMessage(e) {
|
||
console.log(`【UNILOG】-【onGetH5Message】`);
|
||
console.log('【UNILOG】', JSON.stringify(e.detail.data));
|
||
},
|
||
},
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
</style> |