204 lines
5.7 KiB
Vue
204 lines
5.7 KiB
Vue
<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>
|