| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 | <template>  <view class="ui-video-wrap">    <video      :id="`sVideo${uid}`"      class="radius"      :style="[{ height: height + 'rpx' }]"      :src="src"      controls      object-fit="contain"      :enable-progress-gesture="state.enableProgressGesture"      :initial-time="initialTime"      x5-video-player-type="h5"      x-webkit-airplay="allow"      webkit-playsinline="true"      @error="videoErrorCallback"      @timeupdate="timeupdate"      @play="play"      @pause="pause"      @ended="end"      :poster="poster"      :autoplay="autoplay"    >      <!-- #ifdef APP-PLUS -->      <cover-view :style="{ transform: 'translateX(' + moveX + 'px)' }" />      <!-- #endif -->    </video>  </view></template><script setup>  /**   * 视频组件   *   * @property {Number} uid = 0 						- 当前轮播下标,还用来标记视频Id   * @property {Number} moveX = 0 					- app端轮播滑动距离   * @property {String} height = 300 					- 高度(rpx)   * @property {String} width = 750 					- 宽度(rpx)   * @property {Number} initialTime = 0 				- 指定视频播放位置   * @property {String} videoSize						- 视频大小   * @property {String} src 							- 视频播放地址   * @property {String} poster 						- 视频封面   *   *   */  import { reactive, nextTick, getCurrentInstance } from 'vue';  import sheep from '@/sheep';  const vm = getCurrentInstance();  // 数据  const state = reactive({    // #ifdef APP-PLUS    enableProgressGesture: true, // 手势滑动    // #endif    // #ifndef APP-PLUS    enableProgressGesture: false, // 手势滑动    // #endif    showModal: false, // 弹框  });  // 接收参数  const props = defineProps({    moveX: {      type: [Number],      default: 0,    },    // 下标索引    uid: {      type: [Number, String],      default: 0,    },    // 视频高度    height: {      type: Number,      default: 300,    },    // 视频宽度    width: {      type: Number,      default: 750,    },    // 指定视频初始播放位置,单位为秒(s)    initialTime: {      type: Number,      default: 1,    },    src: {      type: String,      default: '',    },    poster: {      type: String,      default: 'https://img1.baidu.com/it/u=1601695551,235775011&fm=26&fmt=auto',    },    autoplay: {      type: Boolean,      default: false,    }  });  // 事件  const emits = defineEmits(['videoTimeupdate']);  // 播放进度变化时触发,播放进度传给父组件  const timeupdate = (e) => {    emits('videoTimeupdate', e);  };  const videoErrorCallback = (e) => {    console.log('视频错误信息:', e.target.errMsg);  };  // 当开始/继续播放时触发play事件  const play = () => {    console.log('视频开始');  };  // 当暂停播放时触发 pause 事件  const pause = () => {    console.log('视频暂停');  };  // 视频结束触发end 时间  const end = () => {    console.log('视频结束');  };  // 开始播放  const startPlay = () => {    nextTick(() => {      const video = uni.createVideoContext(`sVideo${props.index}`, vm);      video.play();    });  };  //暂停播放  const pausePlay = () => {    const video = uni.createVideoContext(`sVideo${props.index}`, vm);    video.pause();  };  // 播放前拦截  const beforePlay = () => {    uni.getNetworkType({      success: (res) => {        const networkType = res.networkType;        // if (networkType === 'wifi' || networkType === 'ethernet') {        //   startPlay();        // } else {        //   uni.showModal({        //     title: '提示',        //     content: `当前为移动网络,播放视频需消耗手机流量,是否继续播放?${networkType}`,        //     success: (res) => {        //       if (res.confirm) {        //         startPlay();        //       } else {        //         state.isplay = false;        //       }        //     },        //   });        //   sheep.$helper.toast('正在消耗流量播放');        //   startPlay();        // }        startPlay();      },    });  };  // 抛出方法供父组件调用  defineExpose({    pausePlay,  });</script><style lang="scss" scoped>  .radius {    width: 100%;  }  .ui-video-wrap {    display: flex;    align-items: center;    justify-content: center;    .poster-wrap {      position: relative;      width: 100%;      height: 100%;      .poster-image {        width: 100%;        height: 100%;      }      .play-icon {        position: absolute;        left: 50%;        top: 50%;        width: 80rpx;        height: 80rpx;        transform: translate(-50%, -50%);        background-color: rgba($color: #000000, $alpha: 0.1);        border-radius: 50%;      }    }  }</style>
 |