|
@@ -1,15 +1,16 @@
|
|
|
-import { defineComponent, reactive, toRefs, watch } from 'vue';
|
|
|
+import { defineComponent, nextTick, reactive, toRefs, watch } from 'vue';
|
|
|
import { ref } from 'vue';
|
|
|
import styles from './index.module.less';
|
|
|
|
|
|
-import iconLoop from '../../image/icon-loop.png';
|
|
|
-import iconLoopActive from '../../image/icon-loop-active.png';
|
|
|
+import iconLoop from '../../image/icon-loop.svg';
|
|
|
+import iconLoopActive from '../../image/icon-loop-active.svg';
|
|
|
import iconplay from '../../image/icon-play.png';
|
|
|
import iconpause from '../../image/icon-pause.png';
|
|
|
import { NSlider } from 'naive-ui';
|
|
|
import Vudio from 'vudio.js';
|
|
|
import { getSecondRPM } from '@/helpers/utils';
|
|
|
import { Slider } from 'vant';
|
|
|
+import tickMp3 from '../../image/tick.mp3';
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'video-play',
|
|
@@ -45,8 +46,10 @@ export default defineComponent({
|
|
|
currentTime: 0,
|
|
|
duration: 0.1,
|
|
|
loop: false,
|
|
|
+ dragStatus: false, // 是否开始拖动
|
|
|
playState: 'pause' as 'play' | 'pause',
|
|
|
- vudio: null as any
|
|
|
+ vudio: null as any,
|
|
|
+ afterMa3: true
|
|
|
});
|
|
|
const canvasRef: any = ref();
|
|
|
const audioRef: any = ref();
|
|
@@ -130,6 +133,33 @@ export default defineComponent({
|
|
|
data.playState = 'pause';
|
|
|
// emit('ended');
|
|
|
};
|
|
|
+
|
|
|
+ let vudio1 = null;
|
|
|
+ const canvas1: any = ref();
|
|
|
+ const audio1: any = ref();
|
|
|
+ nextTick(() => {
|
|
|
+ const rect = contetRef.value.getBoundingClientRect() || {
|
|
|
+ width: 200,
|
|
|
+ height: 200
|
|
|
+ };
|
|
|
+ vudio1 = new Vudio(audio1.value, canvas1.value, {
|
|
|
+ effect: 'waveform',
|
|
|
+ accuracy: 128,
|
|
|
+ width: rect.width,
|
|
|
+ height: rect.height,
|
|
|
+ waveform: {
|
|
|
+ maxHeight: 160,
|
|
|
+ color: [
|
|
|
+ [0, '#44D1FF'],
|
|
|
+ [0.5, '#44D1FF'],
|
|
|
+ [0.5, '#198CFE'],
|
|
|
+ [1, '#198CFE']
|
|
|
+ ],
|
|
|
+ prettify: false
|
|
|
+ }
|
|
|
+ });
|
|
|
+ vudio1.dance();
|
|
|
+ });
|
|
|
return () => (
|
|
|
<div class={styles.videoWrap}>
|
|
|
<div class={styles.content}>
|
|
@@ -142,6 +172,9 @@ export default defineComponent({
|
|
|
onLoadedmetadata={onLoadedmetadata}
|
|
|
onTimeupdate={() => {
|
|
|
if (data.timer && data.playState === 'pause') return;
|
|
|
+
|
|
|
+ // 开始拖动时也不能更新
|
|
|
+ if (data.dragStatus) return;
|
|
|
data.currentTime = audioRef.value.currentTime;
|
|
|
}}
|
|
|
onError={() => {
|
|
@@ -156,6 +189,13 @@ export default defineComponent({
|
|
|
onEnded={onEnded}
|
|
|
crossorigin="anonymous"
|
|
|
playsinline="false"></audio>
|
|
|
+
|
|
|
+ {data.afterMa3 && (
|
|
|
+ <div class={styles.tempVudio}>
|
|
|
+ <audio ref={audio1} src={tickMp3} />
|
|
|
+ <canvas ref={canvas1}></canvas>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
@@ -171,7 +211,7 @@ export default defineComponent({
|
|
|
<div>{getSecondRPM(data.currentTime)}</div>
|
|
|
<div>{getSecondRPM(data.duration)}</div>
|
|
|
</div>
|
|
|
- <div class={styles.slider}>
|
|
|
+ <div class={[styles.slider]}>
|
|
|
{/* <NSlider
|
|
|
tooltip={false}
|
|
|
step={0.01}
|
|
@@ -188,6 +228,14 @@ export default defineComponent({
|
|
|
onUpdate:modelValue={val => {
|
|
|
handleChangeTime(val);
|
|
|
}}
|
|
|
+ onDragStart={() => {
|
|
|
+ data.dragStatus = true;
|
|
|
+ console.log('onDragStart');
|
|
|
+ }}
|
|
|
+ onDragEnd={() => {
|
|
|
+ data.dragStatus = false;
|
|
|
+ console.log('onDragEnd');
|
|
|
+ }}
|
|
|
/>
|
|
|
</div>
|
|
|
<div class={styles.actions} onClick={() => emit('close')}>
|