|
@@ -2,8 +2,9 @@ import { defineComponent, nextTick, onMounted, reactive, toRefs, watch } from 'v
|
|
|
import 'plyr/dist/plyr.css'
|
|
|
import Plyr from 'plyr'
|
|
|
import styles from './index.module.less'
|
|
|
+import iconSpeed from '../../image/video-speed1.png'
|
|
|
|
|
|
-import { iconVideoBg, iconLoop, iconLoopActive, iconPlay, iconPause } from '../../image/icons.json'
|
|
|
+import { iconVideoBg, iconLoop, iconLoopActive, iconPlay, iconPause } from '../../image/icons.json'
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'video-play',
|
|
@@ -26,11 +27,15 @@ export default defineComponent({
|
|
|
videoContianerRef: null as unknown as HTMLAudioElement,
|
|
|
videoState: 'pause' as 'init' | 'play' | 'pause',
|
|
|
animationState: 'start' as 'start' | 'end',
|
|
|
- videoItem: null as unknown as Plyr
|
|
|
+ videoItem: null as unknown as Plyr,
|
|
|
+ speedControl: false,
|
|
|
+ defaultSpeed: 1 // 默认速度
|
|
|
})
|
|
|
const controlID = 'v' + Date.now() + Math.floor(Math.random() * 100)
|
|
|
const playBtnId = 'play' + Date.now() + Math.floor(Math.random() * 100)
|
|
|
const loopBtnId = 'loop' + Date.now() + Math.floor(Math.random() * 100)
|
|
|
+ const speedBtnId = 'speed' + Date.now() + Math.floor(Math.random() * 100)
|
|
|
+ const speedPopoverId = 'popover' + Date.now() + Math.floor(Math.random() * 100)
|
|
|
|
|
|
const togglePlay = (e: Event) => {
|
|
|
e.stopPropagation()
|
|
@@ -63,6 +68,33 @@ export default defineComponent({
|
|
|
})
|
|
|
document.getElementById(playBtnId)?.addEventListener('click', togglePlay)
|
|
|
document.getElementById(loopBtnId)?.addEventListener('click', toggleLoop)
|
|
|
+
|
|
|
+ document.getElementById(speedBtnId)?.addEventListener('click', () => {
|
|
|
+ data.speedControl = !data.speedControl
|
|
|
+ // const element = document.getElementById(speedPopoverId)
|
|
|
+ // if (data.speedControl) {
|
|
|
+ // element?.classList.add(styles.active)
|
|
|
+ // } else {
|
|
|
+ // element?.classList.remove(styles.active)
|
|
|
+ // }
|
|
|
+ toggleSpeedControl(data.speedControl)
|
|
|
+ })
|
|
|
+
|
|
|
+ const nodeList = document.querySelectorAll('#' + speedPopoverId + ' .videoPlaySpeedItem')
|
|
|
+ nodeList.forEach((item) => {
|
|
|
+ item?.addEventListener('click', (e) => {
|
|
|
+ nodeList.forEach((child) => {
|
|
|
+ child?.classList.remove('active')
|
|
|
+ })
|
|
|
+ const target: any = e?.target
|
|
|
+ item?.classList.add('active')
|
|
|
+ data.videoItem.speed = target?.dataset.value * 1
|
|
|
+ data.defaultSpeed = target?.dataset.value * 1
|
|
|
+ // 设置完速度之后关闭弹窗
|
|
|
+ toggleSpeedControl(false)
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
setName()
|
|
|
}
|
|
|
const setName = () => {
|
|
@@ -107,6 +139,33 @@ export default defineComponent({
|
|
|
<img class="loop" src="${iconLoop}" />
|
|
|
<img class="loopActive" src="${iconLoopActive}" />
|
|
|
</button>
|
|
|
+ <div style="position: relative">
|
|
|
+ <button id="${speedBtnId}" class="${styles.actionBtn} ${styles.speedBtn}">
|
|
|
+ <img class="loop" src="${iconSpeed}" />
|
|
|
+ </button>
|
|
|
+ <div class="${styles.popoverGroup}" id="${speedPopoverId}">
|
|
|
+ <div class="videoPlaySpeedItem active" data-value="1">
|
|
|
+ <i class="point" data-value="1"></i>
|
|
|
+ <span data-value="1">1倍</span>
|
|
|
+ </div>
|
|
|
+ <div class="videoPlaySpeedItem" data-value="1.25">
|
|
|
+ <i class="point" data-value="1.25"></i>
|
|
|
+ <span data-value="1.25">1.25倍</span>
|
|
|
+ </div>
|
|
|
+ <div class="videoPlaySpeedItem" data-value="1.5">
|
|
|
+ <i class="point" data-value="1.5"></i>
|
|
|
+ <span data-value="1.5">1.5倍</span>
|
|
|
+ </div>
|
|
|
+ <div class="videoPlaySpeedItem" data-value="1.75">
|
|
|
+ <i class="point" data-value="1.75"></i>
|
|
|
+ <span data-value="1.75">1.75倍</span>
|
|
|
+ </div>
|
|
|
+ <div class="videoPlaySpeedItem" data-value="2">
|
|
|
+ <i class="point" data-value="2"></i>
|
|
|
+ <span data-value="2">2倍</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<div id="videoItemName"></div>
|
|
|
</div>
|
|
@@ -127,8 +186,23 @@ export default defineComponent({
|
|
|
})
|
|
|
})
|
|
|
|
|
|
+ const toggleSpeedControl = (isShow: boolean) => {
|
|
|
+ const element = document.getElementById(speedPopoverId)
|
|
|
+ if (isShow) {
|
|
|
+ element?.classList.add(styles.active)
|
|
|
+ data.speedControl = true
|
|
|
+ } else {
|
|
|
+ element?.classList.remove(styles.active)
|
|
|
+ data.speedControl = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
const toggleHideControl = (isShow: boolean) => {
|
|
|
data.videoItem?.toggleControls(isShow)
|
|
|
+
|
|
|
+ if (!isShow) {
|
|
|
+ toggleSpeedControl(isShow)
|
|
|
+ }
|
|
|
}
|
|
|
watch(
|
|
|
() => props.activeModel,
|
|
@@ -141,6 +215,11 @@ export default defineComponent({
|
|
|
() => props.item,
|
|
|
() => {
|
|
|
setName()
|
|
|
+ // 设置视屏播放器的默认速度
|
|
|
+ if (data.videoItem) data.videoItem.speed = data.defaultSpeed || 1
|
|
|
+
|
|
|
+ // 切换的时候隐藏
|
|
|
+ toggleSpeedControl(false)
|
|
|
}
|
|
|
)
|
|
|
let videoTimer = null as any
|
|
@@ -169,6 +248,7 @@ export default defineComponent({
|
|
|
nextTick(() => {
|
|
|
videoErrorTimer = setTimeout(() => {
|
|
|
data.videoContianerRef.src = props.item?.content
|
|
|
+
|
|
|
emit('play')
|
|
|
data.videoContianerRef.load()
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
@@ -178,7 +258,7 @@ export default defineComponent({
|
|
|
videoErrorCount++
|
|
|
}
|
|
|
const getVideoRef = () => {
|
|
|
- return data.videoContianerRef;
|
|
|
+ return data.videoContianerRef
|
|
|
}
|
|
|
expose({
|
|
|
getVideoRef
|
|
@@ -204,7 +284,7 @@ export default defineComponent({
|
|
|
}}
|
|
|
onPlay={() => {
|
|
|
videoErrorCount = 0
|
|
|
- console.log('开始播放')
|
|
|
+ // console.log('开始播放')
|
|
|
data.videoState = 'play'
|
|
|
changePlayBtn('pause')
|
|
|
emit('close')
|
|
@@ -212,13 +292,13 @@ export default defineComponent({
|
|
|
clearTimeout(videoErrorTimer)
|
|
|
}}
|
|
|
onPause={() => {
|
|
|
- console.log('暂停播放')
|
|
|
+ // console.log('暂停播放')
|
|
|
data.videoState = 'pause'
|
|
|
changePlayBtn('play')
|
|
|
emit('pause')
|
|
|
}}
|
|
|
onEnded={() => {
|
|
|
- console.log('播放结束')
|
|
|
+ // console.log('播放结束')
|
|
|
data.videoState = 'pause'
|
|
|
changePlayBtn('play')
|
|
|
emit('ended')
|