html5调用摄像头截图功能


Posted in Javascript onJanuary 18, 2022

关于html5调用音视频等多媒体硬件的API已经很成熟,不过一直找不到机会把这些硬件转化为实际的应用场景,不过近年来随着iot和AI的浪潮,我觉得软硬结合的时机已经成熟。那我们就提前熟悉下怎么操作这些多媒体硬件吧,首先图像识别是其中最热门的应用场景,首先实现调用摄像头以及截图。

demo的效果请看:摄像头截图

API兼容性

核心的api就是navigator.MediaDevices,从caniuse可看出,PC端除了IE,已经没多大问题。移动端新版本浏览器也支持,同时很多项目都已经转向小程序,加上移动端一向紧跟最新标准,问题也不大。接着就是支持度就更好的video标签。最后还有canvas,支持度就更加乐观了。

硬件的获取

使用到的api:enumerateDevices,它返回的是一个promise,结果就是设备列表。设备的对象属性主要包括 deviceId,groupId,kind。其中deviceId,groupId 是设备的标记,可以通过这两个id调用所属的硬件。而kind 顾名思义就是硬件类型了。有了enumerateDevices就可以遍历硬件,同时可以实现选择对应的硬件并调用。

//遍历多媒体硬件
navigator.mediaDevices.enumerateDevices().then(function (devices) {
  console.log(devices);
  /*
  {
    deviceId: ""
    groupId: "8cac2d9a9e5d30a7bfc5a33b9971a3d40a850f7b0f6634b7f41f7dbe1de0a519"
    kind: "audioinput"
    label: ""
  } []
  */
});

调用摄像头

接着开始调用对应的硬件,这里会使用到另一个api,getUserMedia,同样它返回的也是一个promise,结果是一个视频流。有了视频流就好办了,把stream设置到video的srcObject,马上一个视频监控的应用就出来了。

getUserMedia的参数设置比较复杂,具体可参考MDN里面的文档 getUserMedia,我这里设置的是对应的摄像头及视频的尺寸。loadedmetadata事件在元数据(metadata)被加载完成后触发视频播放。

// 调用摄像头,并将流导入video
navigator.mediaDevices.getUserMedia({ 
  video: { groupId, width: 800, height: 600 }
}).then(function (stream) {
    video.srcObject = stream;
    mediaTrack = stream.getTracks()[0];
    video.onloadedmetadata = function (e) {
      video.play();
    };
})
.catch(console.log);

视频的截图

最后就是截取视频画面了,这就用到了canvas的drawImage,这个api不仅支持把canvas对象和image对象渲染进画布,同时还支持video对象,这就完美解决了我们的需求,核心代码如下:

//写入画布,并转换为base64
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
const imgURL = canvas.toDataURL('image/jpeg');

根据需求我们可以把图片数据转换为流或二进制,我这里转换为base64,拿到了数据就可以发挥想象了,tensorflow,机器学习,模式识别,大把的应用场景。

到此这篇关于html5调用摄像头截图的文章就介绍到这了,更多相关html5调用摄像头内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
Javascript 相关文章推荐
给页面渲染时间加速 干掉Dom Level 0 Event
Dec 19 Javascript
jQuery focus和blur事件的应用详解
Jan 26 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
Nov 25 Javascript
js判断复选框是否选中及选中个数的实现代码
May 30 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
Jun 13 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
Aug 25 Javascript
JS实现页面跳转参数不丢失的方法
Nov 28 Javascript
一文让你彻底搞清楚javascript中的require、import与export
Sep 24 Javascript
Vue filter介绍及其使用详解
Oct 21 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
Dec 15 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
Feb 27 Javascript
如何在vue 中引入使用jquery
Nov 10 jQuery
在 HTML 页面中使用 React的场景分析
Jan 18 #Javascript
Element-ui Layout布局(Row和Col组件)的实现
Dec 06 #Vue.js
浅谈JavaScript作用域
Dec 06 #Javascript
JavaScript流程控制(循环)
Dec 06 #Javascript
JavaScript流程控制(分支)
Dec 06 #Javascript
JavaScript实现队列结构过程
Dec 06 #Javascript
JavaScript实现栈结构详细过程
Dec 06 #Javascript
You might like
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
用PHP将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
jQuery标签替换函数replaceWith()的使用例子
2014/08/28 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
用js动态添加html元素,以及属性的简单实例
2016/07/19 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
在python中安装basemap的教程
2018/09/20 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
详解python中index()、find()方法
2019/08/29 Python
Python3 集合set入门基础
2020/02/10 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
某公司面试题
2012/03/05 面试题
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
会议欢迎词范文
2015/01/27 职场文书
护理自荐信
2019/05/14 职场文书
担保书范文
2019/07/09 职场文书
Redis过期数据是否会被立马删除
2022/07/23 Redis