【js】获取媒体流实现拍照功能,摄像头切换

<script setup>import {onMounted,reactive,ref} from 'vue'const videoConstraints = reactive({width: 500,height: 300});let picArr = reactive([])let videoNode = ref(null)let show = ref(true)let stream = reactive({})onMounted(async () => {// 获取视频流,并用 video 标签播放videoNode.value = document.querySelector('#video');stream = await navigator.mediaDevices.getUserMedia({audio: true,video: videoConstraints});videoNode.value.srcObject = stream;videoNode.value.play();})// 拍照const photo = () => {// 通过canvas捕捉video流,生成base64格式图片const canvas = document.createElement('canvas');const context = canvas.getContext('2d');canvas.width = 500;canvas.height = 300;context.drawImage(videoNode.value, 0, 0, canvas.width, canvas.height);// download(canvas.toDataURL('image/jpeg'));picArr.push(canvas.toDataURL('image/jpeg'))// 下载图片// function download(src) {// 	if (!src) return;// 	const a = document.createElement('a');// 	a.setAttribute('download', new Date());// 	a.href = src;// 	a.click();// }}// 切换镜头const switchs = async () => {show.value = !show.value// enumerateDevices获取所有媒体设备const mediaDevices = await navigator.mediaDevices.enumerateDevices();// 通过设备实例king属性videoinput,过滤获取摄像头设备const videoDevices = mediaDevices.filter(item => item.kind === 'videoinput') || [];console.log(mediaDevices, videoDevices, 'videoDevices')if (show.value) {// 获取前置摄像头const videoDeviceId = videoDevices[0].deviceId;videoConstraints.deviceId = {exact: videoDeviceId}stream = await navigator.mediaDevices.getUserMedia({audio: true,video: videoConstraints});} else {// 获取后置摄像头if (videoDevices[1]) {const videoDeviceId = videoDevices[1].deviceId;videoConstraints.deviceId = {exact: videoDeviceId}stream = await navigator.mediaDevices.getUserMedia({audio: true,video: videoConstraints});}}videoNode.value.srcObject = stream;videoNode.value.play();}const close = async () => {stream.getTracks().forEach(track => track.stop());stream = null;}
</script><template><video id="video" autoplay playsinline muted></video><button @click="photo">拍照</button><button @click="switchs">{{show?'切换至后镜头':'切换至前镜头'}}</button><button @click="close">关闭摄像头设备</button><br /><img v-for="(pic,index) in picArr" :src="pic" :key="index" alt="" />
</template><style scoped>img {width: 500px;}
</style>

在这里插入图片描述

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

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

相关文章

Java面试题:ConcurrentHashMap

ConcurrentHashMap 一种线程安全的高效Map集合 jdk1.7之前 底层采用分段的数组链表实现 一个不可扩容的数组:segment[] 数组中的每个元素都对应一个HashEntry数组用以存放数据 当放入数据时,根据key的哈希值找到对应的segment数组下标 找到下标后就会添加一个reentrantlo…

自动化测试框架怎么选?Robot Framework怎么搭建环境?

本系列文章跟大家分享的内容是Robot Framework从入门到实践的整个过程&#xff0c;首先会简单为大家介绍一下自动化测试框架&#xff0c;包括框架选择、环境搭建、接口自动化等&#xff0c;最后会带大家实际操作一遍&#xff0c;本文我们主要为大家介绍自动化测试框架的不同以及…

c++ 各版本特性介绍

c C是一种高级编程语言&#xff0c;以其强大的功能、灵活性和高效性而闻名。它是由Bjarne Stroustrup在20世纪80年代初期在贝尔实验室开发的&#xff0c;作为C语言的一个扩展。C不仅包含了C语言的所有特性&#xff0c;还引入了面向对象编程&#xff08;OOP&#xff09;的概念&…

Echarts结课之小杨总结版

Echarts结课之小杨总结版 前言基础回顾框架sale框架代码&#xff1a; user框架基础代码&#xff1a; inventory框架基础代码&#xff1a; total框架基础代码&#xff1a; 基础设置1.标题(Title)2.图例(Legend)实现 3.工具提示(Tooltip)实现 4.X轴(X Axis) 和 Y轴(Y Axis)5.数据…

洗地机哪款好用?希亦、追觅、顺造、米家等高品质洗地机推荐

家用洗地机已经成为家庭清洁的重要利器&#xff0c;其多功能性能帮助您轻松应对各种清洁任务&#xff0c;从而保持家居环境的清洁整洁。然而&#xff0c;市场上品牌繁多、功能各异的洗地机让人眼花缭乱。为了帮助大家做出明智的选择&#xff0c;我们将在本文中提供全面的选购指…

linux安装Openresty

安装必要的依赖库 指定仓库地址 下载openresty 添加环境变量 vi /etc/profile i export NGINX_HOME/usr/local/openresty/nginx/ export PATH${NGINX_HOME}/sbin:$PATH esc :wq source /etc/profile #启动 nginx # 重启 nginx -s reload #关闭 nginx -s stop

vue获取路由的值

1&#xff0c;此方法获取到请求地址后面的值 如 /name123&age12 2&#xff0c;此方法获取到请地址&#xff1f;后面的值 例如?name123&age12 二者的区别&#xff0c;第一个是直接在路径后面拼接&#xff0c;第二种就是正规的http请求。 路径带&#xff1f;号的

sql实践

1.从excel导入数据 在excel导入数据时要先在数据库中创建对应的数据库表 CREATE TABLE your_table_name (crawl_datetime DATE,url CHAR(255),company_name CHAR(255),company_size CHAR(255),company_type CHAR(255),job_type CHAR(255),job_name CHAR(255),edu CHAR(255),e…

idea控制台日志控制

1.清除控制台log日志 测试的时候&#xff0c;控制台打印的日志比较多&#xff0c;速度有点慢而且不利于查看运行结果&#xff0c;所以接下来我们把这个日志处理下: 取消初始化spring日志打印&#xff0c;resources目录下添加logback.xml&#xff0c;名称固定&#xff0c;内容如…

springboot月度员工绩效考核管理系统

摘要 本月度员工绩效考核管理系统采用java语言做为代码编写工具&#xff0c;采用mysql数据库进行系统中信息的存储与处理。框架采用springboot。 本系统的功能分为管理员和员工两个角色&#xff0c;管理员的功能有&#xff1a; &#xff08;1&#xff09;个人中心管理功能&am…

平地惊雷,GPT-4o 凌晨震撼发布

GPT-4o 今日凌晨&#xff0c;OpenAI 2024 年春季发布会召开&#xff0c;OpenAI 通过短短 28 分钟的发布会&#xff0c;发布了「再次震惊世界」的 GPT-4o&#xff0c;其中 o 是指 omni&#xff08;全能&#xff09;的意思。 一款「全新交互&#xff08;支持 文本/音频/视频 组合…

PuLID: 图像背景、光线、风格等均保持高度一致图像生成工具,附本地一键包

PuLID是一种无需调优的ID定制方法。PuLID保持了高的ID保真度&#xff0c;同时有效地减少了对原始模型行为的干扰。 只需要提供一张照片&#xff0c;就可以生成高还原度的各种风格的图像。 使用方法&#xff1a;解压一键包&#xff0c;双击一键启动 点击ID图像&#xff08;主…