做了一个涉及音视频的h5页面,做下问题记录
项目简介:h5页面内嵌到原生app中,可以分享(调app原生方法)到微信、朋友圈、qq、qq空间、微博,也可以用任何浏览器打开(不考虑pc)。
1.audio标签在ios上不会预加载,所以音频时长一开始获取不到,搜到一些偏门的方法(body.click一下;audio.play再马上audio.pause;)等,都不好使(可能是特殊情况能用,不建议用)。如果能后台返回时长就让后台返回一下,如果不行就让产品经理妥协吧。
2.用slider做自定义播放器,拖动进度条,更新audio当前时长,松手后进度条会弹回去导致无法拖动到指定位置。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 
 | <van-slider button-size="18px" class="vs" active-color="#2fb5ba" v-model="value" @change="changeProcess" @touchstart.native="isChange=true" @touchend.native="isChange=false" />
 
 
 dom.addEventListener('timeupdate', function () {
 _this.updateProgress(dom);
 }, false);
 
 
 updateProgress(dom) {
 this.currentTime = dom.currentTime
 if(this.isChange) return
 
 var value = dom.currentTime / this.duration || 0;
 this.$set(this, 'value', parseInt(value * 100))
 }
 
 
 changeProcess(e) {
 let dom = document.getElementById('audio')
 dom.currentTime = this.duration * (e/100)
 if(this.isIOS) {
 if(this.n > 0) {
 this.play()
 }
 }else {
 this.play()
 }
 }
 
 | 
3.自定义播放器有个需求,如果一开始未播放,直接拖动进度条,要自动播放,播放按钮变为暂停按钮。对安卓正常,对ios,由于一开始没有加载音频,在拖动进度条后的方法里触发play失败(在click中触发play就可以,可能是ios检测用户手势比较严吧),但是在play()方法中我把播放按钮变为了暂停按钮,导致视觉bug,所以加了个计数器n,播放一次后n++,大于0的时候在改变进度的时候再播放(代码在第二条的代码第23行上下)
4.video标签视频全屏播放及退出全屏问题(需求是点击视频自动全屏播放)。
ios上的video标签播放视频会自动全屏,上边也没发现下载按钮,看了几个苹果手机和ios12及以上版本效果都是一致的。
安卓则需要手动实现全屏:给单独的video标签赋视频链接并调用requestFullscreen()方法全屏(类似f11键)(看了西瓜视频的xgplayer web播放器中也是用的这个方法,心里有了底)。
但问题来了:在三星s9+和荣耀的一款机型上,全屏后点击系统返回键或屏幕返回手势都能退出全屏,留在当前页,但是oppo的手机用屏幕返回手势(还没有返回按键)就直接返回到上一页了
(猜测:各手机厂商针对安卓系统做的ui开发如miui,emui等,会对安卓交互做些调整,安卓本身返回就是返回上一页,只是三星oneui和荣耀系统加了些人性化的判断,如果有webkitfullscreenchange等会加个返回拦截)。
本来以为用户探索一下就可以了(全屏后也有退出全屏按钮),但产品经理不妥协,只能想偏方了 - 跳槽,哦不,跳转页面,返回时记录状态(keep-alive + 自行判断)。跳转到新页面全屏播video,这个video用的西瓜视频的web播放器xgplayer,全屏后点返回就返回上一页了(这个控件三星s9和荣耀也是返回上一页了,不细究了,那么多安卓手机也究不完啊,作为前端也不想在这上面浪费时间,想做更有意义的事)
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | mounted() {
 let dom = document.querySelector('#video')
 dom.addEventListener("webkitfullscreenchange", function(e) {
 let isFullScreen = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen;
 if (isFullScreen) {
 
 this.isFullScreen = true
 } else {
 
 this.isFullScreen = false
 dom.pause()
 dom.style.display = 'none'
 dom.setAttribute('src', '')
 }
 })
 },
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | toFullVideo(videoDom){
 if(videoDom.requestFullscreen){
 return videoDom.requestFullscreen();
 }else if(videoDom.webkitRequestFullScreen){
 return videoDom.webkitRequestFullScreen();
 }else if(videoDom.mozRequestFullScreen){
 return videoDom.mozRequestFullScreen();
 }else{
 return videoDom.msRequestFullscreen();
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | play() {
 const player = new Player({
 el: document.querySelector('#vs'),
 url: url,
 fluid: true,
 rotateFullscreen: true,
 autoplay: true,
 closeVideoTouch: false,
 })
 setTimeout(() => {
 let dom = document.querySelector('.xgplayer-fullscreen')
 dom.click()
 }, 50);
 }
 
 | 
5.由于video标签在不同设备不同浏览器上的样式表现不同,默认样式得不到产品经理的认可,所以统一给video上边放一层元素,作为封面图,点击封面图进行视频播放。安卓的播放在第4条中写了。下面是ios中遇到的问题。ios中原生h5的video标签不会进行preload,封面是黑屏,点击原生标签的controls中的播放按钮,按钮会有个loading效果,但如果为了样式在video上放一个封面图,那video的加载效果就没了,如果视频很大,点击封面图后会等很长时间才播放,会让用户觉得是未响应,所以要有个loading效果