Files
rtsp-video-analysis-system/rtsp-vue/src/views/video/device/component/cusPlayer.vue
砂糖 7f07552ecc init
2025-09-26 11:55:38 +08:00

204 lines
5.7 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>
<div style="position: absolute;height: 100%;width: 100%;display: flex;align-items: center;justify-content: center;">
<div class="video" v-show="isPlay" :id="elId"></div>
<div v-show="!isPlay" style="color: #08979C;font-size: 25px;">暂无视频源</div>
</div>
</template>
<script>
import FlvJsPlayer from 'xgplayer-flv.js';
import Player from 'xgplayer';
import { v4 } from 'uuid';
export default {
name: 'CusPlayer',
components: {},
data() {
return {
isPlay: false,
player: null,
elId: ''
};
},
created() {
this.elId = v4(); // 避免key重复
},
mounted() {
var that = this;
document.addEventListener('visibilitychange', function() {
// console.log(document.visibilityState);
// console.log(document.hidden);
if (document.hidden) {
console.log("页面隐藏")
}
});
},
methods: {
createPlayer(url, hasCloseBtn, index) {
if (!url) {
return;
}
if (this.player) {
this.changeVideo(url);
return;
}
this.isPlay = true;
this.player = new FlvJsPlayer({
id: this.elId,
url: url,
// fitVideoSize: 'auto',
fluid: true,
autoplay: true,
isLive: true,
playsinline: false,
screenShot: true,
whitelist: [''],
ignores: ['time'],
closeVideoClick: true,
// errorTips: '<span class="app-error">无视频源</span>',
customConfig: {
isClickPlayBack: false
},
flvOptionalConfig: {
enableWorker: true,
enableStashBuffer: false, //关闭缓存
stashInitialSize: 2048, //缓存大小2m
lazyLoad: false,
lazyLoadMaxDuration: 40 * 60,
autoCleanupSourceBuffer: true,
autoCleanupMaxBackwardDuration: 35 * 60,
autoCleanupMinBackwardDuration: 30 * 60
} //flv.js可选配置项 [flv.js配置](https://github.com/bilibili/flv.js/blob/master/docs/api.md#config)
});
// 自定义播放器按钮
// let divStr =
// '<i class="btn-hover el-icon-camera button-screen-shot" style="font-size: 23px;margin-right: 10px;pointer-events: auto;"></i>' +
// '<i class="btn-hover el-icon-s-tools button-set" style="font-size: 23px;margin-right: 10px;pointer-events: auto;"></i>' +
// '<i class="btn-hover el-icon-video-camera-solid button-history" style="font-size: 23px;margin-right: 10px;pointer-events: auto;"></i>';
let divStr = '<i class="btn-hover el-icon-d-arrow-left button-playback" style="font-size: 23px;pointer-events: auto;"></i>';
let divClose = '<i @click="closePlayer" class="btn-hover el-icon-close app-close-btn-c"></i>';
let util = Player.util;
// let customBtn = util.createDom('div', divStr, {}, 'flex align-center justify-center app-player-button'); //'div', divStr, {}, 'class'
let customBtn = util.createDom(
'div',
divStr,
{ style: 'width: 40px;heigth:40px;position: absolute;right: 155px;top: 7px;' },
'flex align-center justify-center app-player-button'
); //'div', divStr, {}, 'class'
let closeBtn = util.createDom('div', divClose, {}, 'app-close-btn');
let xgControls = this.player.root.querySelector('xg-controls');
let xgError = this.player.root.querySelector('xg-error');
xgControls.appendChild(customBtn);
this.player.root.appendChild(closeBtn);
// let shot = customBtn.querySelector('.button-screen-shot');
// let set = customBtn.querySelector('.button-set');
// let history = customBtn.querySelector('.button-history');
let closeBtnc = closeBtn.querySelector('.app-close-btn-c');
let playback = customBtn.querySelector('.button-playback');
this.player.on('play', () => {});
this.player.on('focus', () => {
if (hasCloseBtn) {
closeBtn.style.display = 'block';
}
});
this.player.on('ended', () => {});
this.player.on('blur', () => {
closeBtn.style.display = 'none';
});
this.player.on('error', () => {});
if (closeBtnc) {
closeBtnc.addEventListener('click', () => {
this.closePlayer();
});
}
// 点击视频时间设置selectIndex
this.player.video.addEventListener('click', () => {
// this.selectIndex = index;
// this.$parent.setSelectIndex(index);
this.$emit('clickPlayer', index);
});
// if (shot) {
// shot.addEventListener('click', () => {
// this.screenShot(index);
// });
// }
// if (set) {
// set.addEventListener('click', () => {
// this.setPlay(index);
// });
// }
// if (history) {
// history.addEventListener('click', () => {
// this.playHistory(index);
// });
// }
},
changeVideo(url) {
this.player.src = url;
},
closePlayer() {
this.isPlay = false;
if (this.player) {
this.player.destroy();
this.player = null;
}
}
},
beforeDestroy() {
if (this.player) {
this.player.destroy();
}
// clearInterval(this.intvBuffer);
console.log('销毁了');
}
// destroyed() {
// if(this.player){
// this.player.destroy();
// }
// }
};
</script>
<style>
.btn-hover:hover {
color: #08979c;
cursor: pointer;
}
.btn-hover {
color: #ffffff;
}
.video {
position: relative !important;
height: 100% !important;
width: 100% !important;
padding-top: 0px !important;
}
.app-close-btn {
position: absolute;
top: 0px;
right: 5px;
z-index: 500;
display: none;
}
.app-close-btn-c {
color: #aaffff;
font-size: 25px;
pointer-events: auto;
z-index: 500;
}
</style>