|  | @@ -1,310 +1,313 @@
 | 
	
		
			
				|  |  | -import {
 | 
	
		
			
				|  |  | -  defineComponent,
 | 
	
		
			
				|  |  | -  reactive,
 | 
	
		
			
				|  |  | -  ref,
 | 
	
		
			
				|  |  | -  nextTick,
 | 
	
		
			
				|  |  | -  onMounted,
 | 
	
		
			
				|  |  | -  watch
 | 
	
		
			
				|  |  | -} from 'vue';
 | 
	
		
			
				|  |  | -import styles from './audio.module.less';
 | 
	
		
			
				|  |  | -import iconplay from '../image/icon-pause.png';
 | 
	
		
			
				|  |  | -import iconpause from '../image/icon-play.png';
 | 
	
		
			
				|  |  | -import iconReplay from '../image/icon-replay.png';
 | 
	
		
			
				|  |  | -import { NSlider } from 'naive-ui';
 | 
	
		
			
				|  |  | -import Vudio from 'vudio.js';
 | 
	
		
			
				|  |  | -import tickMp3 from '../image/tick.mp3';
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -export default defineComponent({
 | 
	
		
			
				|  |  | -  name: 'audio-play',
 | 
	
		
			
				|  |  | -  props: {
 | 
	
		
			
				|  |  | -    item: {
 | 
	
		
			
				|  |  | -      type: Object,
 | 
	
		
			
				|  |  | -      default: () => {
 | 
	
		
			
				|  |  | -        return {};
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    activeStatus: {
 | 
	
		
			
				|  |  | -      type: Boolean,
 | 
	
		
			
				|  |  | -      default: false
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    isEmtry: {
 | 
	
		
			
				|  |  | -      type: Boolean,
 | 
	
		
			
				|  |  | -      default: false
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    imagePos: {
 | 
	
		
			
				|  |  | -      type: String,
 | 
	
		
			
				|  |  | -      default: 'left'
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  emits: ['loadedmetadata', 'togglePlay', 'ended', 'reset'],
 | 
	
		
			
				|  |  | -  setup(props, { emit, expose }) {
 | 
	
		
			
				|  |  | -    const audioForms = reactive({
 | 
	
		
			
				|  |  | -      paused: true,
 | 
	
		
			
				|  |  | -      currentTimeNum: 0,
 | 
	
		
			
				|  |  | -      currentTime: '00:00',
 | 
	
		
			
				|  |  | -      durationNum: 0,
 | 
	
		
			
				|  |  | -      duration: '00:00',
 | 
	
		
			
				|  |  | -      showBar: true,
 | 
	
		
			
				|  |  | -      afterMa3: true,
 | 
	
		
			
				|  |  | -      count: 0
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    const canvas: any = ref();
 | 
	
		
			
				|  |  | -    const audio: any = ref();
 | 
	
		
			
				|  |  | -    let vudio: any = null;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 切换音频播放
 | 
	
		
			
				|  |  | -    const onToggleAudio = (e?: any) => {
 | 
	
		
			
				|  |  | -      e?.stopPropagation();
 | 
	
		
			
				|  |  | -      // console.log(audio.value.paused, 'audio.value.paused');
 | 
	
		
			
				|  |  | -      if (audio.value.paused) {
 | 
	
		
			
				|  |  | -        audio.value.play();
 | 
	
		
			
				|  |  | -        audioForms.afterMa3 = false;
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        audio.value?.pause();
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      audioForms.paused = audio.value?.paused;
 | 
	
		
			
				|  |  | -      e?.target?.focus();
 | 
	
		
			
				|  |  | -      emit('togglePlay', audioForms.paused);
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    const onInit = (audio: undefined, canvas: undefined) => {
 | 
	
		
			
				|  |  | -      if (!vudio) {
 | 
	
		
			
				|  |  | -        vudio = new Vudio(audio, canvas, {
 | 
	
		
			
				|  |  | -          effect: 'waveform',
 | 
	
		
			
				|  |  | -          accuracy: 256,
 | 
	
		
			
				|  |  | -          width: 1024,
 | 
	
		
			
				|  |  | -          height: 600,
 | 
	
		
			
				|  |  | -          waveform: {
 | 
	
		
			
				|  |  | -            maxHeight: 200,
 | 
	
		
			
				|  |  | -            color: [
 | 
	
		
			
				|  |  | -              [0, '#44D1FF'],
 | 
	
		
			
				|  |  | -              [0.5, '#44D1FF'],
 | 
	
		
			
				|  |  | -              [0.5, '#198CFE'],
 | 
	
		
			
				|  |  | -              [1, '#198CFE']
 | 
	
		
			
				|  |  | -            ],
 | 
	
		
			
				|  |  | -            prettify: false
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -        vudio.dance();
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 对时间进行格式化
 | 
	
		
			
				|  |  | -    const timeFormat = (num: number) => {
 | 
	
		
			
				|  |  | -      if (num > 0) {
 | 
	
		
			
				|  |  | -        const m = Math.floor(num / 60);
 | 
	
		
			
				|  |  | -        const s = num % 60;
 | 
	
		
			
				|  |  | -        return (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s);
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        return '00:00';
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    //
 | 
	
		
			
				|  |  | -    const toggleHideControl = (isShow: false) => {
 | 
	
		
			
				|  |  | -      audioForms.showBar = isShow;
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    const onReplay = () => {
 | 
	
		
			
				|  |  | -      if (!audio.value) return;
 | 
	
		
			
				|  |  | -      audio.value.currentTime = 0;
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    let vudio1 = null;
 | 
	
		
			
				|  |  | -    const canvas1: any = ref();
 | 
	
		
			
				|  |  | -    const audio1: any = ref();
 | 
	
		
			
				|  |  | -    nextTick(() => {
 | 
	
		
			
				|  |  | -      vudio1 = new Vudio(audio1.value, canvas1.value, {
 | 
	
		
			
				|  |  | -        effect: 'waveform',
 | 
	
		
			
				|  |  | -        accuracy: 256,
 | 
	
		
			
				|  |  | -        width: 1024,
 | 
	
		
			
				|  |  | -        height: 600,
 | 
	
		
			
				|  |  | -        waveform: {
 | 
	
		
			
				|  |  | -          maxHeight: 200,
 | 
	
		
			
				|  |  | -          color: [
 | 
	
		
			
				|  |  | -            [0, '#44D1FF'],
 | 
	
		
			
				|  |  | -            [0.5, '#44D1FF'],
 | 
	
		
			
				|  |  | -            [0.5, '#198CFE'],
 | 
	
		
			
				|  |  | -            [1, '#198CFE']
 | 
	
		
			
				|  |  | -          ],
 | 
	
		
			
				|  |  | -          prettify: false
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -      vudio1.dance();
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    watch(
 | 
	
		
			
				|  |  | -      () => props.activeStatus,
 | 
	
		
			
				|  |  | -      (val: any) => {
 | 
	
		
			
				|  |  | -        // console.log(val, 'val');
 | 
	
		
			
				|  |  | -        audioForms.count = 0;
 | 
	
		
			
				|  |  | -        if (val && props.item.autoPlay) {
 | 
	
		
			
				|  |  | -          vudio = null;
 | 
	
		
			
				|  |  | -          onToggleAudio();
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -          audio.value.pause();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // onMounted(() => {
 | 
	
		
			
				|  |  | -    //   console.log(props.item, 'eeeee');
 | 
	
		
			
				|  |  | -    // });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    expose({
 | 
	
		
			
				|  |  | -      toggleHideControl
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return () => (
 | 
	
		
			
				|  |  | -      <div class={styles.audioWrap}>
 | 
	
		
			
				|  |  | -        <div class={styles.audioContainer}>
 | 
	
		
			
				|  |  | -          <audio
 | 
	
		
			
				|  |  | -            ref={audio}
 | 
	
		
			
				|  |  | -            crossorigin="anonymous"
 | 
	
		
			
				|  |  | -            src={props.item.content + '?time=1'}
 | 
	
		
			
				|  |  | -            onEnded={() => {
 | 
	
		
			
				|  |  | -              audioForms.paused = true;
 | 
	
		
			
				|  |  | -              emit('ended');
 | 
	
		
			
				|  |  | -            }}
 | 
	
		
			
				|  |  | -            onTimeupdate={() => {
 | 
	
		
			
				|  |  | -              audioForms.currentTime = timeFormat(
 | 
	
		
			
				|  |  | -                Math.round(audio.value?.currentTime || 0)
 | 
	
		
			
				|  |  | -              );
 | 
	
		
			
				|  |  | -              audioForms.currentTimeNum = audio.value?.currentTime || 0;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -              if (audioForms.count <= 1) {
 | 
	
		
			
				|  |  | -                audioForms.count += 1;
 | 
	
		
			
				|  |  | -                onInit(audio.value, canvas.value);
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -            }}
 | 
	
		
			
				|  |  | -            onLoadedmetadata={() => {
 | 
	
		
			
				|  |  | -              audioForms.duration = timeFormat(
 | 
	
		
			
				|  |  | -                Math.round(audio.value?.duration)
 | 
	
		
			
				|  |  | -              );
 | 
	
		
			
				|  |  | -              audioForms.durationNum = audio.value?.duration;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -              if (props.item.autoPlay && audio.value && props.activeStatus) {
 | 
	
		
			
				|  |  | -                // audio.value.play();
 | 
	
		
			
				|  |  | -                onToggleAudio();
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -              if (audio.value) {
 | 
	
		
			
				|  |  | -                audio.value.stop = () => {
 | 
	
		
			
				|  |  | -                  audio.value?.pause();
 | 
	
		
			
				|  |  | -                  audioForms.paused = true;
 | 
	
		
			
				|  |  | -                  emit('togglePlay', audioForms.paused);
 | 
	
		
			
				|  |  | -                };
 | 
	
		
			
				|  |  | -                audio.value.onPlay = () => {
 | 
	
		
			
				|  |  | -                  audio.value?.play();
 | 
	
		
			
				|  |  | -                  audioForms.paused = false;
 | 
	
		
			
				|  |  | -                  onInit(audio.value, canvas.value);
 | 
	
		
			
				|  |  | -                  emit('togglePlay', audioForms.paused);
 | 
	
		
			
				|  |  | -                };
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -              emit('loadedmetadata', audio.value);
 | 
	
		
			
				|  |  | -            }}></audio>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          <canvas ref={canvas}></canvas>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          {audioForms.afterMa3 && (
 | 
	
		
			
				|  |  | -            <div class={styles.tempVudio}>
 | 
	
		
			
				|  |  | -              <audio ref={audio1} src={tickMp3} />
 | 
	
		
			
				|  |  | -              <canvas ref={canvas1}></canvas>
 | 
	
		
			
				|  |  | -            </div>
 | 
	
		
			
				|  |  | -          )}
 | 
	
		
			
				|  |  | -        </div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        <div
 | 
	
		
			
				|  |  | -          class={[
 | 
	
		
			
				|  |  | -            styles.controls,
 | 
	
		
			
				|  |  | -            audioForms.showBar ? '' : styles.sectionAnimate
 | 
	
		
			
				|  |  | -          ]}
 | 
	
		
			
				|  |  | -          onClick={(e: MouseEvent) => {
 | 
	
		
			
				|  |  | -            e.stopPropagation();
 | 
	
		
			
				|  |  | -            emit('reset');
 | 
	
		
			
				|  |  | -          }}>
 | 
	
		
			
				|  |  | -          <div class={styles.slider}>
 | 
	
		
			
				|  |  | -            <NSlider
 | 
	
		
			
				|  |  | -              value={audioForms.currentTimeNum}
 | 
	
		
			
				|  |  | -              step={0.01}
 | 
	
		
			
				|  |  | -              max={audioForms.durationNum}
 | 
	
		
			
				|  |  | -              tooltip={false}
 | 
	
		
			
				|  |  | -              onUpdate:value={(val: number) => {
 | 
	
		
			
				|  |  | -                audio.value.currentTime = val;
 | 
	
		
			
				|  |  | -                audioForms.currentTimeNum = val;
 | 
	
		
			
				|  |  | -                audioForms.currentTime = timeFormat(Math.round(val || 0));
 | 
	
		
			
				|  |  | -              }}
 | 
	
		
			
				|  |  | -            />
 | 
	
		
			
				|  |  | -          </div>
 | 
	
		
			
				|  |  | -          <div class={styles.tools}>
 | 
	
		
			
				|  |  | -            {props.imagePos === 'right' ? (
 | 
	
		
			
				|  |  | -              <>
 | 
	
		
			
				|  |  | -                <div class={styles.actions}>
 | 
	
		
			
				|  |  | -                  <div class={styles.time}>
 | 
	
		
			
				|  |  | -                    <div
 | 
	
		
			
				|  |  | -                      class="plyr__time plyr__time--current"
 | 
	
		
			
				|  |  | -                      aria-label="Current time">
 | 
	
		
			
				|  |  | -                      {audioForms.currentTime}
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                    <span class={styles.line}>/</span>
 | 
	
		
			
				|  |  | -                    <div
 | 
	
		
			
				|  |  | -                      class="plyr__time plyr__time--duration"
 | 
	
		
			
				|  |  | -                      aria-label="Duration">
 | 
	
		
			
				|  |  | -                      {audioForms.duration}
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                </div>
 | 
	
		
			
				|  |  | -                <div class={styles.actions}>
 | 
	
		
			
				|  |  | -                  <div class={styles.actionWrap}>
 | 
	
		
			
				|  |  | -                    <button class={styles.iconReplay} onClick={onReplay}>
 | 
	
		
			
				|  |  | -                      <img src={iconReplay} />
 | 
	
		
			
				|  |  | -                    </button>
 | 
	
		
			
				|  |  | -                    <div class={styles.actionBtn} onClick={onToggleAudio}>
 | 
	
		
			
				|  |  | -                      {audioForms.paused ? (
 | 
	
		
			
				|  |  | -                        <img class={styles.playIcon} src={iconplay} />
 | 
	
		
			
				|  |  | -                      ) : (
 | 
	
		
			
				|  |  | -                        <img class={styles.playIcon} src={iconpause} />
 | 
	
		
			
				|  |  | -                      )}
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                </div>
 | 
	
		
			
				|  |  | -              </>
 | 
	
		
			
				|  |  | -            ) : (
 | 
	
		
			
				|  |  | -              <>
 | 
	
		
			
				|  |  | -                <div class={styles.actions}>
 | 
	
		
			
				|  |  | -                  <div class={styles.actionWrap}>
 | 
	
		
			
				|  |  | -                    <div class={styles.actionBtn} onClick={onToggleAudio}>
 | 
	
		
			
				|  |  | -                      {audioForms.paused ? (
 | 
	
		
			
				|  |  | -                        <img class={styles.playIcon} src={iconplay} />
 | 
	
		
			
				|  |  | -                      ) : (
 | 
	
		
			
				|  |  | -                        <img class={styles.playIcon} src={iconpause} />
 | 
	
		
			
				|  |  | -                      )}
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                    <button class={styles.iconReplay} onClick={onReplay}>
 | 
	
		
			
				|  |  | -                      <img src={iconReplay} />
 | 
	
		
			
				|  |  | -                    </button>
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                </div>
 | 
	
		
			
				|  |  | -                <div class={styles.actions}>
 | 
	
		
			
				|  |  | -                  <div class={styles.time}>
 | 
	
		
			
				|  |  | -                    <div
 | 
	
		
			
				|  |  | -                      class="plyr__time plyr__time--current"
 | 
	
		
			
				|  |  | -                      aria-label="Current time">
 | 
	
		
			
				|  |  | -                      {audioForms.currentTime}
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                    <span class={styles.line}>/</span>
 | 
	
		
			
				|  |  | -                    <div
 | 
	
		
			
				|  |  | -                      class="plyr__time plyr__time--duration"
 | 
	
		
			
				|  |  | -                      aria-label="Duration">
 | 
	
		
			
				|  |  | -                      {audioForms.duration}
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                </div>
 | 
	
		
			
				|  |  | -              </>
 | 
	
		
			
				|  |  | -            )}
 | 
	
		
			
				|  |  | -          </div>
 | 
	
		
			
				|  |  | -        </div>
 | 
	
		
			
				|  |  | -      </div>
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -});
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  defineComponent,
 | 
	
		
			
				|  |  | +  reactive,
 | 
	
		
			
				|  |  | +  ref,
 | 
	
		
			
				|  |  | +  nextTick,
 | 
	
		
			
				|  |  | +  onMounted,
 | 
	
		
			
				|  |  | +  watch
 | 
	
		
			
				|  |  | +} from 'vue';
 | 
	
		
			
				|  |  | +import styles from './audio.module.less';
 | 
	
		
			
				|  |  | +import iconplay from '../image/icon-pause.png';
 | 
	
		
			
				|  |  | +import iconpause from '../image/icon-play.png';
 | 
	
		
			
				|  |  | +import iconReplay from '../image/icon-replay.png';
 | 
	
		
			
				|  |  | +import { NSlider } from 'naive-ui';
 | 
	
		
			
				|  |  | +import Vudio from 'vudio.js';
 | 
	
		
			
				|  |  | +import tickMp3 from '../image/tick.mp3';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default defineComponent({
 | 
	
		
			
				|  |  | +  name: 'audio-play',
 | 
	
		
			
				|  |  | +  props: {
 | 
	
		
			
				|  |  | +    item: {
 | 
	
		
			
				|  |  | +      type: Object,
 | 
	
		
			
				|  |  | +      default: () => {
 | 
	
		
			
				|  |  | +        return {};
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    activeStatus: {
 | 
	
		
			
				|  |  | +      type: Boolean,
 | 
	
		
			
				|  |  | +      default: false
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    isEmtry: {
 | 
	
		
			
				|  |  | +      type: Boolean,
 | 
	
		
			
				|  |  | +      default: false
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    imagePos: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: 'left'
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  emits: ['loadedmetadata', 'togglePlay', 'ended', 'reset'],
 | 
	
		
			
				|  |  | +  setup(props, { emit, expose }) {
 | 
	
		
			
				|  |  | +    const audioForms = reactive({
 | 
	
		
			
				|  |  | +      paused: true,
 | 
	
		
			
				|  |  | +      currentTimeNum: 0,
 | 
	
		
			
				|  |  | +      currentTime: '00:00',
 | 
	
		
			
				|  |  | +      durationNum: 0,
 | 
	
		
			
				|  |  | +      duration: '00:00',
 | 
	
		
			
				|  |  | +      showBar: true,
 | 
	
		
			
				|  |  | +      afterMa3: true,
 | 
	
		
			
				|  |  | +      count: 0
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    const canvas: any = ref();
 | 
	
		
			
				|  |  | +    const audio: any = ref();
 | 
	
		
			
				|  |  | +    let vudio: any = null;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 切换音频播放
 | 
	
		
			
				|  |  | +    const onToggleAudio = (e?: any) => {
 | 
	
		
			
				|  |  | +      e?.stopPropagation();
 | 
	
		
			
				|  |  | +      // console.log(audio.value.paused, 'audio.value.paused');
 | 
	
		
			
				|  |  | +      if (audio.value.paused) {
 | 
	
		
			
				|  |  | +        audio.value.play();
 | 
	
		
			
				|  |  | +        audioForms.afterMa3 = false;
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        audio.value?.pause();
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      audioForms.paused = audio.value?.paused;
 | 
	
		
			
				|  |  | +      e?.target?.focus();
 | 
	
		
			
				|  |  | +      emit('togglePlay', audioForms.paused);
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const onInit = (audio: undefined, canvas: undefined) => {
 | 
	
		
			
				|  |  | +      if (!vudio) {
 | 
	
		
			
				|  |  | +        vudio = new Vudio(audio, canvas, {
 | 
	
		
			
				|  |  | +          effect: 'waveform',
 | 
	
		
			
				|  |  | +          accuracy: 256,
 | 
	
		
			
				|  |  | +          width: 1024,
 | 
	
		
			
				|  |  | +          height: 600,
 | 
	
		
			
				|  |  | +          waveform: {
 | 
	
		
			
				|  |  | +            maxHeight: 200,
 | 
	
		
			
				|  |  | +            color: [
 | 
	
		
			
				|  |  | +              [0, '#44D1FF'],
 | 
	
		
			
				|  |  | +              [0.5, '#44D1FF'],
 | 
	
		
			
				|  |  | +              [0.5, '#198CFE'],
 | 
	
		
			
				|  |  | +              [1, '#198CFE']
 | 
	
		
			
				|  |  | +            ],
 | 
	
		
			
				|  |  | +            prettify: false
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        vudio.dance();
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 对时间进行格式化
 | 
	
		
			
				|  |  | +    const timeFormat = (num: number) => {
 | 
	
		
			
				|  |  | +      if (num > 0) {
 | 
	
		
			
				|  |  | +        const m = Math.floor(num / 60);
 | 
	
		
			
				|  |  | +        const s = num % 60;
 | 
	
		
			
				|  |  | +        return (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s);
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        return '00:00';
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    //
 | 
	
		
			
				|  |  | +    const toggleHideControl = (isShow: false) => {
 | 
	
		
			
				|  |  | +      audioForms.showBar = isShow;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const onReplay = () => {
 | 
	
		
			
				|  |  | +      if (!audio.value) return;
 | 
	
		
			
				|  |  | +      audio.value.currentTime = 0;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let vudio1 = null;
 | 
	
		
			
				|  |  | +    const canvas1: any = ref();
 | 
	
		
			
				|  |  | +    const audio1: any = ref();
 | 
	
		
			
				|  |  | +    nextTick(() => {
 | 
	
		
			
				|  |  | +      vudio1 = new Vudio(audio1.value, canvas1.value, {
 | 
	
		
			
				|  |  | +        effect: 'waveform',
 | 
	
		
			
				|  |  | +        accuracy: 256,
 | 
	
		
			
				|  |  | +        width: 1024,
 | 
	
		
			
				|  |  | +        height: 600,
 | 
	
		
			
				|  |  | +        waveform: {
 | 
	
		
			
				|  |  | +          maxHeight: 200,
 | 
	
		
			
				|  |  | +          color: [
 | 
	
		
			
				|  |  | +            [0, '#44D1FF'],
 | 
	
		
			
				|  |  | +            [0.5, '#44D1FF'],
 | 
	
		
			
				|  |  | +            [0.5, '#198CFE'],
 | 
	
		
			
				|  |  | +            [1, '#198CFE']
 | 
	
		
			
				|  |  | +          ],
 | 
	
		
			
				|  |  | +          prettify: false
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      vudio1.dance();
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    watch(
 | 
	
		
			
				|  |  | +      () => props.activeStatus,
 | 
	
		
			
				|  |  | +      (val: any) => {
 | 
	
		
			
				|  |  | +        // console.log(val, 'val');
 | 
	
		
			
				|  |  | +        audioForms.count = 0;
 | 
	
		
			
				|  |  | +        if (val && props.item.autoPlay) {
 | 
	
		
			
				|  |  | +          vudio = null;
 | 
	
		
			
				|  |  | +          onToggleAudio();
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          audio.value.pause();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // onMounted(() => {
 | 
	
		
			
				|  |  | +    //   console.log(props.item, 'eeeee');
 | 
	
		
			
				|  |  | +    // });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    expose({
 | 
	
		
			
				|  |  | +      toggleHideControl
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return () => (
 | 
	
		
			
				|  |  | +      <div class={styles.audioWrap}>
 | 
	
		
			
				|  |  | +        <div class={styles.audioContainer}>
 | 
	
		
			
				|  |  | +          <audio
 | 
	
		
			
				|  |  | +            ref={audio}
 | 
	
		
			
				|  |  | +            crossorigin="anonymous"
 | 
	
		
			
				|  |  | +            src={props.item.content + '?time=1'}
 | 
	
		
			
				|  |  | +            onEnded={() => {
 | 
	
		
			
				|  |  | +              audioForms.paused = true;
 | 
	
		
			
				|  |  | +              emit('ended');
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +            onTimeupdate={() => {
 | 
	
		
			
				|  |  | +              audioForms.currentTime = timeFormat(
 | 
	
		
			
				|  |  | +                Math.round(audio.value?.currentTime || 0)
 | 
	
		
			
				|  |  | +              );
 | 
	
		
			
				|  |  | +              audioForms.currentTimeNum = audio.value?.currentTime || 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              if (audioForms.count <= 1) {
 | 
	
		
			
				|  |  | +                audioForms.count += 1;
 | 
	
		
			
				|  |  | +                onInit(audio.value, canvas.value);
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +            onLoadedmetadata={() => {
 | 
	
		
			
				|  |  | +              audioForms.duration = timeFormat(
 | 
	
		
			
				|  |  | +                Math.round(audio.value?.duration)
 | 
	
		
			
				|  |  | +              );
 | 
	
		
			
				|  |  | +              audioForms.durationNum = audio.value?.duration;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              if (props.item.autoPlay && audio.value && props.activeStatus) {
 | 
	
		
			
				|  |  | +                // audio.value.play();
 | 
	
		
			
				|  |  | +                onToggleAudio();
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +              if (audio.value) {
 | 
	
		
			
				|  |  | +                audio.value.stop = () => {
 | 
	
		
			
				|  |  | +                  audio.value?.pause();
 | 
	
		
			
				|  |  | +                  audioForms.paused = true;
 | 
	
		
			
				|  |  | +                  emit('togglePlay', audioForms.paused);
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +                audio.value.onPlay = () => {
 | 
	
		
			
				|  |  | +                  audio.value?.play();
 | 
	
		
			
				|  |  | +                  audioForms.paused = false;
 | 
	
		
			
				|  |  | +                  onInit(audio.value, canvas.value);
 | 
	
		
			
				|  |  | +                  emit('togglePlay', audioForms.paused);
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              emit('loadedmetadata', audio.value);
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +            onProgress={(e: any) => {
 | 
	
		
			
				|  |  | +              console.log(e, 'loadedmetadata onProgress');
 | 
	
		
			
				|  |  | +            }}></audio>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          <canvas ref={canvas}></canvas>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          {audioForms.afterMa3 && (
 | 
	
		
			
				|  |  | +            <div class={styles.tempVudio}>
 | 
	
		
			
				|  |  | +              <audio ref={audio1} src={tickMp3} />
 | 
	
		
			
				|  |  | +              <canvas ref={canvas1}></canvas>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          )}
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <div
 | 
	
		
			
				|  |  | +          class={[
 | 
	
		
			
				|  |  | +            styles.controls,
 | 
	
		
			
				|  |  | +            audioForms.showBar ? '' : styles.sectionAnimate
 | 
	
		
			
				|  |  | +          ]}
 | 
	
		
			
				|  |  | +          onClick={(e: MouseEvent) => {
 | 
	
		
			
				|  |  | +            e.stopPropagation();
 | 
	
		
			
				|  |  | +            emit('reset');
 | 
	
		
			
				|  |  | +          }}>
 | 
	
		
			
				|  |  | +          <div class={styles.slider}>
 | 
	
		
			
				|  |  | +            <NSlider
 | 
	
		
			
				|  |  | +              value={audioForms.currentTimeNum}
 | 
	
		
			
				|  |  | +              step={0.01}
 | 
	
		
			
				|  |  | +              max={audioForms.durationNum}
 | 
	
		
			
				|  |  | +              tooltip={false}
 | 
	
		
			
				|  |  | +              onUpdate:value={(val: number) => {
 | 
	
		
			
				|  |  | +                audio.value.currentTime = val;
 | 
	
		
			
				|  |  | +                audioForms.currentTimeNum = val;
 | 
	
		
			
				|  |  | +                audioForms.currentTime = timeFormat(Math.round(val || 0));
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +            />
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +          <div class={styles.tools}>
 | 
	
		
			
				|  |  | +            {props.imagePos === 'right' ? (
 | 
	
		
			
				|  |  | +              <>
 | 
	
		
			
				|  |  | +                <div class={styles.actions}>
 | 
	
		
			
				|  |  | +                  <div class={styles.time}>
 | 
	
		
			
				|  |  | +                    <div
 | 
	
		
			
				|  |  | +                      class="plyr__time plyr__time--current"
 | 
	
		
			
				|  |  | +                      aria-label="Current time">
 | 
	
		
			
				|  |  | +                      {audioForms.currentTime}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                    <span class={styles.line}>/</span>
 | 
	
		
			
				|  |  | +                    <div
 | 
	
		
			
				|  |  | +                      class="plyr__time plyr__time--duration"
 | 
	
		
			
				|  |  | +                      aria-label="Duration">
 | 
	
		
			
				|  |  | +                      {audioForms.duration}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +                <div class={styles.actions}>
 | 
	
		
			
				|  |  | +                  <div class={styles.actionWrap}>
 | 
	
		
			
				|  |  | +                    <button class={styles.iconReplay} onClick={onReplay}>
 | 
	
		
			
				|  |  | +                      <img src={iconReplay} />
 | 
	
		
			
				|  |  | +                    </button>
 | 
	
		
			
				|  |  | +                    <div class={styles.actionBtn} onClick={onToggleAudio}>
 | 
	
		
			
				|  |  | +                      {audioForms.paused ? (
 | 
	
		
			
				|  |  | +                        <img class={styles.playIcon} src={iconplay} />
 | 
	
		
			
				|  |  | +                      ) : (
 | 
	
		
			
				|  |  | +                        <img class={styles.playIcon} src={iconpause} />
 | 
	
		
			
				|  |  | +                      )}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </>
 | 
	
		
			
				|  |  | +            ) : (
 | 
	
		
			
				|  |  | +              <>
 | 
	
		
			
				|  |  | +                <div class={styles.actions}>
 | 
	
		
			
				|  |  | +                  <div class={styles.actionWrap}>
 | 
	
		
			
				|  |  | +                    <div class={styles.actionBtn} onClick={onToggleAudio}>
 | 
	
		
			
				|  |  | +                      {audioForms.paused ? (
 | 
	
		
			
				|  |  | +                        <img class={styles.playIcon} src={iconplay} />
 | 
	
		
			
				|  |  | +                      ) : (
 | 
	
		
			
				|  |  | +                        <img class={styles.playIcon} src={iconpause} />
 | 
	
		
			
				|  |  | +                      )}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                    <button class={styles.iconReplay} onClick={onReplay}>
 | 
	
		
			
				|  |  | +                      <img src={iconReplay} />
 | 
	
		
			
				|  |  | +                    </button>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +                <div class={styles.actions}>
 | 
	
		
			
				|  |  | +                  <div class={styles.time}>
 | 
	
		
			
				|  |  | +                    <div
 | 
	
		
			
				|  |  | +                      class="plyr__time plyr__time--current"
 | 
	
		
			
				|  |  | +                      aria-label="Current time">
 | 
	
		
			
				|  |  | +                      {audioForms.currentTime}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                    <span class={styles.line}>/</span>
 | 
	
		
			
				|  |  | +                    <div
 | 
	
		
			
				|  |  | +                      class="plyr__time plyr__time--duration"
 | 
	
		
			
				|  |  | +                      aria-label="Duration">
 | 
	
		
			
				|  |  | +                      {audioForms.duration}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </>
 | 
	
		
			
				|  |  | +            )}
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +});
 |