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 相关文章推荐
JavaScript 提升运行速度之循环篇 译文
Aug 15 Javascript
js限制文本框只能输入数字(正则表达式)
Jul 15 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
Dec 10 Javascript
jquery实现顶部向右伸缩的导航区域代码
Sep 02 Javascript
js去字符串前后空格的实现方法
Feb 26 Javascript
jQuery xml字符串的解析、读取及查找方法
Mar 01 Javascript
JS实现支持Ajax验证的表单插件
Mar 24 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
Apr 29 Javascript
javascript基础知识
Jun 07 Javascript
AngularJS基础 ng-src 指令简单示例
Aug 03 Javascript
vue.js+Echarts开发图表放大缩小功能实例
Jun 09 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
Dec 31 Javascript
在 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
用session做客户验证时的注意事项
2006/10/09 PHP
PHP-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
yii2缓存Caching基本用法示例
2016/07/18 PHP
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
PHP守护进程实例
2015/03/06 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
jQuery事件委托之Safari
2016/07/05 Javascript
详解js中==与===的区别
2017/01/08 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
Python中文编码那些事
2014/06/25 Python
python中base64加密解密方法实例分析
2015/05/16 Python
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
Python用字典构建多级菜单功能
2019/07/11 Python
Python通过递归函数输出嵌套列表元素
2020/10/15 Python
春季防火方案
2014/05/10 职场文书
信息管理专业自荐书
2014/06/05 职场文书
开幕式邀请函
2015/01/31 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
2016年国培研修日志
2015/11/13 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL
聊聊Python String型列表求最值的问题
2022/01/18 Python
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL