Uniapp video标签autoplay不生效问题(进入页面瞬间)

该博客探讨了uniapp中video组件在H5和App端使用autoplay属性时遇到的问题。由于浏览器限制,H5端无法自动播放视频,但可以通过添加muted属性实现静音播放。作者提出了两种解决方案:一是不加muted属性,让用户手动播放;二是添加muted属性并提供静音图标供用户切换声音。对于App端,autoplay属性则正常工作。博客还展示了如何使用条件编译处理跨端兼容问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

uniapp video原生控件autoplay属性

如果是在h5端,走的是浏览器,浏览器不支持进入页面就播放视频,谷歌、火狐之类的都不支持,但是推出可以静音自动播放视频,例如

<video :id="item.id" :src="item.url" :loop="loop" :autoplay="auto_play"  :enable-progress-gesture="false" :controls="controls" @play="playing(item.id)" @click="playorpause(item.id)"></video>

这样很明显是不能自动播放视频的,但是要是给video标签加上muted属性就可以自动播放,例如

<video :id="item.id" :src="item.url" :loop="loop" :muted="muted" :autoplay="auto_play"  :enable-progress-gesture="false" :controls="controls" @play="playing(item.id)" @click="playorpause(item.id)"></video>

亲测好使。

但是问题又来了,静音播放肯定顶不住,既然人家浏览器有要求,那就只能找折中的办法

1,不加muted属性,进入页面让用户点击播放视频(不建议)
2,加上muted属性,进入页面给一个静音图标,然后点击静音图标让视频有声音(推荐)

还有,如果不用h5端,直接用app端打开的话,autoplay属性还是可以的

这样的话就要解析代码走的是h5端还是app端,那就需要了解跨端兼容的问题了。

条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。
写法:以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。

  1. #ifdef:if defined 仅在某平台存在
  2. #ifndef:if not defined 除了某平台均存在
  3. %PLATFORM%:平台名称
    html中:
<!-- #ifdef APP-PLUS -->
		<view class="next_app">
			<view class="video_item" v-for="item in videoList" :key="item.id" :item-id="item.id">
				<view class="video_item_video">
					<video :id="item.id" :src="item.url" :loop="loop"  :autoplay="true"  :enable-progress-gesture="false" :controls="controls"></video>
				</view>
			</view>
		</view>
		<!-- #endif -->

js中:

// #ifdef H5 || MP-WEIXIN
			playorpause(e){
				//视频暂停播放
				var video_=e
				this.videoContext=uni.createVideoContext(video_)
				
				if(this.index==0){
					if(this.play===true){
						this.videoContext.play()
						this.play=false
					}else{
						this.videoContext.pause()
						this.play=true
					}
				}else{
					if(this.play===false){
						this.videoContext.play()
						this.play=true
					}else{
						this.videoContext.pause()
						this.play=false
					}
				}
				
			},
			changeItem(e){
				//视频滑动
				let changeId=this.videoList[e.detail.current].id
				let videoContentid = uni.createVideoContext(changeId);
				videoContentid.seek(0)
				videoContentid.play()
				this.play=true
				this.muted=false
				this.index++
			},
			playing(e) {
				let currentId =  e; // 获取当前视频id
				this.videoContent = uni.createVideoContext(currentId);
				let trailer = this.videoList;
				trailer.forEach(function(item, index) { // 获取json对象并遍历, 停止非当前视频
					if (item.url != null && item.url != "") {
						let temp = item.id;
						if (temp != currentId) {
							uni.createVideoContext(temp).pause(); //暂停视频播放事件
						}
					}
				})
				// this.mutedFalse()
				
			},
			atuo(){
				//首个视频自动播放
				var that=this
				if(this.index===0){
					this.auto_play=true
				}
			},
			mutedFalse(){
				this.muted=false
			},
			Like(){
				this.islike=1
			},
			Dislike(){
				this.islike=0
			}
			// #endif
### 实现阿里云人脸识别打卡功能 #### API调用准备 为了在 UniApp 中集成阿里云的人脸识别打卡功能,需先完成阿里云服务端的相关配置工作。创建并激活阿里云账号后,在控制台开通相应服务,获取访问密钥(AccessKey ID 和 AccessKey Secret),这些信息将在后续接口请求中作为身份验证凭证使用[^1]。 #### 权限设置 对于涉及敏感操作的应用程序来说,安全性和隐私保护至关重要。因此,在启动任何开发活动之前,应确保已按照官方文档指示妥善设置了应用的安全策略。特别是针对跨域资源共享(CORS),如果是在 H5 环境下部署,则可能需要调整服务器端响应头来允许特定源发起 HTTP 请求;而对于小程序环境而言,则要遵循各自平台关于网络请求的规定,比如微信小程序就需要前往微信公众平台后台,“开发管理”下的“开发设置”,增加合法的 `request` 域名列表项,如 `https://api-cn.face.tbsite.net` 或者其他由阿里云提供的正式地址[^2]。 #### 前端页面开发最佳实践 ##### 页面布局设计 构建简洁直观的操作界面有助于提升用户体验感。考虑到不同设备屏幕尺寸差异较大,建议采用弹性盒子模型(Flexbox)或栅格系统(Grid Layout)来进行组件排列组合,使得各元素能够灵活适应各种视窗大小变化。同时,利用条件编译特性为特定平台定制专属样式,例如通过 `<template v-if="isWeixin">...</template>` 判断当前运行环境是否属于微信客户端,并据此加载不同的资源文件。 ##### 功能模块实现 - **初始化 SDK** 完成上述准备工作之后,就可以着手引入阿里云提供的 JavaScript SDK 至项目当中了。通常情况下只需下载最新版本压缩包解压至本地目录,再经由 script 标签将其路径指向 index.html 文件内即可生效。当然也可以借助 npm/yarn 工具安装依赖库,这样便于后期维护升级。 ```javascript import * as AliyunFace from 'aliyun-face-sdk'; const client = new AliyunFace.Client({ accessKeyId: 'your-access-key-id', accessKeySecret: 'your-access-key-secret' }); ``` - **开启摄像头权限** 当用户首次打开应用程序时,默认状态下浏览器不会授予其访问硬件设施的权利,所以必须主动弹框询问授权情况。可以监听事件触发时机,一旦检测到点击按钮动作即刻执行 navigator.mediaDevices.getUserMedia 方法申请许可。 ```javascript async function openCamera() { try { await navigator.mediaDevices.getUserMedia({ video: true }); console.log('Camera opened successfully'); } catch (err) { alert(`Failed to start camera: ${err.message}`); } } ``` - **捕获图像帧** 成功取得视频流对象 reference 后,下一步就是截取其中某一时刻的画面片段用于分析处理。这里推荐选用 HTMLCanvasElement 对象配合 drawImage 函数绘制静态图片,随后转换成 base64 编码字符串形式传递给云端算法引擎做进一步解析判断。 ```html <!-- Camera preview area --> <video id="camera-preview" autoplay></video> <canvas style="display:none;" id="hidden-canvas"></canvas> <script type="text/javascript"> let canvasCtx; document.getElementById('capture-btn').addEventListener('click', () => { const videoElm = document.querySelector('#camera-preview'); const hiddenCanv = document.querySelector('#hidden-canvas'); // Set up dimensions of the canvas same as video element. hiddenCanv.width = videoElm.videoWidth; hiddenCanv.height = videoElm.videoHeight; canvasCtx = hiddenCanv.getContext('2d'); // Draw current frame onto offscreen buffer. canvasCtx.drawImage(videoElm, 0, 0); // Convert image data into Base64 string format suitable for transmission over network protocols like JSON-RPC or RESTful APIs. const imgDataUrl = hiddenCanv.toDataURL(); sendImageDataToServer(imgDataUrl); }); function sendImageDataToServer(base64String){ /* Implement your own logic here */ } </script> ``` - **发送数据并与服务交互** 将捕捉到的照片编码后的文本串封装进 POST 请求体里提交上去等待回应结果。注意此处应当参照所选服务商给出的具体参数规格说明进行组装拼接,一般会涉及到 actionType(指定操作类型), groupIdList(目标分组标识符集合), qualityControlLevel(质量控制等级设定)等字段选项。 ```javascript async function detectFace(imageBase64Str) { const response = await fetch('/path/to/api/endpoint', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ Action: "SearchFaces", ImageURL: imageBase64Str, GroupIdList: ["default"], QualityControl: "NORMAL" }) }); if (!response.ok) throw Error(response.statusText); return await response.json(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值