uniapp视频video

需求

  • 播放暂停视频
  • 不允许快进,可以后退
  • 视频后退不会影响最高观看时长,例如看了10分钟,后退5分钟,观看时长依然是600秒
  • 监听退出记录观看时间,下次进来接着看
  • 视频看完积分
javascript 复制代码
<template>
	<view>
		<!-- id:唯一标识,@timeupdate进度条变化的事件,@ended进度条到最后的事件,initial-time指定视频初始播放位置, -->
		<video id="myVideo" style="width: 100%;" @timeupdate="timeUpdate" @ended="ended" :initial-time="initialTime"
				:src="course.videos" :poster="course.img">
		</video>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				initialTime: 0, //初始播放位置
				duration: 0, // 视频时长
				videoContext: '', // 用来存储video对象
				watchTime: 0, // 实际观看时间
				videoRealTime: 0, // 实时播放进度
				course: {
					videos: "https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/%E7%AC%AC1%E8%AE%B2%EF%BC%88uni-app%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC%89-%20DCloud%E5%AE%98%E6%96%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B@20181126-lite.m4v",
					img: 'https://cdn.uviewui.com/uview/swiper/swiper1.png'
				}
			};
		},
		onLoad(options) {
			uni.setNavigationBarTitle({
				title: options.id
			})
			// 调用接口取到该用户上次播放的位置(秒) 
			this.watchTime = 67
			this.initialTime = 67
		},
		onReady() {
			// 视频唯一ID 
			this.videoContext = uni.createVideoContext('myVideo')
		},
		methods: {
			// 监听进度条变化:禁止拖动 e.detail = {currentTime, duration} 。触发频率 250ms 一次
			timeUpdate(e) {
				//视频时长
				this.duration = parseInt(e.detail.duration)
				// 记录用户当前视频进度
				var jumpTime = parseInt(e.detail.currentTime)
				// 判断用户当前视频进度比实际观看时间差别,这里只判断了用户快进
				if (jumpTime - this.watchTime > 1) {
					// 差别过大,调用seek方法跳转到实际观看时间
					this.videoContext.seek(this.watchTime)
				} else {
					this.videoRealTime = parseInt(e.detail.currentTime)
					if (this.videoRealTime > this.watchTime) {
						this.watchTime = this.videoRealTime
					}
				}
			},
			ended() {
				// 用户把进度条拉到最后,但是实际观看时间不够,跳转回去会自动暂停
				if (this.watchTime < this.duration) {
					this.videoContext.play()
				} else {
					console.log('看完了')
				}
			},
			// 监听返回:监听不了ios的左滑返回,目前的采用的解决方案是在onLoad设置禁用左滑
			// onLoad(option) {
			// 	// 单页禁止测滑返回
			// 	// #ifdef APP-PLUS
			// 	let currentWebview = this.$mp.page.$getAppWebview() //获取当前页面的webview对象
			// 	currentWebview.setStyle({
			// 		popGesture: 'none'
			// 	})
			// 	// #endif
			// }
			
			// 监听返回,记录视频的观看时长
			onBackPress(e) {
				//backbutton 是点击物理按键返回,navigateBack是uniapp中的返回(比如左上角的返回箭头)
				console.log('返回', e, this.watchTime, this.duration);
			},
		},
	}
</script> 
相关推荐
VOOHU_20186 小时前
VOOHU沃虎:音频变压器的主要作用是什么?什么情况下必须使用?
网络·物联网·音视频·电子元器件
APIshop7 小时前
小红书笔记视频详情接口深度解析:smallredbook.item_get_video_pro
数据库·笔记·音视频
AI服务老曹9 小时前
【架构深评】深度解析异构计算下的 AI 视频管理平台:从 GB28181 接入到 X86/ARM 容器化部署的全链路实战
人工智能·架构·音视频
YWamy10 小时前
视频会议如何重构智能硬件生态?适配难点与场景落地全解析
音视频
ai产品老杨10 小时前
【架构深析】打破硬件壁垒:支持 X86/ARM 异构计算与源码交付的 GB28181 视频 AI 平台设计实践
arm开发·架构·音视频
美狐美颜SDK开放平台11 小时前
直播App画面发灰、卡顿严重?美颜SDK接入与优化全解析
人工智能·音视频·美颜sdk·短视频美颜sdk
开开心心就好11 小时前
解决打印机共享难题的实用工具
人工智能·vscode·游戏·macos·音视频·语音识别·媒体
ai产品老杨12 小时前
深度解析:基于异构计算架构的 AI 视频中台(支持 GB28181、RTSP、Docker 部署与源码交付)
人工智能·架构·音视频
MY_TEUCK12 小时前
【AI开发】从0到1写一个uni-app Vue3 小程序开发的Skill:用法、流程与踩坑复盘
人工智能·uni-app
做萤石二次开发的哈哈13 小时前
萤石音视频 SDK 对比维度有哪些?
音视频