vue实现自定义H5视频播放器的方法步骤(2)

// 点击播放 & 暂停按钮 clickPlayBtn() { if (this.state.isLoading) return; this.isFirstTouch = false; this.state.playing = !this.state.playing; this.state.isEnd = false; if (this.$video) { // 播放状态 if (this.state.playing) { try { this.$video.play(); this.isPauseTouch = false; // 监听缓存进度 this.$video.addEventListener("progress", e => { this.getLoadTime(); }); // 监听播放进度 this.$video.addEventListener( "timeupdate", throttle(this.getPlayTime, 100, 1) ); // 监听结束 this.$video.addEventListener("ended", e => { // 重置状态 this.state.playing = false; this.state.isEnd = true; this.state.controlBtnShow = true; this.video.displayTime = "00:00"; this.video.progress.current = 0; this.$video.currentTime = 0; }); } catch (e) { // 捕获url异常出现的错误 } } // 停止状态 else { this.isPauseTouch = true; this.$video.pause(); } } },

视频控制条显示和隐藏

这里需要加两个开关; 首次触屏和暂停触屏; 做一下显示处理即可

// 触碰播放区 touchEnterVideo() { if (this.isFirstTouch) return; if (this.hideTimer) { clearTimeout(this.hideTimer); this.hideTimer = null; } this.state.controlBtnShow = true; this.state.controlBarShow = true; }, // 离开播放区 touchLeaveVideo() { if (this.isFirstTouch) return; if (this.hideTimer) { clearTimeout(this.hideTimer); } // 暂停触摸, 不隐藏 if (this.isPauseTouch) { this.state.controlBtnShow = true; this.state.controlBarShow = true; } else { this.hideTimer = setTimeout(() => { this.state.controlBarShow = false; // 加载中只显示loading if (this.state.isLoading) { this.state.controlBtnShow = true; } else { this.state.controlBtnShow = false; } this.hideTimer = null; }, 3000); } },

视频错误处理和等待处理

这里错误直接用error事件, 加载中用stalled事件来监听视频阻塞状态,等待数据加载用的waiting事件; 显示对应的loading动画即可

// loading动画 @keyframes rotate { 0% { transform: rotate(0deg); } 50% { transform: rotate(180deg); } 100% { transform: rotate(360deg); } } .loader { width: 58px; height: 58px; background: rgba(15, 16, 17, 0.3); border-radius: 50%; position: relative; .ball-clip-rotate { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); > div { width: 15px; height: 15px; border-radius: 100%; margin: 2px; animation-fill-mode: both; border: 2px solid #fff; border-bottom-color: transparent; height: 26px; width: 26px; background: transparent; display: inline-block; animation: rotate 0.75s 0s linear infinite; } } }

播放时间设置

基本就是video对象的currentTime和duration这两个属性; 这里注意下视频如果没有设置预加载属性preload的话,在video元素初始化的时候是获取不到duration的...那你只能在播放的时候去拿了.

// 获取播放时间 getPlayTime() { const percent = this.$video.currentTime / this.$video.duration; this.video.progress.current = Math.round( this.video.progress.width * percent ); // 赋值时长 this.video.totalTime = timeParse(this.$video.duration); this.video.displayTime = timeParse(this.$video.currentTime); }, // 获取缓存时间 getLoadTime() { // console.log('缓存了...',this.$video.buffered.end(0)); this.video.loaded = (this.$video.buffered.end(0) / this.$video.duration) * 100; },

手动滑动进度条控制

这里直接用touch事件即可; 注意touchend中使用e.changedTouches;因为当手指离开屏幕,touches和targetTouches中对应的元素会同时移除,而changedTouches仍然会存在元素。

touches: 当前屏幕上所有触摸点的列表;

targetTouches: 当前对象上所有触摸点的列表;

changedTouches: 涉及当前(引发)事件的触摸点的列表

// 手动调节播放进度 moveStart(e) {}, moveIng(e) { // console.log("触摸中..."); let currentX = e.targetTouches[0].pageX; let offsetX = currentX - this.progressBar.pos.left; // 边界检测 if (offsetX <= 0) { offsetX = 0 } if (offsetX >= this.video.progress.width) { offsetX = this.video.progress.width } this.video.progress.current = offsetX; let percent = this.video.progress.current / this.video.progress.width; this.$video.duration && this.setPlayTime(percent, this.$video.duration) }, moveEnd(e) { // console.log("触摸结束..."); let currentX = e.changedTouches[0].pageX; let offsetX = currentX - this.progressBar.pos.left; this.video.progress.current = offsetX; // 这里的offsetX都是正数 let percent = offsetX / this.video.progress.width; this.$video.duration && this.setPlayTime(percent, this.$video.duration) }, // 设置手动播放时间 setPlayTime(percent, totalTime) { this.$video.currentTime = Math.floor(percent * totalTime); },

全屏功能

这个功能在手机上会有写兼容性问题...有待完善

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a8ae179e6daadd516909eace1b33a862.html