|
@@ -9,10 +9,19 @@ import {
|
|
|
import { ref } from 'vue';
|
|
|
import styles from './video.module.less';
|
|
|
|
|
|
-import iconLoop from '../image/icon-loop.svg';
|
|
|
-import iconLoopActive from '../image/icon-loop-active.svg';
|
|
|
-import iconplay from '../image/icon-play.svg';
|
|
|
-import iconpause from '../image/icon-pause.svg';
|
|
|
+// import iconLoop from '../image/icon-loop.svg';
|
|
|
+// import iconLoopActive from '../image/icon-loop-active.svg';
|
|
|
+// import iconplay from '../image/icon-play.svg';
|
|
|
+// import iconpause from '../image/icon-pause.svg';
|
|
|
+
|
|
|
+import {
|
|
|
+ iconVideoBg,
|
|
|
+ iconLoop,
|
|
|
+ iconLoopActive,
|
|
|
+ iconPlay,
|
|
|
+ iconPause,
|
|
|
+ iconSpeed
|
|
|
+} from '../image/icons.json';
|
|
|
|
|
|
import TCPlayer from 'tcplayer.js';
|
|
|
import 'tcplayer.js/dist/tcplayer.min.css';
|
|
@@ -79,8 +88,14 @@ export default defineComponent({
|
|
|
loop: false,
|
|
|
playState: 'pause' as 'play' | 'pause',
|
|
|
vudio: null as any,
|
|
|
- showBar: true
|
|
|
+ showBar: true,
|
|
|
+ speedControl: false,
|
|
|
+ speedStyle: {
|
|
|
+ left: '1px'
|
|
|
+ },
|
|
|
+ defaultSpeed: 1 // 默认速度
|
|
|
});
|
|
|
+ const speedBtnId = 'speed' + Date.now() + Math.floor(Math.random() * 100);
|
|
|
|
|
|
const forms = reactive({
|
|
|
subjectIds: [],
|
|
@@ -90,6 +105,7 @@ export default defineComponent({
|
|
|
const videoItem = ref();
|
|
|
const videoID = 'video' + Date.now() + Math.floor(Math.random() * 100);
|
|
|
const toggleHideControl = (isShow: boolean) => {
|
|
|
+ data.speedControl = false;
|
|
|
data.showBar = isShow;
|
|
|
};
|
|
|
// const togglePlay = (e: Event) => {
|
|
@@ -100,6 +116,7 @@ export default defineComponent({
|
|
|
// 切换音频播放
|
|
|
const onToggleAudio = (state: 'play' | 'pause') => {
|
|
|
// console.log(state, 'state')
|
|
|
+ data.speedControl = false;
|
|
|
clearTimeout(playTimer);
|
|
|
if (state === 'play') {
|
|
|
playTimer = setTimeout(() => {
|
|
@@ -114,6 +131,7 @@ export default defineComponent({
|
|
|
emit('togglePlay', data.playState);
|
|
|
};
|
|
|
const toggleLoop = () => {
|
|
|
+ data.speedControl = false;
|
|
|
if (!videoItem.value) return;
|
|
|
if (data.loop) {
|
|
|
videoItem.value.loop(false);
|
|
@@ -123,6 +141,7 @@ export default defineComponent({
|
|
|
data.loop = !data.loop;
|
|
|
};
|
|
|
const changePlayBtn = (code: string) => {
|
|
|
+ // data.speedControl = false;
|
|
|
if (code == 'play') {
|
|
|
data.playState = 'play';
|
|
|
} else {
|
|
@@ -272,6 +291,11 @@ export default defineComponent({
|
|
|
autoplay: true
|
|
|
}); // player-container-id 为播放器容器 ID,必须与 html 中一致
|
|
|
__initVideo();
|
|
|
+
|
|
|
+ document.getElementById(speedBtnId)?.addEventListener('click', e => {
|
|
|
+ e.stopPropagation();
|
|
|
+ data.speedControl = !data.speedControl;
|
|
|
+ });
|
|
|
});
|
|
|
|
|
|
watch(
|
|
@@ -358,15 +382,75 @@ export default defineComponent({
|
|
|
e.stopPropagation();
|
|
|
onToggleAudio(data.playState === 'pause' ? 'play' : 'pause');
|
|
|
}}>
|
|
|
- <img src={data.playState === 'pause' ? iconplay : iconpause} />
|
|
|
+ <img src={data.playState === 'pause' ? iconPlay : iconPause} />
|
|
|
</div>
|
|
|
<div class={styles.actionBtn} onClick={toggleLoop}>
|
|
|
<img src={data.loop ? iconLoopActive : iconLoop} />
|
|
|
</div>
|
|
|
+ <div class={styles.actionBtn} id={speedBtnId}>
|
|
|
+ <img src={iconSpeed} />
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<div class={styles.name}>{item.value.name}</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
+
|
|
|
+ <div
|
|
|
+ style={{
|
|
|
+ display: data.speedControl ? 'block' : 'none'
|
|
|
+ }}>
|
|
|
+ <div
|
|
|
+ class={styles.sliderPopup}
|
|
|
+ onClick={(e: Event) => {
|
|
|
+ e.stopPropagation();
|
|
|
+ }}>
|
|
|
+ <i
|
|
|
+ class={styles.iconAdd}
|
|
|
+ onClick={() => {
|
|
|
+ if (data.defaultSpeed >= 1.5) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (videoItem.value) {
|
|
|
+ data.defaultSpeed = (data.defaultSpeed * 10 + 1) / 10;
|
|
|
+ videoItem.value.playbackRate(data.defaultSpeed);
|
|
|
+ }
|
|
|
+ }}></i>
|
|
|
+ <Slider
|
|
|
+ min={0.5}
|
|
|
+ max={1.5}
|
|
|
+ step={0.1}
|
|
|
+ v-model={data.defaultSpeed}
|
|
|
+ vertical
|
|
|
+ barHeight={5}
|
|
|
+ reverse
|
|
|
+ onChange={() => {
|
|
|
+ if (videoItem.value) {
|
|
|
+ videoItem.value.playbackRate(data.defaultSpeed);
|
|
|
+ }
|
|
|
+ }}>
|
|
|
+ {{
|
|
|
+ button: () => (
|
|
|
+ <div class={styles.sliderPoint}>
|
|
|
+ {data.defaultSpeed}
|
|
|
+ <span>x</span>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Slider>
|
|
|
+ <i
|
|
|
+ class={[styles.iconCut]}
|
|
|
+ onClick={() => {
|
|
|
+ if (data.defaultSpeed <= 0.5) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (videoItem.value) {
|
|
|
+ data.defaultSpeed = (data.defaultSpeed * 10 - 1) / 10;
|
|
|
+ videoItem.value.playbackRate(data.defaultSpeed);
|
|
|
+ }
|
|
|
+ }}></i>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
);
|
|
|
}
|