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 相关文章推荐
10个新的最有前途的JavaScript框架
Mar 12 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
Oct 04 Javascript
使用js画图之画切线
Jan 12 Javascript
js实现图片漂浮效果的方法
Mar 02 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
Aug 24 Javascript
Node.js的文件权限及读写flag详解
Oct 11 Javascript
JS类的定义与使用方法深入探索
Nov 26 Javascript
JavaScript两个变量交换值的实现方法
Mar 01 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
Mar 28 jQuery
javascript设计模式 ? 原型模式原理与应用实例分析
Apr 10 Javascript
解决Nuxt使用axios跨域问题
Jul 06 Javascript
Vue OpenLayer测距功能的实现
Apr 20 Vue.js
在 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
ThinkPHP中html:list标签用法分析
2016/01/09 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
2016/08/05 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
解决element UI 自定义传参的问题
2018/08/22 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
铭万公司.net面试题笔试题
2014/07/20 面试题
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
车工岗位职责
2013/11/26 职场文书
高中政治教学反思
2014/01/18 职场文书
毕业生自我鉴定实例
2014/01/21 职场文书
财务会计自荐信范文
2014/02/21 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
市场营销战略计划书
2014/05/06 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
工程承包协议书
2014/10/20 职场文书
交通事故协议书范本
2014/11/18 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
公司管理制度范本
2015/08/03 职场文书