一、video
需求是有三个按钮,点击不同的按钮会切换不同的视频,代码如下
<video id="myVideo" src="{{ newVideo[0].videoUrl }}" controls="{{false}}" show-mute-btn="{{false}}" autoplay="{{true}}" initial-time="{{userPlayDuration}}" onPlay="onPlayNew" onPause="onPauseNew" onTimeUpdate="onTimeUpdateNew" onEnded="onEndedNew" />
场景是隐藏视频进度条等一些视频控件,实现点击视频1就暂停再次点击就再次播放视频1,切换到按钮2时保存上一条视频1的播放进度,并自动播放当前视频2,重新点击按钮1,续播视频1,保存视频2进度,大致就这样。
然后我采用了initial-time参数来控制视频开始播放前的指定播放起始时间,通过onTimeUpdate事件监听播放进度并将用户播放进度赋值给userPlayDuration,一套操作下来,实现了场景需求,但后续测试发现,安卓机型下一切正常,ios机型则会出现视频一直转圈加载的情况,就是播放一帧转圈一下。
通过log打印发现,问题原因是onPlay事件一直在被重复调用,安卓则不会发生上述情况,经过长时间排查,发现是initial-time的原因。初步认为是video组件在安卓和ios的运行机制不一致,ios可能是通过监听initial-time的值来执行onPlay事件,由于userPlayDuration在onTimeUpdate事件中一直被赋值,导致ios机型一直在执行onPlay事件。
既然找到了问题,那么后续解决方法也很简单,不在onTimeUpdate事件中做赋值操作,仅进行存值操作,通过my.setStorageSync({key: 'userPlayDuration',data: e.detail.userPlayDuration})进行本地存值,在点击按钮视频播放时通过my.getStorageSync({key:'userPlayDuration'}).data对userPlayDuration进行赋值,至此解决问题