vue项目调用摄像头实现拍照功能

目录

1.功能需求
2.API
3.完整代码
4.效果
5.遇到问题

1.功能需求

需求:下面需求图
本来应该使用小程序做,但是为了以后复用考虑,决定使用vue嵌入小程序中。
所以需求就是 调用手机摄像头 实现拍照打卡功能(电脑通用)
在这里插入图片描述

2.API

MediaDevices.getUserMedia()
该 API 会提示用户给予使用媒体输入的许可,媒体输入会产生一个MediaStream,里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道(来自硬件或者虚拟视频源,比如相机、视频采集设备和屏幕共享服务等等)、一个音频轨道(同样来自硬件或虚拟音频源,比如麦克风、A/D转换器等等),也可能是其它轨道类型。

它返回一个 Promise 对象,成功后会 resolve 回调一个 MediaStream 对象。若用户拒绝了使用权限,或者需要的媒体源不可用,Promise 会 reject 回调一个 PermissionDeniedError 或者 NotFoundError。

浏览器会弹出弹窗,询问是否允许使用摄像头

navigator.mediaDevices.getUserMedia(constraints)
.then(function(stream) {/* 用户允许使用摄像头 *//* 使用这个stream stream */
})
.catch(function(err) {/* 不允许使用摄像头 *//* 处理error */
});

constraints 参数介绍:
参数包含了 videoaudio 两个成员的 MediaStreamConstraints 对象,用于说明请求的媒体类型。必须至少一个类型或者两个同时可以被指定。

具体使用参考文档:MediaDevices.getUserMedia()

3.完整代码

完整代码:

