如题,在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()方法,有人知道具体的原理吗?
自问自答了。
查到了一篇文章,和我遇到的问题相似。https://www.jianshu.com/p/2b6...
移动端使用video标签,存在两个问题:
1.调用video对象的内部方法不能使用异步方法,不然会失去对视频播放行为的token,会被浏览器认为是非人为操作;
2.调用video对象的play方法的过程不能超过1000ms,不然会被认为非用户行为;
对上述的第一点做个修正:不是不能使用异步方法,而是不能使用async关键字,具体参见链接