|  | @@ -1,544 +1,607 @@
 | 
	
		
			
				|  |  | -import {
 | 
	
		
			
				|  |  | -  defineComponent,
 | 
	
		
			
				|  |  | -  nextTick,
 | 
	
		
			
				|  |  | -  onMounted,
 | 
	
		
			
				|  |  | -  onUnmounted,
 | 
	
		
			
				|  |  | -  reactive,
 | 
	
		
			
				|  |  | -  toRefs,
 | 
	
		
			
				|  |  | -  watch
 | 
	
		
			
				|  |  | -} from 'vue';
 | 
	
		
			
				|  |  | -import TCPlayer from 'tcplayer.js';
 | 
	
		
			
				|  |  | -import 'tcplayer.js/dist/tcplayer.min.css';
 | 
	
		
			
				|  |  | -// import 'plyr/dist/plyr.css';
 | 
	
		
			
				|  |  | -// import Plyr from 'plyr';
 | 
	
		
			
				|  |  | -import { ref } from 'vue';
 | 
	
		
			
				|  |  | -import styles from './video.module.less';
 | 
	
		
			
				|  |  | -import iconplay from '../image/icon-pause.png';
 | 
	
		
			
				|  |  | -import iconpause from '../image/icon-play.png';
 | 
	
		
			
				|  |  | -// import iconReplay from '../image/icon-replay.png';
 | 
	
		
			
				|  |  | -import iconLoop from '../image/icon-loop.svg';
 | 
	
		
			
				|  |  | -import iconLoopActive from '../image/icon-loop-active.svg';
 | 
	
		
			
				|  |  | -import iconSpeed from '../image/icon-speed.png';
 | 
	
		
			
				|  |  | -import { NSlider } from 'naive-ui';
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -export default defineComponent({
 | 
	
		
			
				|  |  | -  name: 'video-play',
 | 
	
		
			
				|  |  | -  props: {
 | 
	
		
			
				|  |  | -    item: {
 | 
	
		
			
				|  |  | -      type: Object,
 | 
	
		
			
				|  |  | -      default: () => {
 | 
	
		
			
				|  |  | -        return {};
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    showModel: {
 | 
	
		
			
				|  |  | -      type: Boolean,
 | 
	
		
			
				|  |  | -      default: false
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    isEmtry: {
 | 
	
		
			
				|  |  | -      type: Boolean,
 | 
	
		
			
				|  |  | -      default: false
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    imagePos: {
 | 
	
		
			
				|  |  | -      type: String,
 | 
	
		
			
				|  |  | -      default: 'left'
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  emits: [
 | 
	
		
			
				|  |  | -    'canplay',
 | 
	
		
			
				|  |  | -    'pause',
 | 
	
		
			
				|  |  | -    'togglePlay',
 | 
	
		
			
				|  |  | -    'ended',
 | 
	
		
			
				|  |  | -    'reset',
 | 
	
		
			
				|  |  | -    'error',
 | 
	
		
			
				|  |  | -    'close',
 | 
	
		
			
				|  |  | -    'loadedmetadata'
 | 
	
		
			
				|  |  | -  ],
 | 
	
		
			
				|  |  | -  setup(props, { emit, expose }) {
 | 
	
		
			
				|  |  | -    const { item, isEmtry } = toRefs(props);
 | 
	
		
			
				|  |  | -    const videoFroms = reactive({
 | 
	
		
			
				|  |  | -      paused: true,
 | 
	
		
			
				|  |  | -      currentTimeNum: 0,
 | 
	
		
			
				|  |  | -      currentTime: '00:00',
 | 
	
		
			
				|  |  | -      durationNum: 0,
 | 
	
		
			
				|  |  | -      duration: '00:00',
 | 
	
		
			
				|  |  | -      showBar: true,
 | 
	
		
			
				|  |  | -      showAction: true,
 | 
	
		
			
				|  |  | -      loop: false,
 | 
	
		
			
				|  |  | -      speedControl: false,
 | 
	
		
			
				|  |  | -      speedStyle: {
 | 
	
		
			
				|  |  | -        left: '1px'
 | 
	
		
			
				|  |  | -      },
 | 
	
		
			
				|  |  | -      defaultSpeed: 1 // 默认速度
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    const videoRef = ref();
 | 
	
		
			
				|  |  | -    const videoItem = ref();
 | 
	
		
			
				|  |  | -    const videoID = ref('video' + Date.now() + Math.floor(Math.random() * 100));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 对时间进行格式化
 | 
	
		
			
				|  |  | -    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 onPlay = () => {
 | 
	
		
			
				|  |  | -      if (videoItem.value) {
 | 
	
		
			
				|  |  | -        videoItem.value.src(item.value.content);
 | 
	
		
			
				|  |  | -        emit('reset');
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    //
 | 
	
		
			
				|  |  | -    const toggleHideControl = (isShow: false) => {
 | 
	
		
			
				|  |  | -      videoFroms.showBar = isShow;
 | 
	
		
			
				|  |  | -      videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    const onReplay = () => {
 | 
	
		
			
				|  |  | -      videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | -      if (!videoItem.value) return;
 | 
	
		
			
				|  |  | -      videoItem.value.currentTime(0);
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 切换音频播放
 | 
	
		
			
				|  |  | -    const onToggleVideo = (e?: MouseEvent) => {
 | 
	
		
			
				|  |  | -      e?.stopPropagation();
 | 
	
		
			
				|  |  | -      if (videoFroms.paused) {
 | 
	
		
			
				|  |  | -        videoItem.value.play();
 | 
	
		
			
				|  |  | -        videoFroms.paused = false;
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        videoItem.value.pause();
 | 
	
		
			
				|  |  | -        videoFroms.paused = true;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      emit('togglePlay', videoFroms.paused);
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    const videoTimer = null as any;
 | 
	
		
			
				|  |  | -    let videoTimerErrorCount = 0;
 | 
	
		
			
				|  |  | -    const handlePlayVideo = () => {
 | 
	
		
			
				|  |  | -      if (videoTimerErrorCount > 5) {
 | 
	
		
			
				|  |  | -        return;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      clearTimeout(videoTimer);
 | 
	
		
			
				|  |  | -      nextTick(() => {
 | 
	
		
			
				|  |  | -        videoItem.value?.play().catch((err: any) => {
 | 
	
		
			
				|  |  | -          // console.log('🚀 ~ err:', err)
 | 
	
		
			
				|  |  | -          // videoTimer = setTimeout(() => {
 | 
	
		
			
				|  |  | -          //   if (err?.message?.includes('play()')) {
 | 
	
		
			
				|  |  | -          //     // emit('play');
 | 
	
		
			
				|  |  | -          //   }
 | 
	
		
			
				|  |  | -          //   handlePlayVideo();
 | 
	
		
			
				|  |  | -          // }, 1000);
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -      videoTimerErrorCount++;
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    const __init = () => {
 | 
	
		
			
				|  |  | -      if (videoItem.value) {
 | 
	
		
			
				|  |  | -        videoItem.value.poster(props.item.coverImg); // 封面
 | 
	
		
			
				|  |  | -        videoItem.value.src(item.value.content); // url 播放地址
 | 
	
		
			
				|  |  | -        videoItem.value.playbackRate(videoFroms.defaultSpeed);
 | 
	
		
			
				|  |  | -        // 初步加载时
 | 
	
		
			
				|  |  | -        videoItem.value.one('loadedmetadata', () => {
 | 
	
		
			
				|  |  | -          // console.log(' Loading metadata');
 | 
	
		
			
				|  |  | -          videoItem.value.playbackRate(videoFroms.defaultSpeed);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          // 获取时长
 | 
	
		
			
				|  |  | -          videoFroms.duration = timeFormat(
 | 
	
		
			
				|  |  | -            Math.round(videoItem.value.duration())
 | 
	
		
			
				|  |  | -          );
 | 
	
		
			
				|  |  | -          videoFroms.durationNum = videoItem.value.duration();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          emit('canplay');
 | 
	
		
			
				|  |  | -          emit('loadedmetadata', videoItem.value);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          if (item.value.autoPlay && videoItem.value) {
 | 
	
		
			
				|  |  | -            // videoItem.value?.play()
 | 
	
		
			
				|  |  | -            nextTick(() => {
 | 
	
		
			
				|  |  | -              videoTimerErrorCount = 0;
 | 
	
		
			
				|  |  | -              videoItem.value.currentTime(0);
 | 
	
		
			
				|  |  | -              nextTick(handlePlayVideo);
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 视频开始播放
 | 
	
		
			
				|  |  | -        videoItem.value.on('play', () => {
 | 
	
		
			
				|  |  | -          emit('close');
 | 
	
		
			
				|  |  | -          emit('canplay');
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 视频播放时加载
 | 
	
		
			
				|  |  | -        videoItem.value.on('timeupdate', () => {
 | 
	
		
			
				|  |  | -          videoFroms.currentTime = timeFormat(
 | 
	
		
			
				|  |  | -            Math.round(videoItem.value?.currentTime() || 0)
 | 
	
		
			
				|  |  | -          );
 | 
	
		
			
				|  |  | -          videoFroms.currentTimeNum = videoItem.value.currentTime();
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 视频播放结束
 | 
	
		
			
				|  |  | -        videoItem.value.on('ended', () => {
 | 
	
		
			
				|  |  | -          videoFroms.paused = true;
 | 
	
		
			
				|  |  | -          emit('ended');
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        //
 | 
	
		
			
				|  |  | -        videoItem.value.on('pause', () => {
 | 
	
		
			
				|  |  | -          videoFroms.paused = true;
 | 
	
		
			
				|  |  | -          emit('pause');
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        videoItem.value.on('playing', () => {
 | 
	
		
			
				|  |  | -          videoFroms.paused = false;
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        videoItem.value.on('canplay', (e: any) => {
 | 
	
		
			
				|  |  | -          // 获取时长
 | 
	
		
			
				|  |  | -          videoFroms.duration = timeFormat(
 | 
	
		
			
				|  |  | -            Math.round(videoItem.value.duration())
 | 
	
		
			
				|  |  | -          );
 | 
	
		
			
				|  |  | -          videoFroms.durationNum = videoItem.value.duration();
 | 
	
		
			
				|  |  | -          emit('canplay');
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 视频播放异常
 | 
	
		
			
				|  |  | -        videoItem.value.on('error', (e: any) => {
 | 
	
		
			
				|  |  | -          emit('error');
 | 
	
		
			
				|  |  | -          console.log(e, 'error');
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    onMounted(() => {
 | 
	
		
			
				|  |  | -      videoItem.value = TCPlayer(videoID.value, {
 | 
	
		
			
				|  |  | -        appID: '',
 | 
	
		
			
				|  |  | -        controls: false
 | 
	
		
			
				|  |  | -      }); // player-container-id 为播放器容器 ID,必须与 html 中一致
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      __init();
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    const stop = () => {
 | 
	
		
			
				|  |  | -      videoItem.value.currentTime(0);
 | 
	
		
			
				|  |  | -      videoItem.value.pause();
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    const pause = () => {
 | 
	
		
			
				|  |  | -      videoItem.value.pause();
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    onUnmounted(() => {
 | 
	
		
			
				|  |  | -      if (videoItem.value) {
 | 
	
		
			
				|  |  | -        videoItem.value.pause();
 | 
	
		
			
				|  |  | -        videoItem.value.src('');
 | 
	
		
			
				|  |  | -        videoItem.value.dispose();
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    watch(
 | 
	
		
			
				|  |  | -      () => props.item,
 | 
	
		
			
				|  |  | -      () => {
 | 
	
		
			
				|  |  | -        // console.log(item.value, 'value----');
 | 
	
		
			
				|  |  | -        videoItem.value.pause();
 | 
	
		
			
				|  |  | -        videoItem.value.currentTime(0);
 | 
	
		
			
				|  |  | -        if (item.value?.id) {
 | 
	
		
			
				|  |  | -          // videoItem.value.poster(props.item.coverImg); // 封面
 | 
	
		
			
				|  |  | -          // videoItem.value.src(item.value.content); // url 播放地址
 | 
	
		
			
				|  |  | -          __init();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          videoFroms.paused = true;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -    watch(
 | 
	
		
			
				|  |  | -      () => props.showModel,
 | 
	
		
			
				|  |  | -      () => {
 | 
	
		
			
				|  |  | -        // console.log(props.showModel, 'props.showModel')
 | 
	
		
			
				|  |  | -        videoFroms.showAction = props.showModel;
 | 
	
		
			
				|  |  | -        videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -    expose({
 | 
	
		
			
				|  |  | -      onPlay,
 | 
	
		
			
				|  |  | -      stop,
 | 
	
		
			
				|  |  | -      pause,
 | 
	
		
			
				|  |  | -      // changePlayBtn,
 | 
	
		
			
				|  |  | -      toggleHideControl
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    return () => (
 | 
	
		
			
				|  |  | -      <div class={styles.videoWrap}>
 | 
	
		
			
				|  |  | -        <video
 | 
	
		
			
				|  |  | -          style={{ width: '100%', height: '100%' }}
 | 
	
		
			
				|  |  | -          ref={videoRef}
 | 
	
		
			
				|  |  | -          id={videoID.value}
 | 
	
		
			
				|  |  | -          preload="auto"
 | 
	
		
			
				|  |  | -          playsinline
 | 
	
		
			
				|  |  | -          webkit-playsinline
 | 
	
		
			
				|  |  | -          x5-video-player-type="h5"></video>
 | 
	
		
			
				|  |  | -        <div class={styles.videoPop}></div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        <div
 | 
	
		
			
				|  |  | -          class={[
 | 
	
		
			
				|  |  | -            styles.controls,
 | 
	
		
			
				|  |  | -            videoFroms.showAction ? '' : styles.sectionAnimate
 | 
	
		
			
				|  |  | -          ]}
 | 
	
		
			
				|  |  | -          onClick={(e: MouseEvent) => {
 | 
	
		
			
				|  |  | -            e.stopPropagation();
 | 
	
		
			
				|  |  | -            if (videoItem.value.paused()) return;
 | 
	
		
			
				|  |  | -            emit('close');
 | 
	
		
			
				|  |  | -            emit('reset');
 | 
	
		
			
				|  |  | -          }}>
 | 
	
		
			
				|  |  | -          <div class={styles.slider}>
 | 
	
		
			
				|  |  | -            <NSlider
 | 
	
		
			
				|  |  | -              value={videoFroms.currentTimeNum}
 | 
	
		
			
				|  |  | -              step={0.01}
 | 
	
		
			
				|  |  | -              max={videoFroms.durationNum}
 | 
	
		
			
				|  |  | -              tooltip={false}
 | 
	
		
			
				|  |  | -              onUpdate:value={(val: number) => {
 | 
	
		
			
				|  |  | -                videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | -                videoItem.value.currentTime(val);
 | 
	
		
			
				|  |  | -                videoFroms.currentTimeNum = val;
 | 
	
		
			
				|  |  | -                videoFroms.currentTime = timeFormat(Math.round(val || 0));
 | 
	
		
			
				|  |  | -              }}
 | 
	
		
			
				|  |  | -            />
 | 
	
		
			
				|  |  | -          </div>
 | 
	
		
			
				|  |  | -          <div class={styles.tools}>
 | 
	
		
			
				|  |  | -            {props.imagePos === 'right' ? (
 | 
	
		
			
				|  |  | -              <>
 | 
	
		
			
				|  |  | -                <div class={styles.actions}>
 | 
	
		
			
				|  |  | -                  <div class={styles.actionWrap}>
 | 
	
		
			
				|  |  | -                    <div class={styles.time}>
 | 
	
		
			
				|  |  | -                      <div
 | 
	
		
			
				|  |  | -                        class="plyr__time plyr__time--current"
 | 
	
		
			
				|  |  | -                        aria-label="Current time">
 | 
	
		
			
				|  |  | -                        {videoFroms.currentTime}
 | 
	
		
			
				|  |  | -                      </div>
 | 
	
		
			
				|  |  | -                      <span class={styles.line}>/</span>
 | 
	
		
			
				|  |  | -                      <div
 | 
	
		
			
				|  |  | -                        class="plyr__time plyr__time--duration"
 | 
	
		
			
				|  |  | -                        aria-label="Duration">
 | 
	
		
			
				|  |  | -                        {videoFroms.duration}
 | 
	
		
			
				|  |  | -                      </div>
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                </div>
 | 
	
		
			
				|  |  | -                <div class={styles.actions}>
 | 
	
		
			
				|  |  | -                  <div class={styles.actionWrap}>
 | 
	
		
			
				|  |  | -                    <div
 | 
	
		
			
				|  |  | -                      class={styles.actionBtnSpeed}
 | 
	
		
			
				|  |  | -                      onClick={e => {
 | 
	
		
			
				|  |  | -                        e.stopPropagation();
 | 
	
		
			
				|  |  | -                        videoFroms.speedControl = !videoFroms.speedControl;
 | 
	
		
			
				|  |  | -                      }}>
 | 
	
		
			
				|  |  | -                      <img src={iconSpeed} />
 | 
	
		
			
				|  |  | -                      <div
 | 
	
		
			
				|  |  | -                        style={{
 | 
	
		
			
				|  |  | -                          display: videoFroms.speedControl ? 'block' : 'none'
 | 
	
		
			
				|  |  | -                        }}>
 | 
	
		
			
				|  |  | -                        <div
 | 
	
		
			
				|  |  | -                          class={styles.sliderPopup}
 | 
	
		
			
				|  |  | -                          onClick={(e: Event) => {
 | 
	
		
			
				|  |  | -                            e.stopPropagation();
 | 
	
		
			
				|  |  | -                          }}>
 | 
	
		
			
				|  |  | -                          <i
 | 
	
		
			
				|  |  | -                            class={styles.iconAdd}
 | 
	
		
			
				|  |  | -                            onClick={() => {
 | 
	
		
			
				|  |  | -                              if (videoFroms.defaultSpeed >= 1.5) {
 | 
	
		
			
				|  |  | -                                return;
 | 
	
		
			
				|  |  | -                              }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                              if (videoItem.value) {
 | 
	
		
			
				|  |  | -                                videoFroms.defaultSpeed =
 | 
	
		
			
				|  |  | -                                  (videoFroms.defaultSpeed * 10 + 1) / 10;
 | 
	
		
			
				|  |  | -                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | -                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | -                                );
 | 
	
		
			
				|  |  | -                              }
 | 
	
		
			
				|  |  | -                            }}></i>
 | 
	
		
			
				|  |  | -                          <NSlider
 | 
	
		
			
				|  |  | -                            value={videoFroms.defaultSpeed}
 | 
	
		
			
				|  |  | -                            step={0.1}
 | 
	
		
			
				|  |  | -                            max={1.5}
 | 
	
		
			
				|  |  | -                            min={0.5}
 | 
	
		
			
				|  |  | -                            vertical
 | 
	
		
			
				|  |  | -                            tooltip={false}
 | 
	
		
			
				|  |  | -                            onUpdate:value={(val: number) => {
 | 
	
		
			
				|  |  | -                              videoFroms.defaultSpeed = val;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                              if (videoItem.value) {
 | 
	
		
			
				|  |  | -                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | -                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | -                                );
 | 
	
		
			
				|  |  | -                              }
 | 
	
		
			
				|  |  | -                            }}>
 | 
	
		
			
				|  |  | -                            {{
 | 
	
		
			
				|  |  | -                              thumb: () => (
 | 
	
		
			
				|  |  | -                                <div class={styles.sliderPoint}>
 | 
	
		
			
				|  |  | -                                  {videoFroms.defaultSpeed}
 | 
	
		
			
				|  |  | -                                  <span>x</span>
 | 
	
		
			
				|  |  | -                                </div>
 | 
	
		
			
				|  |  | -                              )
 | 
	
		
			
				|  |  | -                            }}
 | 
	
		
			
				|  |  | -                          </NSlider>
 | 
	
		
			
				|  |  | -                          <i
 | 
	
		
			
				|  |  | -                            class={[styles.iconCut]}
 | 
	
		
			
				|  |  | -                            onClick={() => {
 | 
	
		
			
				|  |  | -                              if (videoFroms.defaultSpeed <= 0.5) {
 | 
	
		
			
				|  |  | -                                return;
 | 
	
		
			
				|  |  | -                              }
 | 
	
		
			
				|  |  | -                              if (videoItem.value) {
 | 
	
		
			
				|  |  | -                                videoFroms.defaultSpeed =
 | 
	
		
			
				|  |  | -                                  (videoFroms.defaultSpeed * 10 - 1) / 10;
 | 
	
		
			
				|  |  | -                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | -                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | -                                );
 | 
	
		
			
				|  |  | -                              }
 | 
	
		
			
				|  |  | -                            }}></i>
 | 
	
		
			
				|  |  | -                        </div>
 | 
	
		
			
				|  |  | -                      </div>
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                    <button class={styles.iconReplay} onClick={onReplay}>
 | 
	
		
			
				|  |  | -                      <img src={iconLoop} />
 | 
	
		
			
				|  |  | -                    </button>
 | 
	
		
			
				|  |  | -                    <div
 | 
	
		
			
				|  |  | -                      class={styles.actionBtn}
 | 
	
		
			
				|  |  | -                      onClick={() => {
 | 
	
		
			
				|  |  | -                        videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | -                        onToggleVideo();
 | 
	
		
			
				|  |  | -                      }}>
 | 
	
		
			
				|  |  | -                      {videoFroms.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={() => {
 | 
	
		
			
				|  |  | -                        videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | -                        onToggleVideo();
 | 
	
		
			
				|  |  | -                      }}>
 | 
	
		
			
				|  |  | -                      {videoFroms.paused ? (
 | 
	
		
			
				|  |  | -                        <img class={styles.playIcon} src={iconplay} />
 | 
	
		
			
				|  |  | -                      ) : (
 | 
	
		
			
				|  |  | -                        <img class={styles.playIcon} src={iconpause} />
 | 
	
		
			
				|  |  | -                      )}
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    <button class={styles.iconReplay} onClick={onReplay}>
 | 
	
		
			
				|  |  | -                      <img src={iconLoop} />
 | 
	
		
			
				|  |  | -                    </button>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    <div
 | 
	
		
			
				|  |  | -                      class={styles.actionBtnSpeed}
 | 
	
		
			
				|  |  | -                      onClick={e => {
 | 
	
		
			
				|  |  | -                        e.stopPropagation();
 | 
	
		
			
				|  |  | -                        videoFroms.speedControl = !videoFroms.speedControl;
 | 
	
		
			
				|  |  | -                      }}>
 | 
	
		
			
				|  |  | -                      <img src={iconSpeed} />
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                      <div
 | 
	
		
			
				|  |  | -                        style={{
 | 
	
		
			
				|  |  | -                          display: videoFroms.speedControl ? 'block' : 'none'
 | 
	
		
			
				|  |  | -                        }}>
 | 
	
		
			
				|  |  | -                        <div
 | 
	
		
			
				|  |  | -                          class={styles.sliderPopup}
 | 
	
		
			
				|  |  | -                          onClick={(e: Event) => {
 | 
	
		
			
				|  |  | -                            e.stopPropagation();
 | 
	
		
			
				|  |  | -                          }}>
 | 
	
		
			
				|  |  | -                          <i
 | 
	
		
			
				|  |  | -                            class={styles.iconAdd}
 | 
	
		
			
				|  |  | -                            onClick={() => {
 | 
	
		
			
				|  |  | -                              if (videoFroms.defaultSpeed >= 1.5) {
 | 
	
		
			
				|  |  | -                                return;
 | 
	
		
			
				|  |  | -                              }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                              if (videoItem.value) {
 | 
	
		
			
				|  |  | -                                videoFroms.defaultSpeed =
 | 
	
		
			
				|  |  | -                                  (videoFroms.defaultSpeed * 10 + 1) / 10;
 | 
	
		
			
				|  |  | -                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | -                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | -                                );
 | 
	
		
			
				|  |  | -                              }
 | 
	
		
			
				|  |  | -                            }}></i>
 | 
	
		
			
				|  |  | -                          <NSlider
 | 
	
		
			
				|  |  | -                            value={videoFroms.defaultSpeed}
 | 
	
		
			
				|  |  | -                            step={0.1}
 | 
	
		
			
				|  |  | -                            max={1.5}
 | 
	
		
			
				|  |  | -                            min={0.5}
 | 
	
		
			
				|  |  | -                            vertical
 | 
	
		
			
				|  |  | -                            tooltip={false}
 | 
	
		
			
				|  |  | -                            onUpdate:value={(val: number) => {
 | 
	
		
			
				|  |  | -                              videoFroms.defaultSpeed = val;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                              if (videoItem.value) {
 | 
	
		
			
				|  |  | -                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | -                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | -                                );
 | 
	
		
			
				|  |  | -                              }
 | 
	
		
			
				|  |  | -                            }}>
 | 
	
		
			
				|  |  | -                            {{
 | 
	
		
			
				|  |  | -                              thumb: () => (
 | 
	
		
			
				|  |  | -                                <div class={styles.sliderPoint}>
 | 
	
		
			
				|  |  | -                                  {videoFroms.defaultSpeed}
 | 
	
		
			
				|  |  | -                                  <span>x</span>
 | 
	
		
			
				|  |  | -                                </div>
 | 
	
		
			
				|  |  | -                              )
 | 
	
		
			
				|  |  | -                            }}
 | 
	
		
			
				|  |  | -                          </NSlider>
 | 
	
		
			
				|  |  | -                          <i
 | 
	
		
			
				|  |  | -                            class={[styles.iconCut]}
 | 
	
		
			
				|  |  | -                            onClick={() => {
 | 
	
		
			
				|  |  | -                              if (videoFroms.defaultSpeed <= 0.5) {
 | 
	
		
			
				|  |  | -                                return;
 | 
	
		
			
				|  |  | -                              }
 | 
	
		
			
				|  |  | -                              if (videoItem.value) {
 | 
	
		
			
				|  |  | -                                videoFroms.defaultSpeed =
 | 
	
		
			
				|  |  | -                                  (videoFroms.defaultSpeed * 10 - 1) / 10;
 | 
	
		
			
				|  |  | -                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | -                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | -                                );
 | 
	
		
			
				|  |  | -                              }
 | 
	
		
			
				|  |  | -                            }}></i>
 | 
	
		
			
				|  |  | -                        </div>
 | 
	
		
			
				|  |  | -                      </div>
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                </div>
 | 
	
		
			
				|  |  | -                <div class={styles.actions}>
 | 
	
		
			
				|  |  | -                  <div class={styles.actionWrap}>
 | 
	
		
			
				|  |  | -                    <div class={styles.time}>
 | 
	
		
			
				|  |  | -                      <div
 | 
	
		
			
				|  |  | -                        class="plyr__time plyr__time--current"
 | 
	
		
			
				|  |  | -                        aria-label="Current time">
 | 
	
		
			
				|  |  | -                        {videoFroms.currentTime}
 | 
	
		
			
				|  |  | -                      </div>
 | 
	
		
			
				|  |  | -                      <span class={styles.line}>/</span>
 | 
	
		
			
				|  |  | -                      <div
 | 
	
		
			
				|  |  | -                        class="plyr__time plyr__time--duration"
 | 
	
		
			
				|  |  | -                        aria-label="Duration">
 | 
	
		
			
				|  |  | -                        {videoFroms.duration}
 | 
	
		
			
				|  |  | -                      </div>
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                </div>
 | 
	
		
			
				|  |  | -              </>
 | 
	
		
			
				|  |  | -            )}
 | 
	
		
			
				|  |  | -          </div>
 | 
	
		
			
				|  |  | -        </div>
 | 
	
		
			
				|  |  | -      </div>
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -});
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  defineComponent,
 | 
	
		
			
				|  |  | +  nextTick,
 | 
	
		
			
				|  |  | +  onMounted,
 | 
	
		
			
				|  |  | +  onUnmounted,
 | 
	
		
			
				|  |  | +  reactive,
 | 
	
		
			
				|  |  | +  toRefs,
 | 
	
		
			
				|  |  | +  watch
 | 
	
		
			
				|  |  | +} from 'vue';
 | 
	
		
			
				|  |  | +import TCPlayer from 'tcplayer.js';
 | 
	
		
			
				|  |  | +import 'tcplayer.js/dist/tcplayer.min.css';
 | 
	
		
			
				|  |  | +// import 'plyr/dist/plyr.css';
 | 
	
		
			
				|  |  | +// import Plyr from 'plyr';
 | 
	
		
			
				|  |  | +import { ref } from 'vue';
 | 
	
		
			
				|  |  | +import styles from './video.module.less';
 | 
	
		
			
				|  |  | +import iconplay from '../image/icon-pause.png';
 | 
	
		
			
				|  |  | +import iconpause from '../image/icon-play.png';
 | 
	
		
			
				|  |  | +// import iconReplay from '../image/icon-replay.png';
 | 
	
		
			
				|  |  | +import iconLoop from '../image/icon-loop.svg';
 | 
	
		
			
				|  |  | +import iconLoopActive from '../image/icon-loop-active.svg';
 | 
	
		
			
				|  |  | +import iconSpeed from '../image/icon-speed.png';
 | 
	
		
			
				|  |  | +import { NSlider } from 'naive-ui';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default defineComponent({
 | 
	
		
			
				|  |  | +  name: 'video-play',
 | 
	
		
			
				|  |  | +  props: {
 | 
	
		
			
				|  |  | +    item: {
 | 
	
		
			
				|  |  | +      type: Object,
 | 
	
		
			
				|  |  | +      default: () => {
 | 
	
		
			
				|  |  | +        return {};
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    showModel: {
 | 
	
		
			
				|  |  | +      type: Boolean,
 | 
	
		
			
				|  |  | +      default: false
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    isEmtry: {
 | 
	
		
			
				|  |  | +      type: Boolean,
 | 
	
		
			
				|  |  | +      default: false
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    imagePos: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: 'left'
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  emits: [
 | 
	
		
			
				|  |  | +    'canplay',
 | 
	
		
			
				|  |  | +    'pause',
 | 
	
		
			
				|  |  | +    'togglePlay',
 | 
	
		
			
				|  |  | +    'ended',
 | 
	
		
			
				|  |  | +    'reset',
 | 
	
		
			
				|  |  | +    'error',
 | 
	
		
			
				|  |  | +    'close',
 | 
	
		
			
				|  |  | +    'loadedmetadata'
 | 
	
		
			
				|  |  | +  ],
 | 
	
		
			
				|  |  | +  setup(props, { emit, expose }) {
 | 
	
		
			
				|  |  | +    const { item, isEmtry } = toRefs(props);
 | 
	
		
			
				|  |  | +    const videoFroms = reactive({
 | 
	
		
			
				|  |  | +      paused: true,
 | 
	
		
			
				|  |  | +      speedInKbps: '0 KB/s',
 | 
	
		
			
				|  |  | +      currentTimeNum: 0,
 | 
	
		
			
				|  |  | +      currentTime: '00:00',
 | 
	
		
			
				|  |  | +      durationNum: 0,
 | 
	
		
			
				|  |  | +      duration: '00:00',
 | 
	
		
			
				|  |  | +      showBar: true,
 | 
	
		
			
				|  |  | +      showAction: true,
 | 
	
		
			
				|  |  | +      loop: false,
 | 
	
		
			
				|  |  | +      speedControl: false,
 | 
	
		
			
				|  |  | +      speedStyle: {
 | 
	
		
			
				|  |  | +        left: '1px'
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      defaultSpeed: 1 // 默认速度
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    const videoRef = ref();
 | 
	
		
			
				|  |  | +    const videoItem = ref();
 | 
	
		
			
				|  |  | +    const videoID = ref('video' + Date.now() + Math.floor(Math.random() * 100));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 对时间进行格式化
 | 
	
		
			
				|  |  | +    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 onPlay = () => {
 | 
	
		
			
				|  |  | +      if (videoItem.value) {
 | 
	
		
			
				|  |  | +        videoItem.value.src(item.value.content);
 | 
	
		
			
				|  |  | +        emit('reset');
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    //
 | 
	
		
			
				|  |  | +    const toggleHideControl = (isShow: false) => {
 | 
	
		
			
				|  |  | +      videoFroms.showBar = isShow;
 | 
	
		
			
				|  |  | +      videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const onReplay = () => {
 | 
	
		
			
				|  |  | +      videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | +      if (!videoItem.value) return;
 | 
	
		
			
				|  |  | +      videoItem.value.currentTime(0);
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 切换音频播放
 | 
	
		
			
				|  |  | +    const onToggleVideo = (e?: MouseEvent) => {
 | 
	
		
			
				|  |  | +      e?.stopPropagation();
 | 
	
		
			
				|  |  | +      if (videoFroms.paused) {
 | 
	
		
			
				|  |  | +        videoItem.value.play();
 | 
	
		
			
				|  |  | +        videoFroms.paused = false;
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        videoItem.value.pause();
 | 
	
		
			
				|  |  | +        videoFroms.paused = true;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      emit('togglePlay', videoFroms.paused);
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const videoTimer = null as any;
 | 
	
		
			
				|  |  | +    let videoTimerErrorCount = 0;
 | 
	
		
			
				|  |  | +    const handlePlayVideo = () => {
 | 
	
		
			
				|  |  | +      if (videoTimerErrorCount > 5) {
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      clearTimeout(videoTimer);
 | 
	
		
			
				|  |  | +      nextTick(() => {
 | 
	
		
			
				|  |  | +        videoItem.value?.play().catch((err: any) => {
 | 
	
		
			
				|  |  | +          // console.log('🚀 ~ err:', err)
 | 
	
		
			
				|  |  | +          // videoTimer = setTimeout(() => {
 | 
	
		
			
				|  |  | +          //   if (err?.message?.includes('play()')) {
 | 
	
		
			
				|  |  | +          //     // emit('play');
 | 
	
		
			
				|  |  | +          //   }
 | 
	
		
			
				|  |  | +          //   handlePlayVideo();
 | 
	
		
			
				|  |  | +          // }, 1000);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      videoTimerErrorCount++;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const __init = () => {
 | 
	
		
			
				|  |  | +      if (videoItem.value) {
 | 
	
		
			
				|  |  | +        videoItem.value.poster(props.item.coverImg); // 封面
 | 
	
		
			
				|  |  | +        videoItem.value.src(item.value.content + '?t=4'); // url 播放地址
 | 
	
		
			
				|  |  | +        videoItem.value.playbackRate(videoFroms.defaultSpeed);
 | 
	
		
			
				|  |  | +        // 初步加载时
 | 
	
		
			
				|  |  | +        videoItem.value.one('loadedmetadata', () => {
 | 
	
		
			
				|  |  | +          // console.log(' Loading metadata');
 | 
	
		
			
				|  |  | +          videoItem.value.playbackRate(videoFroms.defaultSpeed);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          // 获取时长
 | 
	
		
			
				|  |  | +          videoFroms.duration = timeFormat(
 | 
	
		
			
				|  |  | +            Math.round(videoItem.value.duration())
 | 
	
		
			
				|  |  | +          );
 | 
	
		
			
				|  |  | +          videoFroms.durationNum = videoItem.value.duration();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          emit('canplay');
 | 
	
		
			
				|  |  | +          emit('loadedmetadata', videoItem.value);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          if (item.value.autoPlay && videoItem.value) {
 | 
	
		
			
				|  |  | +            // videoItem.value?.play()
 | 
	
		
			
				|  |  | +            nextTick(() => {
 | 
	
		
			
				|  |  | +              videoTimerErrorCount = 0;
 | 
	
		
			
				|  |  | +              videoItem.value.currentTime(0);
 | 
	
		
			
				|  |  | +              nextTick(handlePlayVideo);
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 视频开始播放
 | 
	
		
			
				|  |  | +        videoItem.value.on('play', () => {
 | 
	
		
			
				|  |  | +          emit('close');
 | 
	
		
			
				|  |  | +          emit('canplay');
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 视频播放时加载
 | 
	
		
			
				|  |  | +        videoItem.value.on('timeupdate', () => {
 | 
	
		
			
				|  |  | +          videoFroms.currentTime = timeFormat(
 | 
	
		
			
				|  |  | +            Math.round(videoItem.value?.currentTime() || 0)
 | 
	
		
			
				|  |  | +          );
 | 
	
		
			
				|  |  | +          videoFroms.currentTimeNum = videoItem.value.currentTime();
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 视频播放结束
 | 
	
		
			
				|  |  | +        videoItem.value.on('ended', () => {
 | 
	
		
			
				|  |  | +          videoFroms.paused = true;
 | 
	
		
			
				|  |  | +          emit('ended');
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //
 | 
	
		
			
				|  |  | +        videoItem.value.on('pause', () => {
 | 
	
		
			
				|  |  | +          videoFroms.paused = true;
 | 
	
		
			
				|  |  | +          emit('pause');
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        videoItem.value.on('playing', () => {
 | 
	
		
			
				|  |  | +          videoFroms.paused = false;
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        videoItem.value.on('canplay', (e: any) => {
 | 
	
		
			
				|  |  | +          // 获取时长
 | 
	
		
			
				|  |  | +          videoFroms.duration = timeFormat(
 | 
	
		
			
				|  |  | +            Math.round(videoItem.value.duration())
 | 
	
		
			
				|  |  | +          );
 | 
	
		
			
				|  |  | +          videoFroms.durationNum = videoItem.value.duration();
 | 
	
		
			
				|  |  | +          emit('canplay');
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 视频播放异常
 | 
	
		
			
				|  |  | +        videoItem.value.on('error', (e: any) => {
 | 
	
		
			
				|  |  | +          emit('error');
 | 
	
		
			
				|  |  | +          console.log(e, 'error');
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const calculateSpeed = (element: any) => {
 | 
	
		
			
				|  |  | +      let previousBytesLoaded = 0;
 | 
	
		
			
				|  |  | +      let timer: any = null;
 | 
	
		
			
				|  |  | +      let previousTime = Date.now();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      function resetDownloadSpeed() {
 | 
	
		
			
				|  |  | +        timer = setTimeout(() => {
 | 
	
		
			
				|  |  | +          // displayElement.textContent = `视屏下载速度: 0 KB/s`;
 | 
	
		
			
				|  |  | +          videoFroms.speedInKbps = `0 KB/s`;
 | 
	
		
			
				|  |  | +        }, 1000);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      element.addEventListener('progress', () => {
 | 
	
		
			
				|  |  | +        const currentTime = Date.now();
 | 
	
		
			
				|  |  | +        const buffered = element.buffered;
 | 
	
		
			
				|  |  | +        let currentBytesLoaded = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (buffered.length > 0) {
 | 
	
		
			
				|  |  | +          for (let i = 0; i < buffered.length; i++) {
 | 
	
		
			
				|  |  | +            currentBytesLoaded += buffered.end(i) - buffered.start(i);
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          currentBytesLoaded *= element.duration * element.seekable.end(0); // 更精确地近似字节加载量
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        console.log('progress', currentBytesLoaded > previousBytesLoaded);
 | 
	
		
			
				|  |  | +        if (currentBytesLoaded > previousBytesLoaded) {
 | 
	
		
			
				|  |  | +          const timeDiff = (currentTime - previousTime) / 1000; // 时间差转换为秒
 | 
	
		
			
				|  |  | +          const bytesDiff = currentBytesLoaded - previousBytesLoaded; // 字节差值
 | 
	
		
			
				|  |  | +          const speed = bytesDiff / timeDiff; // 字节每秒
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          console.log(timeDiff, bytesDiff, speed);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          const kbps = speed / 1024;
 | 
	
		
			
				|  |  | +          const speedInKbps = kbps.toFixed(2); // 转换为千字节每秒并保留两位小数
 | 
	
		
			
				|  |  | +          if (kbps > 1024) {
 | 
	
		
			
				|  |  | +            videoFroms.speedInKbps = `${Number((kbps / 1024).toFixed(2))} M/s`;
 | 
	
		
			
				|  |  | +          } else {
 | 
	
		
			
				|  |  | +            videoFroms.speedInKbps = `${Number(speedInKbps)} KB/s`;
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          previousBytesLoaded = currentBytesLoaded;
 | 
	
		
			
				|  |  | +          previousTime = currentTime;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          // 如果1秒钟没有返回就重置数据
 | 
	
		
			
				|  |  | +          clearTimeout(timer);
 | 
	
		
			
				|  |  | +          resetDownloadSpeed();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    onMounted(() => {
 | 
	
		
			
				|  |  | +      videoItem.value = TCPlayer(videoID.value, {
 | 
	
		
			
				|  |  | +        appID: '',
 | 
	
		
			
				|  |  | +        controls: false
 | 
	
		
			
				|  |  | +      }); // player-container-id 为播放器容器 ID,必须与 html 中一致
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      __init();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      nextTick(() => {
 | 
	
		
			
				|  |  | +        calculateSpeed(videoRef.value);
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    const stop = () => {
 | 
	
		
			
				|  |  | +      videoItem.value.currentTime(0);
 | 
	
		
			
				|  |  | +      videoItem.value.pause();
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const pause = () => {
 | 
	
		
			
				|  |  | +      videoItem.value.pause();
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    onUnmounted(() => {
 | 
	
		
			
				|  |  | +      if (videoItem.value) {
 | 
	
		
			
				|  |  | +        videoItem.value.pause();
 | 
	
		
			
				|  |  | +        videoItem.value.src('');
 | 
	
		
			
				|  |  | +        videoItem.value.dispose();
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    watch(
 | 
	
		
			
				|  |  | +      () => props.item,
 | 
	
		
			
				|  |  | +      () => {
 | 
	
		
			
				|  |  | +        // console.log(item.value, 'value----');
 | 
	
		
			
				|  |  | +        videoItem.value.pause();
 | 
	
		
			
				|  |  | +        videoItem.value.currentTime(0);
 | 
	
		
			
				|  |  | +        if (item.value?.id) {
 | 
	
		
			
				|  |  | +          // videoItem.value.poster(props.item.coverImg); // 封面
 | 
	
		
			
				|  |  | +          // videoItem.value.src(item.value.content); // url 播放地址
 | 
	
		
			
				|  |  | +          __init();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          videoFroms.paused = true;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +    watch(
 | 
	
		
			
				|  |  | +      () => props.showModel,
 | 
	
		
			
				|  |  | +      () => {
 | 
	
		
			
				|  |  | +        // console.log(props.showModel, 'props.showModel')
 | 
	
		
			
				|  |  | +        videoFroms.showAction = props.showModel;
 | 
	
		
			
				|  |  | +        videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +    expose({
 | 
	
		
			
				|  |  | +      onPlay,
 | 
	
		
			
				|  |  | +      stop,
 | 
	
		
			
				|  |  | +      pause,
 | 
	
		
			
				|  |  | +      // changePlayBtn,
 | 
	
		
			
				|  |  | +      toggleHideControl
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    return () => (
 | 
	
		
			
				|  |  | +      <div class={styles.videoWrap}>
 | 
	
		
			
				|  |  | +        <video
 | 
	
		
			
				|  |  | +          style={{ width: '100%', height: '100%' }}
 | 
	
		
			
				|  |  | +          ref={videoRef}
 | 
	
		
			
				|  |  | +          id={videoID.value}
 | 
	
		
			
				|  |  | +          preload="auto"
 | 
	
		
			
				|  |  | +          playsinline
 | 
	
		
			
				|  |  | +          webkit-playsinline
 | 
	
		
			
				|  |  | +          x5-video-player-type="h5"></video>
 | 
	
		
			
				|  |  | +        <div class={styles.videoPop}></div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <div
 | 
	
		
			
				|  |  | +          class={[
 | 
	
		
			
				|  |  | +            styles.controls,
 | 
	
		
			
				|  |  | +            videoFroms.showAction ? '' : styles.sectionAnimate
 | 
	
		
			
				|  |  | +          ]}
 | 
	
		
			
				|  |  | +          onClick={(e: MouseEvent) => {
 | 
	
		
			
				|  |  | +            e.stopPropagation();
 | 
	
		
			
				|  |  | +            if (videoItem.value.paused()) return;
 | 
	
		
			
				|  |  | +            emit('close');
 | 
	
		
			
				|  |  | +            emit('reset');
 | 
	
		
			
				|  |  | +          }}>
 | 
	
		
			
				|  |  | +          <div class={styles.slider}>
 | 
	
		
			
				|  |  | +            <NSlider
 | 
	
		
			
				|  |  | +              value={videoFroms.currentTimeNum}
 | 
	
		
			
				|  |  | +              step={0.01}
 | 
	
		
			
				|  |  | +              max={videoFroms.durationNum}
 | 
	
		
			
				|  |  | +              tooltip={false}
 | 
	
		
			
				|  |  | +              onUpdate:value={(val: number) => {
 | 
	
		
			
				|  |  | +                videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | +                videoItem.value.currentTime(val);
 | 
	
		
			
				|  |  | +                videoFroms.currentTimeNum = val;
 | 
	
		
			
				|  |  | +                videoFroms.currentTime = timeFormat(Math.round(val || 0));
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +            />
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +          <div class={styles.tools}>
 | 
	
		
			
				|  |  | +            {props.imagePos === 'right' ? (
 | 
	
		
			
				|  |  | +              <>
 | 
	
		
			
				|  |  | +                <div class={styles.actions}>
 | 
	
		
			
				|  |  | +                  <div class={styles.actionWrap}>
 | 
	
		
			
				|  |  | +                    <div class={styles.time}>
 | 
	
		
			
				|  |  | +                      <div
 | 
	
		
			
				|  |  | +                        class="plyr__time plyr__time--current"
 | 
	
		
			
				|  |  | +                        aria-label="Current time">
 | 
	
		
			
				|  |  | +                        {videoFroms.currentTime}
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                      <span class={styles.line}>/</span>
 | 
	
		
			
				|  |  | +                      <div
 | 
	
		
			
				|  |  | +                        class="plyr__time plyr__time--duration"
 | 
	
		
			
				|  |  | +                        aria-label="Duration">
 | 
	
		
			
				|  |  | +                        {videoFroms.duration}
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +                <div class={styles.actions}>
 | 
	
		
			
				|  |  | +                  <div class={styles.actionWrap}>
 | 
	
		
			
				|  |  | +                    <div
 | 
	
		
			
				|  |  | +                      class={styles.actionBtnSpeed}
 | 
	
		
			
				|  |  | +                      onClick={e => {
 | 
	
		
			
				|  |  | +                        e.stopPropagation();
 | 
	
		
			
				|  |  | +                        videoFroms.speedControl = !videoFroms.speedControl;
 | 
	
		
			
				|  |  | +                      }}>
 | 
	
		
			
				|  |  | +                      <img src={iconSpeed} />
 | 
	
		
			
				|  |  | +                      <div
 | 
	
		
			
				|  |  | +                        style={{
 | 
	
		
			
				|  |  | +                          display: videoFroms.speedControl ? 'block' : 'none'
 | 
	
		
			
				|  |  | +                        }}>
 | 
	
		
			
				|  |  | +                        <div
 | 
	
		
			
				|  |  | +                          class={styles.sliderPopup}
 | 
	
		
			
				|  |  | +                          onClick={(e: Event) => {
 | 
	
		
			
				|  |  | +                            e.stopPropagation();
 | 
	
		
			
				|  |  | +                          }}>
 | 
	
		
			
				|  |  | +                          <i
 | 
	
		
			
				|  |  | +                            class={styles.iconAdd}
 | 
	
		
			
				|  |  | +                            onClick={() => {
 | 
	
		
			
				|  |  | +                              if (videoFroms.defaultSpeed >= 1.5) {
 | 
	
		
			
				|  |  | +                                return;
 | 
	
		
			
				|  |  | +                              }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                              if (videoItem.value) {
 | 
	
		
			
				|  |  | +                                videoFroms.defaultSpeed =
 | 
	
		
			
				|  |  | +                                  (videoFroms.defaultSpeed * 10 + 1) / 10;
 | 
	
		
			
				|  |  | +                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | +                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | +                                );
 | 
	
		
			
				|  |  | +                              }
 | 
	
		
			
				|  |  | +                            }}></i>
 | 
	
		
			
				|  |  | +                          <NSlider
 | 
	
		
			
				|  |  | +                            value={videoFroms.defaultSpeed}
 | 
	
		
			
				|  |  | +                            step={0.1}
 | 
	
		
			
				|  |  | +                            max={1.5}
 | 
	
		
			
				|  |  | +                            min={0.5}
 | 
	
		
			
				|  |  | +                            vertical
 | 
	
		
			
				|  |  | +                            tooltip={false}
 | 
	
		
			
				|  |  | +                            onUpdate:value={(val: number) => {
 | 
	
		
			
				|  |  | +                              videoFroms.defaultSpeed = val;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                              if (videoItem.value) {
 | 
	
		
			
				|  |  | +                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | +                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | +                                );
 | 
	
		
			
				|  |  | +                              }
 | 
	
		
			
				|  |  | +                            }}>
 | 
	
		
			
				|  |  | +                            {{
 | 
	
		
			
				|  |  | +                              thumb: () => (
 | 
	
		
			
				|  |  | +                                <div class={styles.sliderPoint}>
 | 
	
		
			
				|  |  | +                                  {videoFroms.defaultSpeed}
 | 
	
		
			
				|  |  | +                                  <span>x</span>
 | 
	
		
			
				|  |  | +                                </div>
 | 
	
		
			
				|  |  | +                              )
 | 
	
		
			
				|  |  | +                            }}
 | 
	
		
			
				|  |  | +                          </NSlider>
 | 
	
		
			
				|  |  | +                          <i
 | 
	
		
			
				|  |  | +                            class={[styles.iconCut]}
 | 
	
		
			
				|  |  | +                            onClick={() => {
 | 
	
		
			
				|  |  | +                              if (videoFroms.defaultSpeed <= 0.5) {
 | 
	
		
			
				|  |  | +                                return;
 | 
	
		
			
				|  |  | +                              }
 | 
	
		
			
				|  |  | +                              if (videoItem.value) {
 | 
	
		
			
				|  |  | +                                videoFroms.defaultSpeed =
 | 
	
		
			
				|  |  | +                                  (videoFroms.defaultSpeed * 10 - 1) / 10;
 | 
	
		
			
				|  |  | +                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | +                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | +                                );
 | 
	
		
			
				|  |  | +                              }
 | 
	
		
			
				|  |  | +                            }}></i>
 | 
	
		
			
				|  |  | +                        </div>
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                    <button class={styles.iconReplay} onClick={onReplay}>
 | 
	
		
			
				|  |  | +                      <img src={iconLoop} />
 | 
	
		
			
				|  |  | +                    </button>
 | 
	
		
			
				|  |  | +                    <div
 | 
	
		
			
				|  |  | +                      class={styles.actionBtn}
 | 
	
		
			
				|  |  | +                      onClick={() => {
 | 
	
		
			
				|  |  | +                        videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | +                        onToggleVideo();
 | 
	
		
			
				|  |  | +                      }}>
 | 
	
		
			
				|  |  | +                      {videoFroms.paused ? (
 | 
	
		
			
				|  |  | +                        <img class={styles.playIcon} src={iconplay} />
 | 
	
		
			
				|  |  | +                      ) : (
 | 
	
		
			
				|  |  | +                        <img class={styles.playIcon} src={iconpause} />
 | 
	
		
			
				|  |  | +                      )}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    <div class={styles.downloadSpeed}>
 | 
	
		
			
				|  |  | +                      {videoFroms.speedInKbps}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </>
 | 
	
		
			
				|  |  | +            ) : (
 | 
	
		
			
				|  |  | +              <>
 | 
	
		
			
				|  |  | +                <div class={styles.actions}>
 | 
	
		
			
				|  |  | +                  <div class={styles.actionWrap}>
 | 
	
		
			
				|  |  | +                    <div
 | 
	
		
			
				|  |  | +                      class={styles.actionBtn}
 | 
	
		
			
				|  |  | +                      onClick={() => {
 | 
	
		
			
				|  |  | +                        videoFroms.speedControl = false;
 | 
	
		
			
				|  |  | +                        onToggleVideo();
 | 
	
		
			
				|  |  | +                      }}>
 | 
	
		
			
				|  |  | +                      {videoFroms.paused ? (
 | 
	
		
			
				|  |  | +                        <img class={styles.playIcon} src={iconplay} />
 | 
	
		
			
				|  |  | +                      ) : (
 | 
	
		
			
				|  |  | +                        <img class={styles.playIcon} src={iconpause} />
 | 
	
		
			
				|  |  | +                      )}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    <button class={styles.iconReplay} onClick={onReplay}>
 | 
	
		
			
				|  |  | +                      <img src={iconLoop} />
 | 
	
		
			
				|  |  | +                    </button>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    <div
 | 
	
		
			
				|  |  | +                      class={styles.actionBtnSpeed}
 | 
	
		
			
				|  |  | +                      onClick={e => {
 | 
	
		
			
				|  |  | +                        e.stopPropagation();
 | 
	
		
			
				|  |  | +                        videoFroms.speedControl = !videoFroms.speedControl;
 | 
	
		
			
				|  |  | +                      }}>
 | 
	
		
			
				|  |  | +                      <img src={iconSpeed} />
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                      <div
 | 
	
		
			
				|  |  | +                        style={{
 | 
	
		
			
				|  |  | +                          display: videoFroms.speedControl ? 'block' : 'none'
 | 
	
		
			
				|  |  | +                        }}>
 | 
	
		
			
				|  |  | +                        <div
 | 
	
		
			
				|  |  | +                          class={styles.sliderPopup}
 | 
	
		
			
				|  |  | +                          onClick={(e: Event) => {
 | 
	
		
			
				|  |  | +                            e.stopPropagation();
 | 
	
		
			
				|  |  | +                          }}>
 | 
	
		
			
				|  |  | +                          <i
 | 
	
		
			
				|  |  | +                            class={styles.iconAdd}
 | 
	
		
			
				|  |  | +                            onClick={() => {
 | 
	
		
			
				|  |  | +                              if (videoFroms.defaultSpeed >= 1.5) {
 | 
	
		
			
				|  |  | +                                return;
 | 
	
		
			
				|  |  | +                              }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                              if (videoItem.value) {
 | 
	
		
			
				|  |  | +                                videoFroms.defaultSpeed =
 | 
	
		
			
				|  |  | +                                  (videoFroms.defaultSpeed * 10 + 1) / 10;
 | 
	
		
			
				|  |  | +                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | +                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | +                                );
 | 
	
		
			
				|  |  | +                              }
 | 
	
		
			
				|  |  | +                            }}></i>
 | 
	
		
			
				|  |  | +                          <NSlider
 | 
	
		
			
				|  |  | +                            value={videoFroms.defaultSpeed}
 | 
	
		
			
				|  |  | +                            step={0.1}
 | 
	
		
			
				|  |  | +                            max={1.5}
 | 
	
		
			
				|  |  | +                            min={0.5}
 | 
	
		
			
				|  |  | +                            vertical
 | 
	
		
			
				|  |  | +                            tooltip={false}
 | 
	
		
			
				|  |  | +                            onUpdate:value={(val: number) => {
 | 
	
		
			
				|  |  | +                              videoFroms.defaultSpeed = val;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                              if (videoItem.value) {
 | 
	
		
			
				|  |  | +                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | +                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | +                                );
 | 
	
		
			
				|  |  | +                              }
 | 
	
		
			
				|  |  | +                            }}>
 | 
	
		
			
				|  |  | +                            {{
 | 
	
		
			
				|  |  | +                              thumb: () => (
 | 
	
		
			
				|  |  | +                                <div class={styles.sliderPoint}>
 | 
	
		
			
				|  |  | +                                  {videoFroms.defaultSpeed}
 | 
	
		
			
				|  |  | +                                  <span>x</span>
 | 
	
		
			
				|  |  | +                                </div>
 | 
	
		
			
				|  |  | +                              )
 | 
	
		
			
				|  |  | +                            }}
 | 
	
		
			
				|  |  | +                          </NSlider>
 | 
	
		
			
				|  |  | +                          <i
 | 
	
		
			
				|  |  | +                            class={[styles.iconCut]}
 | 
	
		
			
				|  |  | +                            onClick={() => {
 | 
	
		
			
				|  |  | +                              if (videoFroms.defaultSpeed <= 0.5) {
 | 
	
		
			
				|  |  | +                                return;
 | 
	
		
			
				|  |  | +                              }
 | 
	
		
			
				|  |  | +                              if (videoItem.value) {
 | 
	
		
			
				|  |  | +                                videoFroms.defaultSpeed =
 | 
	
		
			
				|  |  | +                                  (videoFroms.defaultSpeed * 10 - 1) / 10;
 | 
	
		
			
				|  |  | +                                videoItem.value.playbackRate(
 | 
	
		
			
				|  |  | +                                  videoFroms.defaultSpeed
 | 
	
		
			
				|  |  | +                                );
 | 
	
		
			
				|  |  | +                              }
 | 
	
		
			
				|  |  | +                            }}></i>
 | 
	
		
			
				|  |  | +                        </div>
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    <div class={styles.downloadSpeed}>
 | 
	
		
			
				|  |  | +                      {videoFroms.speedInKbps}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +                <div class={styles.actions}>
 | 
	
		
			
				|  |  | +                  <div class={styles.actionWrap}>
 | 
	
		
			
				|  |  | +                    <div class={styles.time}>
 | 
	
		
			
				|  |  | +                      <div
 | 
	
		
			
				|  |  | +                        class="plyr__time plyr__time--current"
 | 
	
		
			
				|  |  | +                        aria-label="Current time">
 | 
	
		
			
				|  |  | +                        {videoFroms.currentTime}
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                      <span class={styles.line}>/</span>
 | 
	
		
			
				|  |  | +                      <div
 | 
	
		
			
				|  |  | +                        class="plyr__time plyr__time--duration"
 | 
	
		
			
				|  |  | +                        aria-label="Duration">
 | 
	
		
			
				|  |  | +                        {videoFroms.duration}
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </>
 | 
	
		
			
				|  |  | +            )}
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +});
 |