如题,在Vue项目中,真机测试,在IOS设备中使用setTimeout方法延迟调用video标签的play方法,发现延迟1000ms,调用video的play方法可以播放,但>1000ms的时候,需要点击两次才能播放视频,请问这是什么原因?

具体代码如下:

video组件:

<div class="courseDetail--video">
    <div v-show="!stream.showFlag" class="video_layer">
        <div class="video--banner">
            <img :src="courseInfo.picPath" alt />
        </div>
        <div class="video--mask"></div>
        <div
            v-show="stream.type === 'audio' || stream.type === 'video'"
            class="video--startButton"
            @click="playVideoTest"
        >
            <p v-if="stream.type === 'audio'">立即试听</p>
            <p v-else-if="stream.type === 'video'">立即试看</p>
        </div>
    </div>
    <div class="video_content">
        <div v-show="stream.isInadvertisement" class="video_content--adv"></div>
        <template v-if="stream.type === 'audio'">
          <div class="audio_banner">
            <img :src="courseInfo.picPath" alt />
          </div>
          <audio ref="audio" controls="controls" :src="stream.resourceURL">
            <source :src="stream.resourceURL" type="audio/ogg" />
            您的浏览器不支持 audio 元素。
          </audio>
        </template>
        <template v-else-if="stream.type === 'video'">
          <video
            ref="video"
            :poster="courseInfo.picPath"
            controls="controls"
            webkit-playsinline="true"
            playsinline="true"
            x-webkit-airplay="allow"
            x5-video-player-fullscreen="true"
            x5-playsinline="true"
            x5-video-orientation="portraint"
            :src="stream.resourceURL"
          >
            <source :src="stream.resourceURL" type="video/mp4" />
            <p>抱歉,您的浏览器不支持内嵌视频!</p>
          </video>
        </template>
    </div>
</div>
data() {
    return {
      stream: {
        isInadvertisement: false,
        isInPlaying: false,
        showFlag: false,
        currentIndex: 0,
        type: "video",
        resourceURL: "xxxx.mp4"
      }
    }
}

js部分:

playVideoTest() {
  this.stream.showFlag = true;
  setTimeout(() => {
    this.$refs.video.play();
  }, 2000);
},
2019.7.23补充:
通过昨天的测试发现,真的就1000ms是个界值,超过1000ms,1001ms在真机上测试都不能立即调用vidoe的play()方法,有人知道具体的原理吗?

···回复:

自问自答了。

移动端使用video标签,存在两个问题:
1.调用video对象的内部方法不能使用异步方法,不然会失去对视频播放行为的token,会被浏览器认为是非人为操作;
2.调用video对象的play方法的过程不能超过1000ms,不然会被认为非用户行为;

对上述的第一点做个修正:不是不能使用异步方法,而是不能使用async关键字


···回复:

使用vue提供的this.$nextTick()方法比setTimeout方法要好一点。

Scroll Up