<template><div class="publish"><video ref="video"></video><canvas style="display: none" id="canvasCamera" ref="canvas"></canvas><div v-if="imgSrc" class="img_bg_camera"><img :src="imgSrc" class="tx_img" /></div><button @click="OpenCamera">打开摄像头</button><button @click="CloseCamera">关闭摄像头</button><button @click="setImage">拍照</button></div>
</template><script>
export default {data() {return {mediaStreamTrack: {},video_stream: '', // 视频streamimgSrc: '', // 拍照图片canvas: null,context: null,};},mounted() {// 进入页面 自动调用摄像头this.getCamera();},methods: {// 调用打开摄像头功能getCamera() {// 获取 canvas 画布this.canvas = document.getElementById('canvasCamera');this.context = this.canvas.getContext('2d');// 旧版本浏览器可能根本不支持mediaDevices,我们首先设置一个空对象if (navigator.mediaDevices === undefined) {navigator.mediaDevices = {};}// 正常支持版本navigator.mediaDevices.getUserMedia({video: true,//默认前置//video: { facingMode: { exact: "environment" } },//后置}).then((stream) => {// 摄像头开启成功this.mediaStreamTrack = typeof stream.stop === 'function' ? stream : stream.getTracks()[0];this.video_stream = stream;this.$refs.video.srcObject = stream;this.$refs.video.play();}).catch(err => {console.log(err);});},// 拍照 绘制图片setImage() {console.log('拍照');// 点击canvas画图this.context.drawImage(this.$refs.video,0,0,200,100,);// 获取图片base64链接const image = this.canvas.toDataURL('image/png');this.imgSrc = image;this.$emit('refreshDataList', this.imgSrc);},// 打开摄像头OpenCamera() {console.log('打开摄像头');this.getCamera();},// 关闭摄像头CloseCamera() {console.log('关闭摄像头');this.$refs.video.srcObject.getTracks()[0].stop();},},
};
</script><style lang="scss" scoped>
video {width: 100%;height: 300px;
}
canvas {width: 100%;height: 300px;
}
button {width: 100px;height: 40px;position: relative;bottom: 0;left: 0;background-color: rgb(22, 204, 195);
}
.img_bg_camera {img {width: 300px;height: 200px;}
}
</style>

4.效果

只写了简单的摄像头功能点页面,方便大家看代码
有需要在这基础上修改样式就好了

5.遇到问题

1.navigator.mediaDevices 为 undefined
原因:navigator.mediaDevices在目前以下三种情况下可以获取到

1.地址为localhost:// 访问时
2.地址为https:// 时
3.为文件访问file:///

解决:因为我这里需要用手机访问,所以只能不能使用localhost,就采取修改chrome浏览器的安全策略
①.在chrome浏览器的地址栏中输入: chrome://flags/#unsafely-treat-insecure-origin-as-secure,将该 Disabled 切换成 enable 状态;
②.在输入框中填写需要开启的域名或地址(带上端口号),如果有多个,则以逗号分隔;
在这里插入图片描述
③.重启浏览器生效

其他解决方式:关于navigator.mediaDevices为undefined,获取不到媒体权限的问题

2.电脑可以启用摄像头,手机不行
1.因为我是使用微信二维码扫码预览,一直无法进入navigator.mediaDevices .getUserMedia()方法,无法打开摄像头,后面采用网址的方式预览,换了其他浏览器才可以

参考:
https://jsrun.net/5j6Kp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/693694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网平台构成与边缘计算

物联网平台 物联网平台系统通常由以下组件构成&#xff1a; 物联网设备&#xff1a; 这些是连接到物联网平台的传感器、设备或物品。它们可以是各种物联网设备&#xff0c;如传感器、执行器、智能设备等。 通信协议&#xff1a; 物联网设备使用各种通信协议与物联网平台进行通…

介绍一下scrapy中items.py,middlerwares.py,pipelines.py,settings.py的作用与简单示例。

在Scrapy框架中&#xff0c;items.py、middlewares.py、pipelines.py和settings.py都是用于实现不同功能的重要模块。以下是它们的作用和一些常见示例&#xff1a; items.py items.py 文件定义了你的项目中需要提取的数据的数据结构。每个爬虫项目都可以定义一个或多个Item类…

React 19即将发布,新增4个Hook函数

近日,React 团队发布消息称,不会载发布 v18.3版本了,而是即将重点放在React v19 版本。新版本将退出四个新的 hook——旨在解决 React 中两个常见的痛点:数据获取和表单处理。虽然这些 hook 目前作为实验性 API 在 React 预览版本中可用,但它们预计将成为 React 19 的稳定…

创建谷歌浏览器插件的具体步骤

创建谷歌浏览器&#xff08;Chrome&#xff09;插件需要遵循一系列的步骤。以下是一个基本的指南&#xff0c;用于创建一个简单的Chrome插件&#xff1a; 1. 设置项目文件夹 创建一个新的文件夹&#xff0c;用于存放插件的所有文件。 2. 创建manifest.…

【Redis】Redis的数据分布算法

一共有五种算法&#xff0c;分别为&#xff1a;哈希算法、一致性哈希算法、带有限负载的一致性哈希算法、虚拟节点一致性哈希算法、虚拟槽分区 哈希算法 思想&#xff1a;根据某个key的值或者key 的哈希值与当前可用的 master 节点数取模&#xff0c;根据取模的值获取具体的服…

机器学习 -- 矩阵和向量

场景 在之前的knn算法和余弦算法等算法中&#xff0c;都有很重要的概念&#xff0c;叫做矩阵和向量。这个是机器学习中很重要的概念。今天来深入学习一些矩阵和向量的一些知识。 向量(Vector) 向量是一个有序的数字列表&#xff0c;可以在几何中表示为从原点出发的箭头。在机…

halcon 标定多元点标定板、棋盘格映射矫正图像、矫正失真图像

一、标定多圆孔标定 其理论与棋盘格 和圆孔都是一样的&#xff0c;不一样的地方就是定方向的方式不一样。如图 2、结果 read_image (CalibImage, ./circle/1.png) get_image_size (CalibImage, Width, Height) dev_close_window () dev_open_window_fit_image (CalibImage, 0…

推荐一款Vite中加载svg的小工具

最近开发中使用到一个好玩的Vite三方小插件vite-plugin-svg-icons很实用,可以辅助我们开发过程中快速加载svg小图标。其原理是在Vite编译器的时候通过一次性的DOM操作将SVG插入DOM结构中,然后通过使用内联SVG进行加载访问,极大的方便了我们的小图标引用模式。 若只是少量的s…

PE 资源表-字符串

最近在写PE加载代码&#xff0c;写到LoadStringA时一直找不到字中的ID&#xff0c;网上搜索的资源只分析三层目录&#xff0c;之后的找不相关资料&#xff0c;只好自己分析。 资料显示pe资源表 分三层目录&#xff0c;之后是节点&#xff0c;再指向数据&#xff0c; 第二层的…

“成像光谱遥感技术中的AI革命:ChatGPT应用指南“

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用&#xff0c;人工智…

2024牛客寒假算法基础集训营4(视频讲解题目)

2024牛客寒假算法基础集训营4&#xff08;视频讲解题目&#xff09; 视频链接ABCDEFG、H&#xff08;下面是hard版本的代码两个都可以过&#xff09; 视频链接 2024牛客寒假算法基础集训营4&#xff08;视频讲解题目&#xff09; A #include<bits/stdc.h> #define en…

【教程】N2N V3内网穿透、异地组网,包括Win/Linux/Android,包括不同内网实现adb远程连接

目录 一、背景 二、Linux 配置 并运行 N2N - Supernode (必选) 三、Linux -- 配置 并运行 N2N - 边缘节点配置 Edge(可选步骤) 四、Windows -- 配置 并运行 N2N - 边缘节点配置 Edge (可选步骤) (一)配置 TAP 虚拟网卡 (二)配置 N

C++:C++入门基础

创作不易&#xff0c;感谢三连 &#xff01;&#xff01; 一、什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff…

子网络划分与互通,上网行为审计

网络环境需求:在办公网络环境中,由于公司部门的划分,以及服务器、电脑、手机等设备类型,一般都需要划分多个网段,便于进行网络管理,并提升网络通信效率。各个子网段管理员控制设备的接入,子网段之间需要进行局域网通信,发送消息和文件,通常使用飞秋。服务器网段,禁止…

Java Mybatis面试题解析(下)

15. 说一下Mybatis的一级缓存和二级缓存&#xff1f;【重点】 考核点&#xff1a;Mybatis缓存。 答&#xff1a; Mybatis的一级缓存是指SqlSession&#xff0c;一级缓存的作用域是SqlSession&#xff0c;Mybaits默认开启一级缓存&#xff1b; 在同一个SqlSession中&#xf…

第100讲:MHA+Atlas实现MySQL主从复制读写分离分布式集群

文章目录 1.Atlas读写分离简介2.搭建MHA高可用MySQL主从复制集群3.部署配置Atlas读写分离中间件3.1.安装Atlas读写分离中间件3.2.配置读写分离3.3.启动Atlas读写分离 4.读写分离集群测试5.生产环境中创建一个用户通过Atlas使用6.Atlas通过管理接口实现在线管理7.Atlas自动分表 …

Oracle中TimeStamp和Date的区别

在Oracle数据库中&#xff0c;DATE和TIMESTAMP数据类型都是用于存储日期和时间信息&#xff0c;但它们之间有几个重要的区别&#xff1a; 精度不同&#xff1a; DATE数据类型能存储日期和时间到秒的精度&#xff0c;格式通常是YYYY-MM-DD HH24:MI:SS&#xff0c;并且它总是包含…

华为OD机试真题-开源项目热榜-2023年OD统一考试(C卷)---python免费

题目&#xff1a; 考察内容&#xff1a; 理解题目双排序 代码&#xff1a; """ 题目分析&#xff1a; 计算热度值&#xff0c;进行降序排序&#xff0c;热度值一样&#xff0c;字母小写&#xff0c;字典排序输入&#xff1a; 项目个数N, int 0-100 权重列表…

高企详细流程

一、自我评价 企业根据《认定办法》和《工作指引》进行自我评价&#xff0c;初步判断是否达到认定条件的要求。 二、注册登记 企业登录"高新技术企业认定管理工作网"&#xff0c;按要求填写《企业注册登记表》&#xff0c;并通过网络系统提交至认定机构。认定机构…

快速部署华为云WAF实现Web应用安全防护

通常&#xff0c;用户将web应用暴露在公网上&#xff0c;不做任何准备或者安全措施可能会受到黑客的注入入侵攻击导致网站核心数据被脱库泄露。以及木马上传网页篡改&#xff0c;导致网站公信力受到影响。本文九河云将为您介绍如何通过华为云WAF应用防火墙实现web应用安全防护&…