|
<script setup lang="ts"> |
|
import { onBeforeUnmount, onMounted, ref } from 'vue' |
|
import type PresetPlayer from 'xgplayer' |
|
import Player, { type IPlayerOptions } from 'xgplayer' |
|
|
|
|
|
const props = defineProps({ |
|
src: { |
|
type: String, |
|
default: 'player' |
|
}, |
|
autoplay: { |
|
type: Boolean, |
|
default: false |
|
}, |
|
loop: { |
|
type: Boolean, |
|
default: false |
|
}, |
|
width: { |
|
type: Number, |
|
default: 600 |
|
}, |
|
height: { |
|
type: Number, |
|
default: 337.5 |
|
}, |
|
videoAfterEnd: { |
|
type: String, |
|
default: '' |
|
} |
|
}) |
|
|
|
const player_id = ref(props.src !== '' ? props.src : 'video_player') |
|
|
|
const playerOpts: IPlayerOptions = { |
|
id: player_id.value, |
|
url: props.src, |
|
width: props.width, |
|
height: props.height, |
|
poster: '@/assets/logo.png', |
|
lang: 'zh-cn', |
|
closeVideoClick: false, |
|
videoInit: true, |
|
fluid: false, |
|
autoplay: props.autoplay, |
|
loop: props.loop, |
|
autoplayMuted: false, |
|
pip: false, |
|
closeVideoDblclick: true, |
|
volume: 1, |
|
|
|
|
|
ignores: [ |
|
'volume', |
|
'cssFullScreen', |
|
'fullscreen', |
|
'enter', |
|
'play', |
|
'replay', |
|
'start', |
|
'playbackrate' |
|
] |
|
} |
|
|
|
|
|
let player: Player | null = null |
|
|
|
|
|
onMounted(() => { |
|
player = new Player(playerOpts) |
|
|
|
player.on('ended', () => { |
|
|
|
console.log('视频播放结束') |
|
|
|
if (props.videoAfterEnd !== '') { |
|
playerOpts.autoplay = true |
|
playerOpts.loop = true |
|
playerOpts.autoplayMuted = true |
|
playerOpts.url = props.videoAfterEnd |
|
|
|
|
|
if (player) { |
|
player.destroy() |
|
} |
|
player = null |
|
player = new Player(playerOpts) |
|
} |
|
}) |
|
}) |
|
|
|
onBeforeUnmount(() => { |
|
if (player) { |
|
player.destroy() |
|
player = null |
|
} |
|
}) |
|
</script> |
|
|
|
<template> |
|
<div :id="player_id"></div> |
|
</template> |
|
|